From BATV+24c6cec836529df71b7d+3296+infradead.org+hch@bombadil.srs.infradead.org Sat Sep 1 18:03:37 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q81N3afK194298 for ; Sat, 1 Sep 2012 18:03:36 -0500 X-ASG-Debug-ID: 1346540669-04bdf079000dd70001-NocioJ Received: from bombadil.infradead.org (173-166-109-252-newengland.hfc.comcastbusiness.net [173.166.109.252]) by cuda.sgi.com with ESMTP id V1ZjfUzAbiB0W6CH (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 01 Sep 2012 16:04:30 -0700 (PDT) X-Barracuda-Envelope-From: BATV+24c6cec836529df71b7d+3296+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 173.166.109.252 Received: from hch by bombadil.infradead.org with local (Exim 4.76 #1 (Red Hat Linux)) id 1T7wjq-0004hg-2j; Sat, 01 Sep 2012 23:04:26 +0000 Date: Sat, 1 Sep 2012 19:04:26 -0400 From: Christoph Hellwig To: Sage Weil , Jan Kara Cc: xfs@oss.sgi.com Subject: Re: xfs sb_internal#2 lockdep splat Message-ID: <20120901230425.GA6896@infradead.org> X-ASG-Orig-Subj: Re: xfs sb_internal#2 lockdep splat References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: 173-166-109-252-newengland.hfc.comcastbusiness.net[173.166.109.252] X-Barracuda-Start-Time: 1346540669 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107335 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS I've had some time to look at this issue and it seems to be due to the brand new filesystem freezing code in the VFS which (ab-)uses lockdep in a creative way. In short the XFS code to flush pending delalloc data when running into ENOSPC conditions. I don't understand the fsfreeze code and its usage of lockdep enough to confirm if the warning is correct, but Dave has patches to rip this code path out in the current from and replace it with the VM layer code used by ext4 and btrfs. I suspect that should sort out this issue. On Fri, Aug 31, 2012 at 01:18:34PM -0700, Sage Weil wrote: > This may be old news, but: > > [23405.556763] ====================================================== > [23405.584315] [ INFO: possible circular locking dependency detected ] > [23405.611861] 3.6.0-rc2-ceph-00143-g995fc06 #1 Not tainted > [23405.638127] ------------------------------------------------------- > [23405.638129] fill2/7976 is trying to acquire lock: > [23405.638139] ((&mp->m_flush_work)){+.+.+.}, at: [] wait_on_work+0x0/0x160 > [23405.638140] > [23405.638140] but task is already holding lock: > [23405.638174] (sb_internal#2){.+.+.+}, at: [] xfs_trans_alloc+0x2d/0x50 [xfs] > [23405.638175] > [23405.638175] which lock already depends on the new lock. > [23405.638175] > [23405.638175] > [23405.638175] the existing dependency chain (in reverse order) is: > [23405.638179] > [23405.638179] -> #1 (sb_internal#2){.+.+.+}: > [23405.638183] [] lock_acquire+0xa2/0x140 > [23405.638186] [] mutex_lock_nested+0x4b/0x320 > [23405.638210] [] xfs_icsb_modify_counters+0x119/0x1b0 [xfs] > [23405.638228] [] xfs_reserve_blocks+0x96/0x170 [xfs] > [23405.638252] [] xfs_unmountfs+0x95/0x190 [xfs] > [23405.638268] [] xfs_fs_put_super+0x25/0x70 [xfs] > [23405.638273] [] generic_shutdown_super+0x62/0xf0 > [23405.638276] [] kill_block_super+0x30/0x80 > [23405.638279] [] deactivate_locked_super+0x45/0x70 > [23405.638283] [] deactivate_super+0x4e/0x70 > [23405.638287] [] mntput_no_expire+0x106/0x160 > [23405.638289] [] sys_umount+0x6e/0x3b0 > [23405.638293] [] system_call_fastpath+0x16/0x1b > [23405.638296] > [23405.638296] -> #0 ((&mp->m_flush_work)){+.+.+.}: > [23405.638298] [] __lock_acquire+0x1ac8/0x1b90 > [23405.638301] [] lock_acquire+0xa2/0x140 > [23405.638304] [] wait_on_work+0x41/0x160 > [23405.638307] [] flush_work_sync+0x43/0x90 > [23405.638323] [] xfs_flush_inodes+0x2f/0x40 [xfs] > [23405.638341] [] xfs_create+0x3be/0x640 [xfs] > [23405.638357] [] xfs_vn_mknod+0x8f/0x1c0 [xfs] > [23405.638372] [] xfs_vn_create+0x13/0x20 [xfs] > [23405.638375] [] vfs_create+0xb5/0x120 > [23405.638378] [] do_last+0xda0/0xf00 > [23405.638380] [] path_openat+0xb3/0x4c0 > [23405.638383] [] do_filp_open+0x42/0xa0 > [23405.638386] [] do_sys_open+0x100/0x1e0 > [23405.638389] [] sys_open+0x21/0x30 > [23405.638391] [] system_call_fastpath+0x16/0x1b > [23405.638392] > [23405.638392] other info that might help us debug this: > [23405.638392] > [23405.638393] Possible unsafe locking scenario: > [23405.638393] > [23405.638394] CPU0 CPU1 > [23405.638394] ---- ---- > [23405.638396] lock(sb_internal#2); > [23405.638398] lock((&mp->m_flush_work)); > [23405.638400] lock(sb_internal#2); > [23405.638402] lock((&mp->m_flush_work)); > [23405.638402] > [23405.638402] *** DEADLOCK *** > [23405.638402] > [23405.638404] 3 locks held by fill2/7976: > [23405.638409] #0: (sb_writers#14){.+.+.+}, at: [] mnt_want_write+0x24/0x50 > [23405.638414] #1: (&type->i_mutex_dir_key#9){+.+.+.}, at: [] do_last+0x30b/0xf00 > [23405.638440] #2: (sb_internal#2){.+.+.+}, at: [] xfs_trans_alloc+0x2d/0x50 [xfs] > [23405.638441] > [23405.638441] stack backtrace: > [23405.638443] Pid: 7976, comm: fill2 Not tainted 3.6.0-rc2-ceph-00143-g995fc06 #1 > [23405.638444] Call Trace: > [23405.638448] [] print_circular_bug+0x1fb/0x20c > [23405.638451] [] __lock_acquire+0x1ac8/0x1b90 > [23405.638455] [] ? __mmdrop+0x60/0x90 > [23405.638459] [] ? finish_task_switch+0x10a/0x110 > [23405.638463] [] ? busy_worker_rebind_fn+0x100/0x100 > [23405.638465] [] lock_acquire+0xa2/0x140 > [23405.638468] [] ? busy_worker_rebind_fn+0x100/0x100 > [23405.638472] [] ? _raw_spin_unlock_irq+0x30/0x40 > [23405.638475] [] wait_on_work+0x41/0x160 > [23405.638477] [] ? busy_worker_rebind_fn+0x100/0x100 > [23405.638480] [] ? start_flush_work+0x108/0x180 > [23405.638483] [] ? _raw_spin_unlock_irqrestore+0x3f/0x80 > [23405.638486] [] flush_work_sync+0x43/0x90 > [23405.638488] [] ? trace_hardirqs_on+0xd/0x10 > [23405.638491] [] ? __queue_work+0xe4/0x3b0 > [23405.638509] [] xfs_flush_inodes+0x2f/0x40 [xfs] > [23405.638527] [] xfs_create+0x3be/0x640 [xfs] > [23405.638529] [] ? d_rehash+0x24/0x40 > [23405.638545] [] xfs_vn_mknod+0x8f/0x1c0 [xfs] > [23405.638561] [] xfs_vn_create+0x13/0x20 [xfs] > [23405.638564] [] vfs_create+0xb5/0x120 > [23405.638567] [] do_last+0xda0/0xf00 > [23405.638570] [] path_openat+0xb3/0x4c0 > [23405.638573] [] do_filp_open+0x42/0xa0 > [23405.638577] [] ? do_raw_spin_unlock+0x5d/0xb0 > [23405.638579] [] ? _raw_spin_unlock+0x2b/0x40 > [23405.638582] [] ? alloc_fd+0xd2/0x120 > [23405.638585] [] do_sys_open+0x100/0x1e0 > [23405.638588] [] sys_open+0x21/0x30 > [23405.638590] [] system_call_fastpath+0x16/0x1b > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs ---end quoted text--- From BATV+24c6cec836529df71b7d+3296+infradead.org+hch@bombadil.srs.infradead.org Sat Sep 1 18:07:32 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q81N7Vma194605 for ; Sat, 1 Sep 2012 18:07:31 -0500 X-ASG-Debug-ID: 1346540905-04bdf078ff0dfa0001-NocioJ Received: from bombadil.infradead.org (173-166-109-252-newengland.hfc.comcastbusiness.net [173.166.109.252]) by cuda.sgi.com with ESMTP id vkMmQsD7PPtP1SKC (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO); Sat, 01 Sep 2012 16:08:26 -0700 (PDT) X-Barracuda-Envelope-From: BATV+24c6cec836529df71b7d+3296+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 173.166.109.252 Received: from hch by bombadil.infradead.org with local (Exim 4.76 #1 (Red Hat Linux)) id 1T7wng-00060X-9B; Sat, 01 Sep 2012 23:08:24 +0000 Date: Sat, 1 Sep 2012 19:08:24 -0400 From: Christoph Hellwig To: Mark Tinguely Cc: Dave Chinner , Ben Myers , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: flush workers before stopping log Message-ID: <20120901230824.GB6896@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: flush workers before stopping log References: <20120829134624.316257238@sgi.com> <20120829134628.835024558@sgi.com> <20120830002335.GB15292@dastard> <20120830172549.GG3274@sgi.com> <20120830223504.GE15292@dastard> <5040FF25.1010501@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5040FF25.1010501@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: 173-166-109-252-newengland.hfc.comcastbusiness.net[173.166.109.252] X-Barracuda-Start-Time: 1346540906 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107335 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS On Fri, Aug 31, 2012 at 01:15:01PM -0500, Mark Tinguely wrote: > I see your point on fixing problems in older branches when/if they > are reported by an user. I am not glowing with pride with the patch, > it is something that survived a week of testing that would cause a > panic in a couple hours without the patch. Since we hit this problem > with such frequency, that we wanted to push for a little proactive > attention to prevent future panics. I'd love to see a relatively minimal patch which can also be backported. I also have to say that your patch as-is scares me a bit. Everytime we move the current xfs_sync_init/stop monsters around we created another set of problems. So I'd prefer at least taking the bits from Dave's series that kill these helpers and do individual calls, and only move those that are needed. The other thing that I don't like about the patch is that it causes assymetry in the mount/unmount path by moving the stop into xfs_unmountfs but not the start into xfs_mountfs. That might be needed in some cases, but that should be some detailed comments explaining why. From BATV+24c6cec836529df71b7d+3296+infradead.org+hch@bombadil.srs.infradead.org Sat Sep 1 18:09:24 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q81N9OfM194838 for ; Sat, 1 Sep 2012 18:09:24 -0500 X-ASG-Debug-ID: 1346541019-04cbb0271a0cca0001-NocioJ Received: from bombadil.infradead.org (173-166-109-252-newengland.hfc.comcastbusiness.net [173.166.109.252]) by cuda.sgi.com with ESMTP id keLruYvTxQcBYPoc (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 01 Sep 2012 16:10:19 -0700 (PDT) X-Barracuda-Envelope-From: BATV+24c6cec836529df71b7d+3296+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 173.166.109.252 Received: from hch by bombadil.infradead.org with local (Exim 4.76 #1 (Red Hat Linux)) id 1T7wpX-00075G-AD; Sat, 01 Sep 2012 23:10:19 +0000 Date: Sat, 1 Sep 2012 19:10:19 -0400 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [RFC, PATCH 0/102]: xfs: 3.0.x stable kernel update Message-ID: <20120901231019.GC6896@infradead.org> X-ASG-Orig-Subj: Re: [RFC, PATCH 0/102]: xfs: 3.0.x stable kernel update References: <1345698180-13612-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1345698180-13612-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: 173-166-109-252-newengland.hfc.comcastbusiness.net[173.166.109.252] X-Barracuda-Start-Time: 1346541019 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.70 X-Barracuda-Spam-Status: No, SCORE=0.70 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=COMMA_SUBJECT, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107335 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 COMMA_SUBJECT Subject is like 'Re: FDSDS, this is a subject' 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS I've done a brief look over the patches this week and while I can't spot anything wrong I'm defintively a bit concerned about the amount of churn for a long term stable series. A lot of this does not seem to fit the strict -stable criteria, and given that I've not really seen any major issues with the current 3.0-stable codebase I'm wondering what the guranteed gain vs the status quo is. From BATV+24c6cec836529df71b7d+3296+infradead.org+hch@bombadil.srs.infradead.org Sat Sep 1 18:12:46 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q81NCkSV195254 for ; Sat, 1 Sep 2012 18:12:46 -0500 X-ASG-Debug-ID: 1346541221-04cbb027180ce40001-NocioJ Received: from bombadil.infradead.org (173-166-109-252-newengland.hfc.comcastbusiness.net [173.166.109.252]) by cuda.sgi.com with ESMTP id HBR4sW9e6Fg5lght (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 01 Sep 2012 16:13:41 -0700 (PDT) X-Barracuda-Envelope-From: BATV+24c6cec836529df71b7d+3296+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 173.166.109.252 Received: from hch by bombadil.infradead.org with local (Exim 4.76 #1 (Red Hat Linux)) id 1T7wsk-00078L-42; Sat, 01 Sep 2012 23:13:38 +0000 Date: Sat, 1 Sep 2012 19:13:38 -0400 From: Christoph Hellwig To: Justin Piszcz Cc: linux-kernel@vger.kernel.org, xfs@oss.sgi.com, linux-m@kvack.org Subject: Re: 3.5.2: moving files from xfs/disk -> nfs: radix_tree_lookup_slot+0xe/0x10 Message-ID: <20120901231338.GE6896@infradead.org> X-ASG-Orig-Subj: Re: 3.5.2: moving files from xfs/disk -> nfs: radix_tree_lookup_slot+0xe/0x10 References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: 173-166-109-252-newengland.hfc.comcastbusiness.net[173.166.109.252] X-Barracuda-Start-Time: 1346541221 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 2.10 X-Barracuda-Spam-Status: No, SCORE=2.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC7_SA_HREF_FROM_MISMATCH_TEXT_URIx1_HL, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107335 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 2.00 BSF_SC7_SA_HREF_FROM_MISMATCH_TEXT_URIx1_HL Custom Rule HREF_FROM_MISMATCH_TEXT_URIx1_HL I'd suspect it's something with the actual radix tree code, Ccing linux-mm in case they know more. On Mon, Aug 27, 2012 at 11:00:10AM -0400, Justin Piszcz wrote: > Hi, > > Moving ~276GB of files (mainly large backups) and everything has > seemed to lockup on the client moving data to the server, it is still > in this state.. > > [75716.705697] INFO: task sync:8790 blocked for more than 120 seconds. > [75716.705701] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" > disables this message. > [75716.705703] sync D ffff88040ec54830 0 8790 2141 0x00000000 > [75716.705708] ffff88001fff1d08 0000000000000086 ffffffff81862fc0 > ffff88001fff1fd8 > [75716.705713] ffff88001fff1fd8 0000000000004000 ffff88041d958670 > ffff88040ec54830 > [75716.705716] ffff88001fff1c38 ffffffff812dcaee ffff88001fff1c58 > ffff88001fff1d78 > [75716.705720] Call Trace: > [75716.705729] [] ? radix_tree_lookup_slot+0xe/0x10 > [75716.705733] [] ? find_get_pages_tag+0xc6/0x150 > [75716.705738] [] ? __enqueue_entity+0x70/0x80 > [75716.705742] [] ? __sync_filesystem+0x90/0x90 > [75716.705747] [] schedule+0x24/0x70 > [75716.705751] [] schedule_timeout+0x1a9/0x210 > [75716.705755] [] ? calc_period_shift+0x60/0x60 > [75716.705760] [] ? check_preempt_curr+0x75/0xa0 > [75716.705764] [] wait_for_common+0xc0/0x150 > [75716.705767] [] ? try_to_wake_up+0x280/0x280 > [75716.705770] [] ? __sync_filesystem+0x90/0x90 > [75716.705773] [] wait_for_completion+0x18/0x20 > [75716.705777] [] writeback_inodes_sb_nr+0x77/0xa0 > [75716.705782] [] ? > shrink_dcache_for_umount_subtree+0x111/0x1d0 > [75716.705785] [] writeback_inodes_sb+0x29/0x40 > [75716.705788] [] __sync_filesystem+0x47/0x90 > [75716.705791] [] sync_one_sb+0x1b/0x20 > [75716.705795] [] iterate_supers+0xe1/0xf0 > [75716.705798] [] sys_sync+0x2b/0x60 > [75716.705802] [] system_call_fastpath+0x1a/0x1f > [75836.701197] INFO: task sync:8790 blocked for more than 120 seconds. > > Thoughts? > > Justin. > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs ---end quoted text--- From BATV+24c6cec836529df71b7d+3296+infradead.org+hch@bombadil.srs.infradead.org Sat Sep 1 18:14:26 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q81NEQUa195477 for ; Sat, 1 Sep 2012 18:14:26 -0500 X-ASG-Debug-ID: 1346541321-04cbb0271a0cf10001-NocioJ Received: from bombadil.infradead.org (173-166-109-252-newengland.hfc.comcastbusiness.net [173.166.109.252]) by cuda.sgi.com with ESMTP id Q0HDlj0K9JYPxbes (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 01 Sep 2012 16:15:21 -0700 (PDT) X-Barracuda-Envelope-From: BATV+24c6cec836529df71b7d+3296+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 173.166.109.252 Received: from hch by bombadil.infradead.org with local (Exim 4.76 #1 (Red Hat Linux)) id 1T7wuP-0008AV-8i; Sat, 01 Sep 2012 23:15:21 +0000 Date: Sat, 1 Sep 2012 19:15:21 -0400 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 01/13] xfs: xfs_syncd_stop must die Message-ID: <20120901231521.GA27456@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 01/13] xfs: xfs_syncd_stop must die References: <1346328017-2795-1-git-send-email-david@fromorbit.com> <1346328017-2795-2-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1346328017-2795-2-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: 173-166-109-252-newengland.hfc.comcastbusiness.net[173.166.109.252] X-Barracuda-Start-Time: 1346541321 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107335 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS On Thu, Aug 30, 2012 at 10:00:05PM +1000, Dave Chinner wrote: > From: Dave Chinner > > xfs_syncd_start and xfs_syncd_stop tie a bunch of unrelated > functionailty together that actually have different start and stop > requirements. Kill these functions and open code the start/stop > methods for each of the background functions. > > Subsequent patches will move the start/stop functions around to the > correct places to avoid races and shutdown issues. > > Signed-off-by: Dave Chinner Looks good, Reviewed-by: Christoph Hellwig From BATV+24c6cec836529df71b7d+3296+infradead.org+hch@bombadil.srs.infradead.org Sat Sep 1 18:16:27 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q81NGR8x195828 for ; Sat, 1 Sep 2012 18:16:27 -0500 X-ASG-Debug-ID: 1346541442-04cbb0271b0cff0001-NocioJ Received: from bombadil.infradead.org (173-166-109-252-newengland.hfc.comcastbusiness.net [173.166.109.252]) by cuda.sgi.com with ESMTP id KDyjU1LUSM4IayVz (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 01 Sep 2012 16:17:22 -0700 (PDT) X-Barracuda-Envelope-From: BATV+24c6cec836529df71b7d+3296+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 173.166.109.252 Received: from hch by bombadil.infradead.org with local (Exim 4.76 #1 (Red Hat Linux)) id 1T7wwM-0008D2-3o; Sat, 01 Sep 2012 23:17:22 +0000 Date: Sat, 1 Sep 2012 19:17:22 -0400 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 02/13] xfs: rename the xfs_syncd workqueue Message-ID: <20120901231722.GB27456@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 02/13] xfs: rename the xfs_syncd workqueue References: <1346328017-2795-1-git-send-email-david@fromorbit.com> <1346328017-2795-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1346328017-2795-3-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: 173-166-109-252-newengland.hfc.comcastbusiness.net[173.166.109.252] X-Barracuda-Start-Time: 1346541442 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107335 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS On Thu, Aug 30, 2012 at 10:00:06PM +1000, Dave Chinner wrote: > From: Dave Chinner > > There is nothing "sync" realted to this work queue any more. It is a general > purpose per-filesystem work queue. Rename it appropriately, and remove the > "syncd" naming from various functions. > > Signed-off-by: Dave Chinner With the current leight-weight workqueues I don't see why we'd even want a shared one for the different callers. Let's move the patch until after killing xfs_flush_worker & co, and then add a workqueue for background and the log sync individually. From BATV+24c6cec836529df71b7d+3296+infradead.org+hch@bombadil.srs.infradead.org Sat Sep 1 18:22:49 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q81NMnBS196693 for ; Sat, 1 Sep 2012 18:22:49 -0500 X-ASG-Debug-ID: 1346541823-04cbb0271a0d330001-NocioJ Received: from bombadil.infradead.org (173-166-109-252-newengland.hfc.comcastbusiness.net [173.166.109.252]) by cuda.sgi.com with ESMTP id Fj9bQpFhYD7w50ff (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 01 Sep 2012 16:23:44 -0700 (PDT) X-Barracuda-Envelope-From: BATV+24c6cec836529df71b7d+3296+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 173.166.109.252 Received: from hch by bombadil.infradead.org with local (Exim 4.76 #1 (Red Hat Linux)) id 1T7x2V-0000o9-Nw; Sat, 01 Sep 2012 23:23:43 +0000 Date: Sat, 1 Sep 2012 19:23:43 -0400 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 05/13] xfs: sync work is now only periodic log work Message-ID: <20120901232343.GA31634@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 05/13] xfs: sync work is now only periodic log work References: <1346328017-2795-1-git-send-email-david@fromorbit.com> <1346328017-2795-6-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1346328017-2795-6-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: 173-166-109-252-newengland.hfc.comcastbusiness.net[173.166.109.252] X-Barracuda-Start-Time: 1346541824 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107337 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS On Thu, Aug 30, 2012 at 10:00:09PM +1000, Dave Chinner wrote: > From: Dave Chinner > > The only thing the periodic sync work does now is flush the AIL and > idle the log. These are really functions of the log code, so move > the work to xfs_log.c and rename it appropriately. > > The only wart that this leaves behind is the xfssyncd_centisecs > sysctl, otherwise the xfssyncd is dead. Clean up any comments that > related to xfssyncd to reflect it's passing. FYI: A while ago I looked into folding the work here into xfsaild. While soing the periodic ail push there aka just waking up with a timeout which we did more often anyway at that point was easy, getting the log force / dummy log never really worked out. I think at least the former probably should be dropped here as well. From BATV+24c6cec836529df71b7d+3296+infradead.org+hch@bombadil.srs.infradead.org Sat Sep 1 18:24:02 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q81NO2g6196821 for ; Sat, 1 Sep 2012 18:24:02 -0500 X-ASG-Debug-ID: 1346541897-04cbb027180d440001-NocioJ Received: from bombadil.infradead.org (173-166-109-252-newengland.hfc.comcastbusiness.net [173.166.109.252]) by cuda.sgi.com with ESMTP id Tx6g4gp0mAqM9GCS (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 01 Sep 2012 16:24:57 -0700 (PDT) X-Barracuda-Envelope-From: BATV+24c6cec836529df71b7d+3296+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 173.166.109.252 Received: from hch by bombadil.infradead.org with local (Exim 4.76 #1 (Red Hat Linux)) id 1T7x3g-0000qC-Pp; Sat, 01 Sep 2012 23:24:56 +0000 Date: Sat, 1 Sep 2012 19:24:56 -0400 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 07/13] xfs: xfs_sync_data is redundant. Message-ID: <20120901232456.GB31634@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 07/13] xfs: xfs_sync_data is redundant. References: <1346328017-2795-1-git-send-email-david@fromorbit.com> <1346328017-2795-8-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1346328017-2795-8-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: 173-166-109-252-newengland.hfc.comcastbusiness.net[173.166.109.252] X-Barracuda-Start-Time: 1346541897 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107337 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS On Thu, Aug 30, 2012 at 10:00:11PM +1000, Dave Chinner wrote: > From: Dave Chinner > > We don't do any data writeback from XFS any more - the VFS is > completely responsible for that, including for freeze. We can > replace the remaining caller with the VFS level function that > achieves the same thing, but without conflicting with current > writeback work - writeback_inodes_sb_if_idle(). > > This means we can remove the flush_work and xfs_flush_inodes() - the > VFS functionality completely replaces the internal flush queue for > doing this writeback work in a separate context to avoid stack > overruns.. Are the lock ordering issues with writeback_inodes_sb_if_idle sorted out by now? IIRC it still needs to be switch to a trylock. > - xfs_flush_inodes(ip); > + writeback_inodes_sb_if_idle(VFS_I(ip)->i_sb, > + WB_REASON_FS_FREE_SPACE); I'd prefer to still keep a wrapper for an ugly call like this if we can. From BATV+24c6cec836529df71b7d+3296+infradead.org+hch@bombadil.srs.infradead.org Sat Sep 1 18:26:09 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q81NQ9UD197184 for ; Sat, 1 Sep 2012 18:26:09 -0500 X-ASG-Debug-ID: 1346542024-04cbb0271b0d6d0001-NocioJ Received: from bombadil.infradead.org (173-166-109-252-newengland.hfc.comcastbusiness.net [173.166.109.252]) by cuda.sgi.com with ESMTP id YCwydoxWY8K2xivM (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 01 Sep 2012 16:27:04 -0700 (PDT) X-Barracuda-Envelope-From: BATV+24c6cec836529df71b7d+3296+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 173.166.109.252 Received: from hch by bombadil.infradead.org with local (Exim 4.76 #1 (Red Hat Linux)) id 1T7x5k-0001yp-Ce; Sat, 01 Sep 2012 23:27:04 +0000 Date: Sat, 1 Sep 2012 19:27:04 -0400 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 08/13] xfs: xfs_sync_fsdata is redundant Message-ID: <20120901232704.GC31634@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 08/13] xfs: xfs_sync_fsdata is redundant References: <1346328017-2795-1-git-send-email-david@fromorbit.com> <1346328017-2795-9-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1346328017-2795-9-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: 173-166-109-252-newengland.hfc.comcastbusiness.net[173.166.109.252] X-Barracuda-Start-Time: 1346542024 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107337 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS Looks good, Reviewed-by: Christoph Hellwig From BATV+24c6cec836529df71b7d+3296+infradead.org+hch@bombadil.srs.infradead.org Sat Sep 1 18:26:35 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q81NQZ4X197313 for ; Sat, 1 Sep 2012 18:26:35 -0500 X-ASG-Debug-ID: 1346542050-04cbb027190d770001-NocioJ Received: from bombadil.infradead.org (173-166-109-252-newengland.hfc.comcastbusiness.net [173.166.109.252]) by cuda.sgi.com with ESMTP id FeVkcErEdTBFeqkz (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 01 Sep 2012 16:27:30 -0700 (PDT) X-Barracuda-Envelope-From: BATV+24c6cec836529df71b7d+3296+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 173.166.109.252 Received: from hch by bombadil.infradead.org with local (Exim 4.76 #1 (Red Hat Linux)) id 1T7x6A-0001zG-41; Sat, 01 Sep 2012 23:27:30 +0000 Date: Sat, 1 Sep 2012 19:27:30 -0400 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 09/13] xfs: move xfs_quiesce_attr() into xfs_super.c Message-ID: <20120901232730.GD31634@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 09/13] xfs: move xfs_quiesce_attr() into xfs_super.c References: <1346328017-2795-1-git-send-email-david@fromorbit.com> <1346328017-2795-10-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1346328017-2795-10-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: 173-166-109-252-newengland.hfc.comcastbusiness.net[173.166.109.252] X-Barracuda-Start-Time: 1346542050 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107337 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS Looks good, Reviewed-by: Christoph Hellwig From BATV+24c6cec836529df71b7d+3296+infradead.org+hch@bombadil.srs.infradead.org Sat Sep 1 18:27:37 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q81NRb4l197433 for ; Sat, 1 Sep 2012 18:27:37 -0500 X-ASG-Debug-ID: 1346542112-04cbb027190d920001-NocioJ Received: from bombadil.infradead.org (173-166-109-252-newengland.hfc.comcastbusiness.net [173.166.109.252]) by cuda.sgi.com with ESMTP id ytE7bDg9a3l9PmJh (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 01 Sep 2012 16:28:32 -0700 (PDT) X-Barracuda-Envelope-From: BATV+24c6cec836529df71b7d+3296+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 173.166.109.252 Received: from hch by bombadil.infradead.org with local (Exim 4.76 #1 (Red Hat Linux)) id 1T7x7A-00020w-45; Sat, 01 Sep 2012 23:28:32 +0000 Date: Sat, 1 Sep 2012 19:28:32 -0400 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 06/13] xfs: Bring some sanity to log unmounting Message-ID: <20120901232832.GE31634@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 06/13] xfs: Bring some sanity to log unmounting References: <1346328017-2795-1-git-send-email-david@fromorbit.com> <1346328017-2795-7-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1346328017-2795-7-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: 173-166-109-252-newengland.hfc.comcastbusiness.net[173.166.109.252] X-Barracuda-Start-Time: 1346542112 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107337 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS Looks good, Reviewed-by: Christoph Hellwig From BATV+24c6cec836529df71b7d+3296+infradead.org+hch@bombadil.srs.infradead.org Sat Sep 1 18:28:27 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q81NSR4P197549 for ; Sat, 1 Sep 2012 18:28:27 -0500 X-ASG-Debug-ID: 1346542161-04bdf078ff0ee00001-NocioJ Received: from bombadil.infradead.org (173-166-109-252-newengland.hfc.comcastbusiness.net [173.166.109.252]) by cuda.sgi.com with ESMTP id mYbMcm2ja7HHBtYD (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 01 Sep 2012 16:29:22 -0700 (PDT) X-Barracuda-Envelope-From: BATV+24c6cec836529df71b7d+3296+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 173.166.109.252 Received: from hch by bombadil.infradead.org with local (Exim 4.76 #1 (Red Hat Linux)) id 1T7x7x-00021Z-HC; Sat, 01 Sep 2012 23:29:21 +0000 Date: Sat, 1 Sep 2012 19:29:21 -0400 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 10/13] xfs: xfs_quiesce_attr() should quiesce the log like unmount Message-ID: <20120901232921.GF31634@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 10/13] xfs: xfs_quiesce_attr() should quiesce the log like unmount References: <1346328017-2795-1-git-send-email-david@fromorbit.com> <1346328017-2795-11-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1346328017-2795-11-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: 173-166-109-252-newengland.hfc.comcastbusiness.net[173.166.109.252] X-Barracuda-Start-Time: 1346542162 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107337 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS Looks good, Reviewed-by: Christoph Hellwig From BATV+24c6cec836529df71b7d+3296+infradead.org+hch@bombadil.srs.infradead.org Sat Sep 1 18:29:08 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q81NT81r197651 for ; Sat, 1 Sep 2012 18:29:08 -0500 X-ASG-Debug-ID: 1346542203-04cb6c23620f4f0001-NocioJ Received: from bombadil.infradead.org (173-166-109-252-newengland.hfc.comcastbusiness.net [173.166.109.252]) by cuda.sgi.com with ESMTP id 0tgOf9zZYHLdMuex (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 01 Sep 2012 16:30:03 -0700 (PDT) X-Barracuda-Envelope-From: BATV+24c6cec836529df71b7d+3296+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 173.166.109.252 Received: from hch by bombadil.infradead.org with local (Exim 4.76 #1 (Red Hat Linux)) id 1T7x8d-0002Yg-00; Sat, 01 Sep 2012 23:30:03 +0000 Date: Sat, 1 Sep 2012 19:30:02 -0400 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 11/13] xfs: rename xfs_sync.[ch] to xfs_icache.[ch] Message-ID: <20120901233002.GG31634@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 11/13] xfs: rename xfs_sync.[ch] to xfs_icache.[ch] References: <1346328017-2795-1-git-send-email-david@fromorbit.com> <1346328017-2795-12-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1346328017-2795-12-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: 173-166-109-252-newengland.hfc.comcastbusiness.net[173.166.109.252] X-Barracuda-Start-Time: 1346542203 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107337 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS Looks good, Reviewed-by: Christoph Hellwig From BATV+24c6cec836529df71b7d+3296+infradead.org+hch@bombadil.srs.infradead.org Sat Sep 1 18:29:45 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q81NTj9A197815 for ; Sat, 1 Sep 2012 18:29:45 -0500 X-ASG-Debug-ID: 1346542240-04cb6c23610f590001-NocioJ Received: from bombadil.infradead.org (173-166-109-252-newengland.hfc.comcastbusiness.net [173.166.109.252]) by cuda.sgi.com with ESMTP id MdEefJ2nZK1jh1PJ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 01 Sep 2012 16:30:40 -0700 (PDT) X-Barracuda-Envelope-From: BATV+24c6cec836529df71b7d+3296+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 173.166.109.252 Received: from hch by bombadil.infradead.org with local (Exim 4.76 #1 (Red Hat Linux)) id 1T7x9E-00032X-4m; Sat, 01 Sep 2012 23:30:40 +0000 Date: Sat, 1 Sep 2012 19:30:40 -0400 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 12/13] xfs: move inode locking functions to xfs_inode.c Message-ID: <20120901233040.GH31634@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 12/13] xfs: move inode locking functions to xfs_inode.c References: <1346328017-2795-1-git-send-email-david@fromorbit.com> <1346328017-2795-13-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1346328017-2795-13-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: 173-166-109-252-newengland.hfc.comcastbusiness.net[173.166.109.252] X-Barracuda-Start-Time: 1346542240 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107337 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS On Thu, Aug 30, 2012 at 10:00:16PM +1000, Dave Chinner wrote: > From: Dave Chinner > > xfs_ilock() and friends really aren't related to the inode cache in > any way, so move them to xfs_inode.c with all the other inode > related functionality. > > While doing this move, move the xfs_ilock() tracepoints to *before* > the lock is taken so that when a hang on a lock occurs we have > events to indicate which process and what inode we were trying to > lock when the hang occurred. This is much better than the current > silence we get on a hang... Looks good. Reviewed-by: Christoph Hellwig From BATV+24c6cec836529df71b7d+3296+infradead.org+hch@bombadil.srs.infradead.org Sat Sep 1 18:30:39 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q81NUdhu197949 for ; Sat, 1 Sep 2012 18:30:39 -0500 X-ASG-Debug-ID: 1346542294-04cb6c23630f660001-NocioJ Received: from bombadil.infradead.org (173-166-109-252-newengland.hfc.comcastbusiness.net [173.166.109.252]) by cuda.sgi.com with ESMTP id ILsRXWfuNHSLyEVt (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 01 Sep 2012 16:31:34 -0700 (PDT) X-Barracuda-Envelope-From: BATV+24c6cec836529df71b7d+3296+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 173.166.109.252 Received: from hch by bombadil.infradead.org with local (Exim 4.76 #1 (Red Hat Linux)) id 1T7xA6-00033r-5m; Sat, 01 Sep 2012 23:31:34 +0000 Date: Sat, 1 Sep 2012 19:31:34 -0400 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 13/13] xfs: remove xfs_iget.c Message-ID: <20120901233134.GI31634@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 13/13] xfs: remove xfs_iget.c References: <1346328017-2795-1-git-send-email-david@fromorbit.com> <1346328017-2795-14-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1346328017-2795-14-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: 173-166-109-252-newengland.hfc.comcastbusiness.net[173.166.109.252] X-Barracuda-Start-Time: 1346542294 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107337 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS Looks good, Reviewed-by: Christoph Hellwig From david@fromorbit.com Sat Sep 1 19:36:41 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q820afsx205425 for ; Sat, 1 Sep 2012 19:36:41 -0500 X-ASG-Debug-ID: 1346546254-04cbb0271810b10001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id r6UaF8goh6mGuxsU for ; Sat, 01 Sep 2012 17:37:35 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ArsNABqqQlB5LD8U/2dsb2JhbABEhRy1AAEBAn+BCIIgAQEEAScTHB4FBQsIAw4KLhQlAyETiAcFp1KTBBSKeS9hfDSEYwOVWIk0hmeCdQ Received: from ppp121-44-63-20.lns20.syd6.internode.on.net (HELO dastard) ([121.44.63.20]) by ipmail07.adl2.internode.on.net with ESMTP; 02 Sep 2012 10:07:32 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1T7yBv-0001MP-I0; Sun, 02 Sep 2012 10:37:31 +1000 Date: Sun, 2 Sep 2012 10:37:31 +1000 From: Dave Chinner To: Christoph Hellwig Cc: Sage Weil , Jan Kara , xfs@oss.sgi.com Subject: Re: xfs sb_internal#2 lockdep splat Message-ID: <20120902003731.GK15292@dastard> X-ASG-Orig-Subj: Re: xfs sb_internal#2 lockdep splat References: <20120901230425.GA6896@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20120901230425.GA6896@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1346546254 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107340 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat, Sep 01, 2012 at 07:04:26PM -0400, Christoph Hellwig wrote: > I've had some time to look at this issue and it seems to be due to the > brand new filesystem freezing code in the VFS which (ab-)uses lockdep > in a creative way. Yes. It's interacting strangely with other lockdep abuses like the work queue annotations, which is where this one is coming from. Basically, freeze counters and work queue flushes are *not locks*, but lockdep is being told they are locks and it's not smart enough to know the difference. It just sees different orders in different contexts and complains. > In short the XFS code to flush pending delalloc data when running into > ENOSPC conditions. I don't understand the fsfreeze code and its usage > of lockdep enough to confirm if the warning is correct, but Dave has > patches to rip this code path out in the current from and replace it > with the VM layer code used by ext4 and btrfs. I suspect that should > sort out this issue. Right, after a couple of days of thinking, I think the root of the issue is that lockdep sees that the data writeback done by the xfs_flush_worker can run transactions, but does so while holding an open transaction. So we have a wait synchronous with an open transaction that is dependent on other transactions being started. However, this is a false positive warning because of freeze behaviour (context) that lockdep is not aware of and cannot be told about. That is, the inode flush will always be completed before the freeze can progress past the FREEZE_WRITE stage, and the transactions are in the FREEZE_FS context. IOWs: > > [23405.638393] Possible unsafe locking scenario: > > [23405.638393] > > [23405.638394] CPU0 CPU1 > > [23405.638394] ---- ---- > > [23405.638396] lock(sb_internal#2); > > [23405.638398] lock((&mp->m_flush_work)); > > [23405.638400] lock(sb_internal#2); > > [23405.638402] lock((&mp->m_flush_work)); ignores the fact the CPU0 lock order is actually: lock(sb_internal#0); << FREEZE_WRITE lock(sb_internal#2); << FREEZE_FS lock((&mp->m_flush_work)); And that it is safe to do any sort of dependent lock of sb_internal#2 while a sb_internal#0 lock is held and that nested dependent sb_internal#2 lock levels is also safe for the same reason. Inversions/nesting of FREEZE_FS only matter outside FREEZE_WRITE/FREEZE_PAGECACHE context, not when they are inside that context. Indeed, changing the code to use the VFS flush functions doesn't change this at all - we still block waiting for IO submission and hence allocation transactions whilst holding the same "locks". We'll just avoid lockdep false positives because the VFS writeback code doesn't use the workqueue infrastructure and hence has no lockdep annotations to make waiting for the IO submission look like a lock... Cheers, Dave. -- Dave Chinner david@fromorbit.com From SRS0=+ghBfN=HB=performance-computing.net=chin_gim_leong@eigbox.net Sun Sep 2 11:13:07 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.5 required=5.0 tests=BAYES_00,HTML_MESSAGE, J_CHICKENPOX_21,J_CHICKENPOX_26,J_CHICKENPOX_28,J_CHICKENPOX_45 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q82GD6Mp053191 for ; Sun, 2 Sep 2012 11:13:06 -0500 X-ASG-Debug-ID: 1346602439-04bdf078fd4f060001-NocioJ Received: from bosmailout18.eigbox.net (bosmailout18.eigbox.net [66.96.185.18]) by cuda.sgi.com with ESMTP id c08VIV1unGxA3w6G for ; Sun, 02 Sep 2012 09:13:59 -0700 (PDT) X-Barracuda-Envelope-From: SRS0=+ghBfN=HB=performance-computing.net=chin_gim_leong@eigbox.net X-Barracuda-Apparent-Source-IP: 66.96.185.18 Received: from bosmailscan07.eigbox.net ([10.20.15.7]) by bosmailout18.eigbox.net with esmtp (Exim) id 1T8CoB-0003kN-68 for xfs@oss.sgi.com; Sun, 02 Sep 2012 12:13:59 -0400 Received: from bosimpout01.eigbox.net ([10.20.55.1]) by bosmailscan07.eigbox.net with esmtp (Exim) id 1T8CoA-0000SK-C9; Sun, 02 Sep 2012 12:13:58 -0400 Received: from boswebmail19.eigbox.net ([10.20.16.19]) by bosimpout01.eigbox.net with NO UCE id uGDy1j0030Qgf6q01GDypC; Sun, 02 Sep 2012 12:13:58 -0400 X-Authority-Analysis: v=2.0 cv=aPZHX8Bm c=1 sm=1 a=QUaCDSpbx6vPDnBFWpxy0Q==:17 a=Q7zus9ReCAYA:10 a=-regzUHIAxsA:10 a=k2FM3C2XuUEA:10 a=a03xZf5PAAAA:8 a=qwWS_V2vAAAA:8 a=NQpEvT9wKAcA:10 a=XElVfGhnnywA:10 a=WTlkKw1vF6EA:10 a=dxnEqHVAQWQA:10 a=7-415B0cAAAA:8 a=kpcCr4VeYSmBHS8VY-8A:9 a=FtYAf7_czLgA:10 a=SaJ7GJPj3t81LH7PNmwA:9 a=wPNLvfGTeEIA:10 a=X9iDbq8nyJTUgZG43icA:9 a=EEp7LP8PA-kzCwqAGZMA:9 a=86Dvy1cSk51EBVuo8qIA:9 a=rd3JUtFuDlIA:10 a=DPKz8Ktvw3lBfpe5:21 a=4YkgK4h5yTW4MBL6:21 a=RM_FhXHPCMJLUYZI:21 a=3zy95VULoO95m_EV:21 a=LDGJMMwwxOOt5cKrpNfyOw==:117 X-EN-OrigOutIP: 10.20.16.19 X-EN-IMPSID: uGDy1j0030Qgf6q01GDypC Received: from [127.0.0.1] (helo=emailmg.netfirms.com) by boswebmail19.eigbox.net with esmtp (Exim) id 1T8CnJ-0005LO-CE; Sun, 02 Sep 2012 12:13:05 -0400 Received: from 59.189.114.42 (SquirrelMail authenticated user CHIN_Gim_Leong@performance-computing.net) by emailmg.netfirms.com with HTTP; Mon, 3 Sep 2012 00:13:05 +0800 Message-ID: <0a1f3a3e331f28a9fb81973dc0893fb5.squirrel@emailmg.netfirms.com> Date: Mon, 3 Sep 2012 00:13:05 +0800 Subject: Re: XFS Mount Recovery Failed on Root File System After Power Outage From: "Chin Gim Leong" X-ASG-Orig-Subj: Re: XFS Mount Recovery Failed on Root File System After Power Outage To: "Dave Chinner" Cc: xfs@oss.sgi.com User-Agent: SquirrelMail/1.4.19 MIME-Version: 1.0 Content-Type: multipart/mixed;boundary="----=_20120903001305_82642" X-Priority: 3 (Normal) Importance: Normal Sender: "Chin Gim Leong" X-Barracuda-Connect: bosmailout18.eigbox.net[66.96.185.18] X-Barracuda-Start-Time: 1346602439 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107403 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.00 HTML_MESSAGE BODY: HTML included in message ------=_20120903001305_82642 Content-Type: multipart/alternative; boundary="8601fsu_trap_24628_50310030902102_=----" --8601fsu_trap_24628_50310030902102_=---- Content-Type: text/plain Content-Transfer-Encoding: 8bit Hi Dave I did the "xfs_repair -L" on the root file system; xfs_repair is version 3.1.8.  The repair was successful. > You misunderstood. I was asking for the messages when it > successfully mounts and the contents of /proc/mounts is when it is mounted to see if barriers were disabled or not supported on your hardware. > The notebook is Acer Aspire 6530G, AMD Turion X2 RM-74, chipset is AMD M780G, southbridge is AMD SB 700.  The hard drive is Western Digital Scorpio Black SATA 320 GB, WDC WD3200BEKT-00F3T0, /dev/sdb chingl@rat:~> cat /etc/fstab                                                                                                                                                                    /dev/disk/by-path/pci-0000:00:11.0-scsi-1:0:0:0-part1 swap                 swap       defaults              0 0                                                                                 /dev/disk/by-path/pci-0000:00:11.0-scsi-1:0:0:0-part2 /                    xfs        defaults,logbufs=8,logbsize=256k              1 1                                                         /dev/disk/by-path/pci-0000:00:11.0-scsi-1:0:0:0-part3 /home                xfs        defaults,logbufs=8,logbsize=256k              1 2 /dev/disk/by-path/pci-0000:00:11.0-scsi-0:0:0:0-part2 /windows/C           ntfs-3g    users,gid=users,fmask=133,dmask=022,locale=en_US.UTF-8 0 0 /dev/disk/by-path/pci-0000:00:11.0-scsi-0:0:0:0-part3 /windows/D           ntfs-3g    users,gid=users,fmask=133,dmask=022,locale=en_US.UTF-8 0 0 proc                 /proc                proc       defaults              0 0 sysfs                /sys                 sysfs      noauto                0 0 debugfs              /sys/kernel/debug    debugfs    noauto                0 0 usbfs                /proc/bus/usb        usbfs      noauto                0 0 devpts               /dev/pts             devpts     mode=0620,gid=5       0 0 chingl@rat:~> chingl@rat:~> cat /proc/mounts rootfs / rootfs rw 0 0 devtmpfs /dev devtmpfs rw,relatime,size=1761184k,nr_inodes=440296,mode=755 0 0 tmpfs /dev/shm tmpfs rw,relatime 0 0 devpts /dev/pts devpts rw,relatime,gid=5,mode=620,ptmxmode=000 0 0 /dev/sdb2 / xfs rw,relatime,attr2,logbufs=8,logbsize=256k,noquota 0 0 proc /proc proc rw,relatime 0 0 sysfs /sys sysfs rw,relatime 0 0 debugfs /sys/kernel/debug debugfs rw,relatime 0 0 /dev/sdb3 /home xfs rw,relatime,attr2,logbufs=8,logbsize=256k,noquota 0 0 fusectl /sys/fs/fuse/connections fusectl rw,relatime 0 0 securityfs /sys/kernel/security securityfs rw,relatime 0 0 none /proc/sys/fs/binfmt_misc binfmt_misc rw,relatime 0 0 none /var/lib/ntp/proc proc ro,nosuid,nodev,relatime 0 0 gvfs-fuse-daemon /home/chingl/.gvfs fuse.gvfs-fuse-daemon rw,nosuid,nodev,relatime,user_id=1000,group_id=100 0 0 chingl@rat:~> >From /var/log/boot.msg:   <6>[    1.084085] ata3: SATA link down (SStatus 0 SControl 300)   <6>[    1.084172] ata4: SATA link down (SStatus 0 SControl 300)   <3>[    1.256058] ata2: softreset failed (device not ready)   <4>[    1.256067] ata2: applying SB600 PMP SRST workaround and retrying   <3>[    1.256084] ata1: softreset failed (device not ready)   <4>[    1.256095] ata1: applying SB600 PMP SRST workaround and retrying   <6>[    1.428069] ata2: SATA link up 3.0 Gbps (SStatus 123 SControl 300)   <6>[    1.428097] ata1: SATA link up 3.0 Gbps (SStatus 123 SControl 300)   <6>[    1.429454] ata1.00: ATA-8: Hitachi HTS543232L9A300, FB4OC40C, max UDMA/133   <6>[    1.429458] ata1.00: 625142448 sectors, multi 16: LBA48 NCQ (depth 31/32), AA   <6>[    1.430923] ata1.00: configured for UDMA/133   <5>[    1.431164] scsi 0:0:0:0: Direct-Access     ATA      Hitachi HTS54323 FB4O PQ: 0 ANSI: 5   <5>[    1.431560] sd 0:0:0:0: [sda] 625142448 512-byte logical blocks: (320 GB/298 GiB)   <5>[    1.431672] sd 0:0:0:0: [sda] Write Protect is off   <7>[    1.431675] sd 0:0:0:0: [sda] Mode Sense: 00 3a 00 00   <5>[    1.431915] sd 0:0:0:0: [sda] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA   <6>[    1.441064] ata2.00: ATA-8: WDC WD3200BEKT-00F3T0, 11.01A11, max UDMA/133   <6>[    1.441067] ata2.00: 625142448 sectors, multi 16: LBA48 NCQ (depth 31/32), AA   <6>[    1.442978] ata2.00: configured for UDMA/133   <5>[    1.443207] scsi 1:0:0:0: Direct-Access     ATA      WDC WD3200BEKT-0 11.0 PQ: 0 ANSI: 5   <5>[    1.443387] sd 1:0:0:0: [sdb] 625142448 512-byte logical blocks: (320 GB/298 GiB)   <5>[    1.443707] sd 1:0:0:0: [sdb] Write Protect is off   <7>[    1.443710] sd 1:0:0:0: [sdb] Mode Sense: 00 3a 00 00   <5>[    1.443756] sd 1:0:0:0: [sdb] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA   <6>[    1.459438]  sda: sda1 sda2 sda3 sda4   <5>[    1.460197] sd 0:0:0:0: [sda] Attached SCSI disk   <6>[    1.476394] Synaptics Touchpad, model: 1, fw: 6.3, id: 0x12a0b1, caps: 0xa04711/0xa04000/0x0   <6>[    1.481898]  sdb: sdb1 sdb2 sdb3   <5>[    1.482254] sd 1:0:0:0: [sdb] Attached SCSI disk   <6>[    3.201111] SGI XFS with ACLs, security attributes, realtime, large block/inode numbers, no debug enabled   <6>[    3.202279] SGI XFS Quota Management subsystem   <5>[    3.230174] XFS mounting filesystem sdb2   <7>[    3.351323] Ending clean XFS mount for filesystem: sdb2   <5>[   11.865393] XFS mounting filesystem sdb3   <7>[   12.008707] Ending clean XFS mount for filesystem: sdb3 I do not see anything that says barrier is not supported? > Only by looking at them can you know. Regardless of what filesystem you are using, recovery of files and directories from lost+found is the same process. e.g. do an rpm check to see if allteh installed packages are intact. that will narrow down where all your binaries came from. use of strings can also tell you what the binary is. e.g: > Define "really there" when important metadata (i.e. the log) has been corrupted and is not available any more. Indeed, if things like btree splits of merges occurred in the log, and they are > partially written to disk, it's entirely possible that you could lose directory references to inodes that haven't been modified for some time.... > > Remember, like all fsck programs, xfs_repair is a best effort > attempt at correcting the problems found - there are no guarantees given about what it can and can't recover when it runs... > > Dave. > -- > Dave Chinner > david@fromorbit.com > Looking at the messages from xfs_repair, and inspection of /lost+found, the files in it are from /tmp and /etc/NetworkManager/system-connections/Auto eth0 (a session file). I think one of the index.db in /var/cache/man was also affected. I did a "rpm -V -a", thanks for the advice.  I manually inspected every output, paying attention to the missing files and file size or checksum mismatches. There were 5 missing files from two packages, as well as a number of installed files of zero file size.  I have re-installed all of the affected packages. May I know, if it is possible that, due to the loss of the journal log, that some package installed files either go missing, or show zero file size? An aside, the reason I use XFS is that when I was a student, I did my work in a school centre with a cluster of 12 SGI Indigo2 R10000 and 3 SGI O2 R5000.  Due to buggy IRIX 6.2 and earlier releases of IRIX 6.5, 6.5.X, the machines had kernel panics; faulty power supplies (the maintenance was discontinued) also caused stoppages.  On restart, the recovery was always instantaneous, no XFS file system repair was ever done When I built my first computer, it was only natural that I chose XFS, that was SUSE Linux 10.0.  On various versions of SUSE, I have had freezes and power outages, but I have never had to repair file system.  The only time I had ever had to run xfs_repair was when Areca RAID spitted out the WD desktop drives and I had to rescue the RAID, so I was very unprepared for this latest incident. Any way, a big thanks to all those who contributed towards XFS over the years in IRIX and Linux, I could not imagine back in the 90s that in the future I would have a piece of SGI IRIX technology in my own personal computers. GL --8601fsu_trap_24628_50310030902102_=---- Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: 8bit

Hi Dave

I did the "xfs_repair -L" on the root file system; xfs_repair is version 3.1.8.  The repair was successful.

> You misunderstood. I was asking for the messages when it
> successfully mounts and the contents of /proc/mounts is when it is
mounted to see if barriers were disabled or not supported on your
hardware.
>
The notebook is Acer Aspire 6530G, AMD Turion X2 RM-74, chipset is AMD M780G, southbridge is AMD SB 700.  The hard drive is Western Digital Scorpio Black SATA 320 GB, WDC WD3200BEKT-00F3T0, /dev/sdb
chingl@rat:~> cat
/etc/fstab                                                                                                                                                                   

/dev/disk/by-path/pci-0000:00:11.0-scsi-1:0:0:0-part1 swap                 swap       defaults              0
0                                                                                

/dev/disk/by-path/pci-0000:00:11.0-scsi-1:0:0:0-part2 /                    xfs        defaults,logbufs=8,logbsize=256k              1
1                                                        
/dev/disk/by-path/pci-0000:00:11.0-scsi-1:0:0:0-part3 /home                xfs        defaults,logbufs=8,logbsize=256k              1 2
/dev/disk/by-path/pci-0000:00:11.0-scsi-0:0:0:0-part2 /windows/C           ntfs-3g    users,gid=users,fmask=133,dmask=022,locale=en_US.UTF-8 0 0 /dev/disk/by-path/pci-0000:00:11.0-scsi-0:0:0:0-part3 /windows/D           ntfs-3g    users,gid=users,fmask=133,dmask=022,locale=en_US.UTF-8 0 0 proc                 /proc                proc       defaults              0 0
sysfs                /sys                 sysfs      noauto                0 0
debugfs              /sys/kernel/debug    debugfs    noauto                0 0
usbfs                /proc/bus/usb        usbfs      noauto                0 0
devpts               /dev/pts             devpts     mode=0620,gid=5       0 0
chingl@rat:~>
chingl@rat:~> cat /proc/mounts
rootfs / rootfs rw 0 0
devtmpfs /dev devtmpfs rw,relatime,size=1761184k,nr_inodes=440296,mode=755 0 0
tmpfs /dev/shm tmpfs rw,relatime 0 0
devpts /dev/pts devpts rw,relatime,gid=5,mode=620,ptmxmode=000 0 0

/dev/sdb2 / xfs rw,relatime,attr2,logbufs=8,logbsize=256k,noquota 0 0 proc /proc proc rw,relatime 0 0
sysfs /sys sysfs rw,relatime 0 0
debugfs /sys/kernel/debug debugfs rw,relatime 0 0
/dev/sdb3 /home xfs rw,relatime,attr2,logbufs=8,logbsize=256k,noquota 0 0

fusectl /sys/fs/fuse/connections fusectl rw,relatime 0 0
securityfs /sys/kernel/security securityfs rw,relatime 0 0
none /proc/sys/fs/binfmt_misc binfmt_misc rw,relatime 0 0
none /var/lib/ntp/proc proc ro,nosuid,nodev,relatime 0 0
gvfs-fuse-daemon /home/chingl/.gvfs fuse.gvfs-fuse-daemon
rw,nosuid,nodev,relatime,user_id=1000,group_id=100 0 0
chingl@rat:~>

From /var/log/boot.msg:


  <6>[    1.084085] ata3: SATA link down (SStatus 0 SControl 300)
  <6>[    1.084172] ata4: SATA link down (SStatus 0 SControl 300)
  <3>[    1.256058] ata2: softreset failed (device not ready)
  <4>[    1.256067] ata2: applying SB600 PMP SRST workaround and retrying   <3>[    1.256084] ata1: softreset failed (device not ready)
  <4>[    1.256095] ata1: applying SB600 PMP SRST workaround and retrying   <6>[    1.428069] ata2: SATA link up 3.0 Gbps (SStatus 123 SControl 300)   <6>[    1.428097] ata1: SATA link up 3.0 Gbps (SStatus 123 SControl 300)   <6>[    1.429454] ata1.00: ATA-8: Hitachi HTS543232L9A300, FB4OC40C, max UDMA/133
  <6>[    1.429458] ata1.00: 625142448 sectors, multi 16: LBA48 NCQ (depth 31/32), AA
  <6>[    1.430923] ata1.00: configured for UDMA/133
  <5>[    1.431164] scsi 0:0:0:0: Direct-Access     ATA      Hitachi HTS54323 FB4O PQ: 0 ANSI: 5
  <5>[    1.431560] sd 0:0:0:0: [sda] 625142448 512-byte logical blocks: (320 GB/298 GiB)
  <5>[    1.431672] sd 0:0:0:0: [sda] Write Protect is off
  <7>[    1.431675] sd 0:0:0:0: [sda] Mode Sense: 00 3a 00 00
  <5>[    1.431915] sd 0:0:0:0: [sda] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
  <6>[    1.441064] ata2.00: ATA-8: WDC WD3200BEKT-00F3T0, 11.01A11, max UDMA/133
  <6>[    1.441067] ata2.00: 625142448 sectors, multi 16: LBA48 NCQ (depth 31/32), AA
  <6>[    1.442978] ata2.00: configured for UDMA/133
  <5>[    1.443207] scsi 1:0:0:0: Direct-Access     ATA      WDC
WD3200BEKT-0 11.0 PQ: 0 ANSI: 5
  <5>[    1.443387] sd 1:0:0:0: [sdb] 625142448 512-byte logical blocks: (320 GB/298 GiB)
  <5>[    1.443707] sd 1:0:0:0: [sdb] Write Protect is off
  <7>[    1.443710] sd 1:0:0:0: [sdb] Mode Sense: 00 3a 00 00
  <5>[    1.443756] sd 1:0:0:0: [sdb] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
  <6>[    1.459438]  sda: sda1 sda2 sda3 sda4
  <5>[    1.460197] sd 0:0:0:0: [sda] Attached SCSI disk
  <6>[    1.476394] Synaptics Touchpad, model: 1, fw: 6.3, id: 0x12a0b1, caps: 0xa04711/0xa04000/0x0
  <6>[    1.481898]  sdb: sdb1 sdb2 sdb3
  <5>[    1.482254] sd 1:0:0:0: [sdb] Attached SCSI disk



  <6>[    3.201111] SGI XFS with ACLs, security attributes, realtime, large block/inode numbers, no debug enabled
  <6>[    3.202279] SGI XFS Quota Management subsystem
  <5>[    3.230174] XFS mounting filesystem sdb2
  <7>[    3.351323] Ending clean XFS mount for filesystem: sdb2

  <5>[   11.865393] XFS mounting filesystem sdb3
  <7>[   12.008707] Ending clean XFS mount for filesystem: sdb3

I do not see anything that says barrier is not supported?


> Only by looking at them can you know. Regardless of what filesystem you
are using, recovery of files and directories from lost+found is the same process. e.g. do an rpm check to see if allteh installed packages are intact. that will narrow down where all your binaries came from. use of strings can also tell you what the binary is. e.g:

> Define "really there" when important metadata (i.e. the log) has been
corrupted and is not available any more. Indeed, if things like btree splits of merges occurred in the log, and they are
> partially written to disk, it's entirely possible that you could lose
directory references to inodes that haven't been modified for some time....
>
> Remember, like all fsck programs, xfs_repair is a best effort
> attempt at correcting the problems found - there are no guarantees
given about what it can and can't recover when it runs...
>
> Dave.
> --
> Dave Chinner
> david@fromorbit.com
>

Looking at the messages from xfs_repair, and inspection of /lost+found, the files in it are from /tmp and
/etc/NetworkManager/system-connections/Auto eth0 (a session file). I think one of the index.db in /var/cache/man was also affected.


I did a "rpm -V -a", thanks for the advice.  I manually inspected every output, paying attention to the missing files and file size or checksum mismatches.
There were 5 missing files from two packages, as well as a number of installed files of zero file size.  I have re-installed all of the affected packages.


May I know, if it is possible that, due to the loss of the journal log, that some package installed files either go missing, or show zero file size?

An aside, the reason I use XFS is that when I was a student, I did my work in a school centre with a cluster of 12 SGI Indigo2 R10000 and 3 SGI O2 R5000.  Due to buggy IRIX 6.2 and earlier releases of IRIX 6.5, 6.5.X, the machines had kernel panics; faulty power supplies (the maintenance was discontinued) also caused stoppages.  On restart, the recovery was always instantaneous, no XFS file system repair was ever done
When I built my first computer, it was only natural that I chose XFS, that was SUSE Linux 10.0.  On various versions of SUSE, I have had freezes and power outages, but I have never had to repair file system.  The only time I had ever had to run xfs_repair was when Areca RAID spitted out the WD desktop drives and I had to rescue the RAID, so I was very unprepared for this latest incident.

Any way, a big thanks to all those who contributed towards XFS over the years in IRIX and Linux, I could not imagine back in the 90s that in the future I would have a piece of SGI IRIX technology in my own personal computers.

GL

--8601fsu_trap_24628_50310030902102_=------ ------=_20120903001305_82642 Content-Type: text/html; name="untitled-[1.2]" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="untitled-[1.2]" PHA+CkhpIERhdmU8YnIgLz48YnIgLz5JIGRpZCB0aGUgJnF1b3Q7eGZzX3JlcGFpciAtTCZxdW90 OyBvbiB0aGUgcm9vdCBmaWxlIHN5c3RlbTsgeGZzX3JlcGFpciBpcyB2ZXJzaW9uIDMuMS44LqAg VGhlIHJlcGFpciB3YXMgc3VjY2Vzc2Z1bC48YnIgLz48YnIgLz4mZ3Q7IFlvdSBtaXN1bmRlcnN0 b29kLiBJIHdhcyBhc2tpbmcgZm9yIHRoZSBtZXNzYWdlcyB3aGVuIGl0PGJyIC8+Jmd0OyBzdWNj ZXNzZnVsbHkgbW91bnRzIGFuZCB0aGUgY29udGVudHMgb2YgL3Byb2MvbW91bnRzIGlzIHdoZW4g aXQgaXM8YnIgLz5tb3VudGVkIHRvIHNlZSBpZiBiYXJyaWVycyB3ZXJlIGRpc2FibGVkIG9yIG5v dCBzdXBwb3J0ZWQgb24geW91cjxiciAvPmhhcmR3YXJlLjxiciAvPiZndDsgPGJyIC8+VGhlIG5v dGVib29rIGlzIEFjZXIgQXNwaXJlIDY1MzBHLCBBTUQgVHVyaW9uIFgyIFJNLTc0LCBjaGlwc2V0 IGlzIEFNRCBNNzgwRywgc291dGhicmlkZ2UgaXMgQU1EIFNCIDcwMC6gIFRoZSBoYXJkIGRyaXZl IGlzIFdlc3Rlcm4gRGlnaXRhbCBTY29ycGlvIEJsYWNrIFNBVEEgMzIwIEdCLCBXREMgV0QzMjAw QkVLVC0wMEYzVDAsIC9kZXYvc2RiPGJyIC8+Y2hpbmdsQHJhdDp+Jmd0OyBjYXQ8YnIgLz4vZXRj L2ZzdGFioKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoDxi ciAvPjxiciAvPi9kZXYvZGlzay9ieS1wYXRoL3BjaS0wMDAwOjAwOjExLjAtc2NzaS0xOjA6MDow LXBhcnQxIHN3YXCgoKCgoKCgoKCgoKCgoKCgIHN3YXCgoKCgoKAgZGVmYXVsdHOgoKCgoKCgoKCg oKCgIDA8YnIgLz4woKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKA8YnIgLz48YnIgLz4vZGV2L2Rpc2sv YnktcGF0aC9wY2ktMDAwMDowMDoxMS4wLXNjc2ktMTowOjA6MC1wYXJ0MiAvoKCgoKCgoKCgoKCg oKCgoKCgoCB4ZnOgoKCgoKCgIGRlZmF1bHRzLGxvZ2J1ZnM9OCxsb2dic2l6ZT0yNTZroKCgoKCg oKCgoKCgoCAxPGJyIC8+MaCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgIDxiciAvPi9kZXYvZGlzay9ieS1wYXRoL3BjaS0wMDAwOjAwOjExLjAt c2NzaS0xOjA6MDowLXBhcnQzIC9ob21loKCgoKCgoKCgoKCgoKCgIHhmc6CgoKCgoKAgZGVmYXVs dHMsbG9nYnVmcz04LGxvZ2JzaXplPTI1NmugoKCgoKCgoKCgoKCgIDEgMjxiciAvPi9kZXYvZGlz ay9ieS1wYXRoL3BjaS0wMDAwOjAwOjExLjAtc2NzaS0wOjA6MDowLXBhcnQyIC93aW5kb3dzL0Og oKCgoKCgoKCgIG50ZnMtM2egoKAgdXNlcnMsZ2lkPXVzZXJzLGZtYXNrPTEzMyxkbWFzaz0wMjIs bG9jYWxlPWVuX1VTLlVURi04IDAgMCAvZGV2L2Rpc2svYnktcGF0aC9wY2ktMDAwMDowMDoxMS4w LXNjc2ktMDowOjA6MC1wYXJ0MyAvd2luZG93cy9EoKCgoKCgoKCgoCBudGZzLTNnoKCgIHVzZXJz LGdpZD11c2VycyxmbWFzaz0xMzMsZG1hc2s9MDIyLGxvY2FsZT1lbl9VUy5VVEYtOCAwIDAgcHJv Y6CgoKCgoKCgoKCgoKCgoKAgL3Byb2OgoKCgoKCgoKCgoKCgoKAgcHJvY6CgoKCgoCBkZWZhdWx0 c6CgoKCgoKCgoKCgoKAgMCAwPGJyIC8+c3lzZnOgoKCgoKCgoKCgoKCgoKAgL3N5c6CgoKCgoKCg oKCgoKCgoKAgc3lzZnOgoKCgoCBub2F1dG+goKCgoKCgoKCgoKCgoKAgMCAwPGJyIC8+ZGVidWdm c6CgoKCgoKCgoKCgoKAgL3N5cy9rZXJuZWwvZGVidWegoKAgZGVidWdmc6CgoCBub2F1dG+goKCg oKCgoKCgoKCgoKAgMCAwPGJyIC8+dXNiZnOgoKCgoKCgoKCgoKCgoKAgL3Byb2MvYnVzL3VzYqCg oKCgoKAgdXNiZnOgoKCgoCBub2F1dG+goKCgoKCgoKCgoKCgoKAgMCAwPGJyIC8+ZGV2cHRzoKCg oKCgoKCgoKCgoKAgL2Rldi9wdHOgoKCgoKCgoKCgoKAgZGV2cHRzoKCgoCBtb2RlPTA2MjAsZ2lk PTWgoKCgoKAgMCAwPGJyIC8+Y2hpbmdsQHJhdDp+Jmd0OzxiciAvPmNoaW5nbEByYXQ6fiZndDsg Y2F0IC9wcm9jL21vdW50cyA8YnIgLz5yb290ZnMgLyByb290ZnMgcncgMCAwPGJyIC8+ZGV2dG1w ZnMgL2RldiBkZXZ0bXBmcyBydyxyZWxhdGltZSxzaXplPTE3NjExODRrLG5yX2lub2Rlcz00NDAy OTYsbW9kZT03NTUgMCAwPGJyIC8+dG1wZnMgL2Rldi9zaG0gdG1wZnMgcncscmVsYXRpbWUgMCAw PGJyIC8+ZGV2cHRzIC9kZXYvcHRzIGRldnB0cyBydyxyZWxhdGltZSxnaWQ9NSxtb2RlPTYyMCxw dG14bW9kZT0wMDAgMCAwIC9kZXYvc2RiMiAvIHhmcyBydyxyZWxhdGltZSxhdHRyMixsb2didWZz PTgsbG9nYnNpemU9MjU2ayxub3F1b3RhIDAgMCBwcm9jIC9wcm9jIHByb2MgcncscmVsYXRpbWUg MCAwPGJyIC8+c3lzZnMgL3N5cyBzeXNmcyBydyxyZWxhdGltZSAwIDA8YnIgLz5kZWJ1Z2ZzIC9z eXMva2VybmVsL2RlYnVnIGRlYnVnZnMgcncscmVsYXRpbWUgMCAwPGJyIC8+L2Rldi9zZGIzIC9o b21lIHhmcyBydyxyZWxhdGltZSxhdHRyMixsb2didWZzPTgsbG9nYnNpemU9MjU2ayxub3F1b3Rh IDAgMCBmdXNlY3RsIC9zeXMvZnMvZnVzZS9jb25uZWN0aW9ucyBmdXNlY3RsIHJ3LHJlbGF0aW1l IDAgMDxiciAvPnNlY3VyaXR5ZnMgL3N5cy9rZXJuZWwvc2VjdXJpdHkgc2VjdXJpdHlmcyBydyxy ZWxhdGltZSAwIDA8YnIgLz5ub25lIC9wcm9jL3N5cy9mcy9iaW5mbXRfbWlzYyBiaW5mbXRfbWlz YyBydyxyZWxhdGltZSAwIDA8YnIgLz5ub25lIC92YXIvbGliL250cC9wcm9jIHByb2Mgcm8sbm9z dWlkLG5vZGV2LHJlbGF0aW1lIDAgMDxiciAvPmd2ZnMtZnVzZS1kYWVtb24gL2hvbWUvY2hpbmds Ly5ndmZzIGZ1c2UuZ3Zmcy1mdXNlLWRhZW1vbjxiciAvPnJ3LG5vc3VpZCxub2RldixyZWxhdGlt ZSx1c2VyX2lkPTEwMDAsZ3JvdXBfaWQ9MTAwIDAgMDxiciAvPmNoaW5nbEByYXQ6fiZndDs8YnIg Lz48YnIgLz6gICZsdDs2Jmd0O1ugoKAgMS4wODQwODVdIGF0YTM6IFNBVEEgbGluayBkb3duIChT U3RhdHVzIDAgU0NvbnRyb2wgMzAwKTxiciAvPqAgJmx0OzYmZ3Q7W6CgoCAxLjA4NDE3Ml0gYXRh NDogU0FUQSBsaW5rIGRvd24gKFNTdGF0dXMgMCBTQ29udHJvbCAzMDApPGJyIC8+oCAmbHQ7MyZn dDtboKCgIDEuMjU2MDU4XSBhdGEyOiBzb2Z0cmVzZXQgZmFpbGVkIChkZXZpY2Ugbm90IHJlYWR5 KTxiciAvPqAgJmx0OzQmZ3Q7W6CgoCAxLjI1NjA2N10gYXRhMjogYXBwbHlpbmcgU0I2MDAgUE1Q IFNSU1Qgd29ya2Fyb3VuZCBhbmQgcmV0cnlpbmcgoCAmbHQ7MyZndDtboKCgIDEuMjU2MDg0XSBh dGExOiBzb2Z0cmVzZXQgZmFpbGVkIChkZXZpY2Ugbm90IHJlYWR5KTxiciAvPqAgJmx0OzQmZ3Q7 W6CgoCAxLjI1NjA5NV0gYXRhMTogYXBwbHlpbmcgU0I2MDAgUE1QIFNSU1Qgd29ya2Fyb3VuZCBh bmQgcmV0cnlpbmcgoCAmbHQ7NiZndDtboKCgIDEuNDI4MDY5XSBhdGEyOiBTQVRBIGxpbmsgdXAg My4wIEdicHMgKFNTdGF0dXMgMTIzIFNDb250cm9sIDMwMCkgoCAmbHQ7NiZndDtboKCgIDEuNDI4 MDk3XSBhdGExOiBTQVRBIGxpbmsgdXAgMy4wIEdicHMgKFNTdGF0dXMgMTIzIFNDb250cm9sIDMw MCkgoCAmbHQ7NiZndDtboKCgIDEuNDI5NDU0XSBhdGExLjAwOiBBVEEtODogSGl0YWNoaSBIVFM1 NDMyMzJMOUEzMDAsIEZCNE9DNDBDLCBtYXggVURNQS8xMzM8YnIgLz6gICZsdDs2Jmd0O1ugoKAg MS40Mjk0NThdIGF0YTEuMDA6IDYyNTE0MjQ0OCBzZWN0b3JzLCBtdWx0aSAxNjogTEJBNDggTkNR IChkZXB0aCAzMS8zMiksIEFBPGJyIC8+oCAmbHQ7NiZndDtboKCgIDEuNDMwOTIzXSBhdGExLjAw OiBjb25maWd1cmVkIGZvciBVRE1BLzEzMzxiciAvPqAgJmx0OzUmZ3Q7W6CgoCAxLjQzMTE2NF0g c2NzaSAwOjA6MDowOiBEaXJlY3QtQWNjZXNzoKCgoCBBVEGgoKCgoCBIaXRhY2hpIEhUUzU0MzIz IEZCNE8gUFE6IDAgQU5TSTogNTxiciAvPqAgJmx0OzUmZ3Q7W6CgoCAxLjQzMTU2MF0gc2QgMDow OjA6MDogW3NkYV0gNjI1MTQyNDQ4IDUxMi1ieXRlIGxvZ2ljYWwgYmxvY2tzOiAoMzIwIEdCLzI5 OCBHaUIpPGJyIC8+oCAmbHQ7NSZndDtboKCgIDEuNDMxNjcyXSBzZCAwOjA6MDowOiBbc2RhXSBX cml0ZSBQcm90ZWN0IGlzIG9mZjxiciAvPqAgJmx0OzcmZ3Q7W6CgoCAxLjQzMTY3NV0gc2QgMDow OjA6MDogW3NkYV0gTW9kZSBTZW5zZTogMDAgM2EgMDAgMDA8YnIgLz6gICZsdDs1Jmd0O1ugoKAg MS40MzE5MTVdIHNkIDA6MDowOjA6IFtzZGFdIFdyaXRlIGNhY2hlOiBlbmFibGVkLCByZWFkIGNh Y2hlOiBlbmFibGVkLCBkb2Vzbid0IHN1cHBvcnQgRFBPIG9yIEZVQTxiciAvPqAgJmx0OzYmZ3Q7 W6CgoCAxLjQ0MTA2NF0gYXRhMi4wMDogQVRBLTg6IFdEQyBXRDMyMDBCRUtULTAwRjNUMCwgMTEu MDFBMTEsIG1heCBVRE1BLzEzMzxiciAvPqAgJmx0OzYmZ3Q7W6CgoCAxLjQ0MTA2N10gYXRhMi4w MDogNjI1MTQyNDQ4IHNlY3RvcnMsIG11bHRpIDE2OiBMQkE0OCBOQ1EgKGRlcHRoIDMxLzMyKSwg QUE8YnIgLz6gICZsdDs2Jmd0O1ugoKAgMS40NDI5NzhdIGF0YTIuMDA6IGNvbmZpZ3VyZWQgZm9y IFVETUEvMTMzPGJyIC8+oCAmbHQ7NSZndDtboKCgIDEuNDQzMjA3XSBzY3NpIDE6MDowOjA6IERp cmVjdC1BY2Nlc3OgoKCgIEFUQaCgoKCgIFdEQzxiciAvPldEMzIwMEJFS1QtMCAxMS4wIFBROiAw IEFOU0k6IDU8YnIgLz6gICZsdDs1Jmd0O1ugoKAgMS40NDMzODddIHNkIDE6MDowOjA6IFtzZGJd IDYyNTE0MjQ0OCA1MTItYnl0ZSBsb2dpY2FsIGJsb2NrczogKDMyMCBHQi8yOTggR2lCKTxiciAv PqAgJmx0OzUmZ3Q7W6CgoCAxLjQ0MzcwN10gc2QgMTowOjA6MDogW3NkYl0gV3JpdGUgUHJvdGVj dCBpcyBvZmY8YnIgLz6gICZsdDs3Jmd0O1ugoKAgMS40NDM3MTBdIHNkIDE6MDowOjA6IFtzZGJd IE1vZGUgU2Vuc2U6IDAwIDNhIDAwIDAwPGJyIC8+oCAmbHQ7NSZndDtboKCgIDEuNDQzNzU2XSBz ZCAxOjA6MDowOiBbc2RiXSBXcml0ZSBjYWNoZTogZW5hYmxlZCwgcmVhZCBjYWNoZTogZW5hYmxl ZCwgZG9lc24ndCBzdXBwb3J0IERQTyBvciBGVUE8YnIgLz6gICZsdDs2Jmd0O1ugoKAgMS40NTk0 MzhdoCBzZGE6IHNkYTEgc2RhMiBzZGEzIHNkYTQ8YnIgLz6gICZsdDs1Jmd0O1ugoKAgMS40NjAx OTddIHNkIDA6MDowOjA6IFtzZGFdIEF0dGFjaGVkIFNDU0kgZGlzazxiciAvPqAgJmx0OzYmZ3Q7 W6CgoCAxLjQ3NjM5NF0gU3luYXB0aWNzIFRvdWNocGFkLCBtb2RlbDogMSwgZnc6IDYuMywgaWQ6 IDB4MTJhMGIxLCBjYXBzOiAweGEwNDcxMS8weGEwNDAwMC8weDA8YnIgLz6gICZsdDs2Jmd0O1ug oKAgMS40ODE4OThdoCBzZGI6IHNkYjEgc2RiMiBzZGIzPGJyIC8+oCAmbHQ7NSZndDtboKCgIDEu NDgyMjU0XSBzZCAxOjA6MDowOiBbc2RiXSBBdHRhY2hlZCBTQ1NJIGRpc2s8YnIgLz48YnIgLz48 YnIgLz48YnIgLz6gICZsdDs2Jmd0O1ugoKAgMy4yMDExMTFdIFNHSSBYRlMgd2l0aCBBQ0xzLCBz ZWN1cml0eSBhdHRyaWJ1dGVzLCByZWFsdGltZSwgbGFyZ2UgYmxvY2svaW5vZGUgbnVtYmVycywg bm8gZGVidWcgZW5hYmxlZDxiciAvPqAgJmx0OzYmZ3Q7W6CgoCAzLjIwMjI3OV0gU0dJIFhGUyBR dW90YSBNYW5hZ2VtZW50IHN1YnN5c3RlbTxiciAvPqAgJmx0OzUmZ3Q7W6CgoCAzLjIzMDE3NF0g WEZTIG1vdW50aW5nIGZpbGVzeXN0ZW0gc2RiMjxiciAvPqAgJmx0OzcmZ3Q7W6CgoCAzLjM1MTMy M10gRW5kaW5nIGNsZWFuIFhGUyBtb3VudCBmb3IgZmlsZXN5c3RlbTogc2RiMjxiciAvPjxiciAv PqAgJmx0OzUmZ3Q7W6CgIDExLjg2NTM5M10gWEZTIG1vdW50aW5nIGZpbGVzeXN0ZW0gc2RiMzxi ciAvPqAgJmx0OzcmZ3Q7W6CgIDEyLjAwODcwN10gRW5kaW5nIGNsZWFuIFhGUyBtb3VudCBmb3Ig ZmlsZXN5c3RlbTogc2RiMzxiciAvPjxiciAvPkkgZG8gbm90IHNlZSBhbnl0aGluZyB0aGF0IHNh eXMgYmFycmllciBpcyBub3Qgc3VwcG9ydGVkLqAgSW4gZmFjdCwgSSBoYXZlIG5ldmVyIHBlcnNv bmFsbHkgc2VlbiBhIHN5c3RlbSB3aXRoIGEgbWVzc2FnZSB0aGF0IGJhcnJpZXIgaXMgbm90PGJy IC8+c3VwcG9ydGVkLjxiciAvPjxiciAvPiZndDsgT25seSBieSBsb29raW5nIGF0IHRoZW0gY2Fu IHlvdSBrbm93LiBSZWdhcmRsZXNzIG9mIHdoYXQgZmlsZXN5c3RlbSB5b3U8YnIgLz5hcmUgdXNp bmcsIHJlY292ZXJ5IG9mIGZpbGVzIGFuZCBkaXJlY3RvcmllcyBmcm9tIGxvc3QrZm91bmQgaXMg dGhlIHNhbWUgcHJvY2Vzcy4gZS5nLiBkbyBhbiBycG0gY2hlY2sgdG8gc2VlIGlmIGFsbHRlaCBp bnN0YWxsZWQgcGFja2FnZXMgYXJlIGludGFjdC4gdGhhdCB3aWxsIG5hcnJvdyBkb3duIHdoZXJl IGFsbCB5b3VyIGJpbmFyaWVzIGNhbWUgZnJvbS4gdXNlIG9mIHN0cmluZ3MgY2FuIGFsc28gdGVs bCB5b3Ugd2hhdCB0aGUgYmluYXJ5IGlzLiBlLmc6PGJyIC8+PGJyIC8+Jmd0OyBEZWZpbmUgJnF1 b3Q7cmVhbGx5IHRoZXJlJnF1b3Q7IHdoZW4gaW1wb3J0YW50IG1ldGFkYXRhIChpLmUuIHRoZSBs b2cpIGhhcyBiZWVuPGJyIC8+Y29ycnVwdGVkIGFuZCBpcyBub3QgYXZhaWxhYmxlIGFueSBtb3Jl LiAgSW5kZWVkLCBpZiB0aGluZ3MgbGlrZSBidHJlZSBzcGxpdHMgb2YgbWVyZ2VzIG9jY3VycmVk IGluIHRoZSBsb2csIGFuZCB0aGV5IGFyZTxiciAvPiZndDsgcGFydGlhbGx5IHdyaXR0ZW4gdG8g ZGlzaywgaXQncyBlbnRpcmVseSBwb3NzaWJsZSB0aGF0IHlvdSBjb3VsZCBsb3NlPGJyIC8+ZGly ZWN0b3J5IHJlZmVyZW5jZXMgdG8gaW5vZGVzIHRoYXQgaGF2ZW4ndCBiZWVuIG1vZGlmaWVkIGZv ciBzb21lIHRpbWUuLi4uPGJyIC8+Jmd0OyA8YnIgLz4mZ3Q7IFJlbWVtYmVyLCBsaWtlIGFsbCBm c2NrIHByb2dyYW1zLCB4ZnNfcmVwYWlyIGlzIGEgYmVzdCBlZmZvcnQ8YnIgLz4mZ3Q7IGF0dGVt cHQgYXQgY29ycmVjdGluZyB0aGUgcHJvYmxlbXMgZm91bmQgIC0gdGhlcmUgYXJlIG5vIGd1YXJh bnRlZXM8YnIgLz5naXZlbiBhYm91dCB3aGF0IGl0IGNhbiBhbmQgY2FuJ3QgcmVjb3ZlciB3aGVu IGl0IHJ1bnMuLi48YnIgLz4mZ3Q7IDxiciAvPiZndDsgRGF2ZS48YnIgLz4mZ3Q7IC0tPGJyIC8+ Jmd0OyBEYXZlIENoaW5uZXI8YnIgLz4mZ3Q7IGRhdmlkQGZyb21vcmJpdC5jb208YnIgLz4mZ3Q7 IDxiciAvPjxiciAvPkxvb2tpbmcgYXQgdGhlIG1lc3NhZ2VzIGZyb20geGZzX3JlcGFpciwgYW5k IGluc3BlY3Rpb24gb2YgL2xvc3QrZm91bmQsIHRoZSBmaWxlcyBpbiBpdCBhcmUgZnJvbSAvdG1w IGFuZDxiciAvPi9ldGMvTmV0d29ya01hbmFnZXIvc3lzdGVtLWNvbm5lY3Rpb25zL0F1dG8gZXRo MCAoYSBzZXNzaW9uIGZpbGUpLjwvcD48cD5JIHRoaW5rIG9uZSBvZiB0aGUgbWFuIGluZGV4LmRi IGluIGZpbGVzIHdhcyBhbHNvIGFmZmVjdGVkLjwvcD48cD5JIGRpZCBhICZxdW90O3JwbSAtViAt YSZxdW90OywgdGhhbmtzIGZvciB0aGUgYWR2aWNlLqAgSSBtYW51YWxseSBpbnNwZWN0ZWQgZXZl cnkgb3V0cHV0LCBwYXlpbmcgYXR0ZW50aW9uIHRvIHRoZSBtaXNzaW5nIGZpbGVzIGFuZCBmaWxl IHNpemUgb3IgY2hlY2tzdW0gbWlzbWF0Y2hlcy48L3A+PHA+VGhlcmUgd2VyZSA1IG1pc3Npbmcg ZmlsZXMgZnJvbSB0d28gcGFja2FnZXMsIGFzIHdlbGwgYXMgYSBudW1iZXIgb2YgaW5zdGFsbGVk IGZpbGVzIG9mIHplcm8gZmlsZSBzaXplLqAgSSBoYXZlIHJlLWluc3RhbGxlZCBhbGwgb2YgdGhl IGFmZmVjdGVkIHBhY2thZ2VzLjwvcD48cD5NYXkgSSBrbm93LCBpZiBpdCBpcyBwb3NzaWJsZSB0 aGF0LCBkdWUgdG8gdGhlIGxvc3Mgb2YgdGhlIGpvdXJuYWwgbG9nLCB0aGF0IHNvbWUgcGFja2Fn ZWQgaW5zdGFsbGVkIGZpbGVzIGVpdGhlciBnbyBtaXNzaW5nLCBvciBzaG93IHplcm8gZmlsZSBz aXplPzwvcD48cD48L3A+PHA+QW4gYXNpZGUsIHRoZSByZWFzb24gSSB1c2UgWEZTIGlzIHRoYXQg d2hlbiBJIHdhcyBhIHN0dWRlbnQsIEkgZGlkIG15IHdvcmsgaW4gYSBzY2hvb2wgY2VudHJlIHdp dGggYSBjbHVzdGVyIG9mIDEyIFNHSSBJbmRpZ28yIFIxMDAwMCBhbmQgMyBTR0kgTzIgUjUwMDAu oCBEdWUgdG8gYnVnZ3kgSVJJWCA2LjIgYW5kIGVhcmxpZXIgcmVsZWFzZXMgb2YgSVJJWCA2LjUs IDYuNS5YLCB0aGUgbWFjaGluZXMgaGFkIGtlcm5lbCBwYW5pY3M7IGZhdWx0eSBwb3dlciBzdXBw bGllcyAodGhlIG1haW50ZW5hbmNlIHdhcyBkaXNjb250aW51ZWQpIGFsc28gY2F1c2VkIHN0b3Bw YWdlcy6gIE9uIHJlc3RhcnQsIHRoZSByZWNvdmVyeSB3YXMgYWx3YXlzIGluc3RhbnRhbmVvdXMs IG5vIFhGUyBmaWxlIHN5c3RlbSByZXBhaXIgd2FzIGV2ZXIgZG9uZTwvcD48cD5XaGVuIEkgYnVp bHQgbXkgb3duIGNvbXB1dGVyLCBpdCB3YXMgb25seSBuYXR1cmFsIHRoYXQgSSBjaG9zZSBYRlMs IHRoYXQgd2FzIFNVU0UgTGludXggMTAuMC6gIE9uIHZhcmlvdXMgdmVyc2lvbnMgb2YgU1VTRSwg SSBoYXZlIGhhZCBmcmVlemVzIGFuZCBwb3dlciBvdXRhZ2VzLCBidXQgSSBoYXZlIG5ldmVyIGhh ZCB0byByZXBhaXIgZmlsZSBzeXN0ZW0uoCBUaGUgb25seSB0aW1lIEkgaGFkIGV2ZXIgaGFkIHRv IHJ1biB4ZnNfcmVwYWlyIHdhcyB3aGVuIEFyZWNhIFJBSUQgc3BpdHRlZCBvdXQgdGhlIFdEIGRl c2t0b3AgZHJpdmVzIGFuZCBJIGhhZCB0byByZXNjdWUgdGhlIFJBSUQsIHNvIEkgd2FzIHZlcnkg dW5wcmVwYXJlZCBmb3IgdGhpcyBsYXRlc3QgaW5jaWRlbnQuPC9wPjxwPkFueSB3YXksIGEgYmln IHRoYW5rcyB0byBhbGwgdGhvc2Ugd2hvIGNvbnRyaWJ1dGVkIHRvd2FyZHMgWEZTIG92ZXIgdGhl IHllYXJzIGluIElSSVggYW5kIExpbnV4LCBJIGNvdWxkIG5vdCBpbWFnaW5lIGJhY2sgaW4gdGhl IDkwcyB0aGF0IGluIHRoZSBmdXR1cmUgSSB3b3VsZCBoYXZlIGEgcGllY2Ugb2YgU0dJIElSSVgg dGVjaG5vbG9neSBpbiBteSBvd24gcGVyc29uYWwgY29tcHV0ZXJzLjwvcD48cD48L3A+PHA+R0w8 L3A+ ------=_20120903001305_82642 Content-Type: text/html; name="untitled-[1.2]" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="untitled-[1.2]" PHA+PC9wPjxwPjwvcD48cD48L3A+PHA+PC9wPjxwPjwvcD48cD48L3A+CkhpIERhdmU8YnIgLz48 YnIgLz5JIGRpZCB0aGUgeGZzX3JlcGFpciAtTCBvbiB0aGUgcm9vdCBmaWxlIHN5c3RlbTsgeGZz X3JlcGFpciBpcyB2ZXJzaW9uIDMuMS44LqAgVGhlIHJlcGFpciB3YXMgc3VjY2Vzc2Z1bC48YnIg Lz48YnIgLz4mZ3Q7IFlvdSBtaXN1bmRlcnN0b29kLiBJIHdhcyBhc2tpbmcgZm9yIHRoZSBtZXNz YWdlcyB3aGVuIGl0PGJyIC8+Jmd0OyBzdWNjZXNzZnVsbHkgbW91bnRzIGFuZCB0aGUgY29udGVu dHMgb2YgL3Byb2MvbW91bnRzIGlzIHdoZW4gaXQgaXM8YnIgLz5tb3VudGVkIHRvIHNlZSBpZiBi YXJyaWVycyB3ZXJlIGRpc2FibGVkIG9yIG5vdCBzdXBwb3J0ZWQgb24geW91cjxiciAvPmhhcmR3 YXJlLjxiciAvPiZndDsgPGJyIC8+VGhlIG5vdGVib29rIGlzIEFjZXIgQXNwaXJlIDY1MzBHLCBB TUQgVHVyaW9uIFgyIFJNLTc0LCBjaGlwc2V0IGlzIEFNRCBNNzgwRywgc291dGhicmlkZ2UgaXMg QU1EIFNCIDcwMC6gIFRoZSBoYXJkIGRyaXZlIGlzIFdlc3Rlcm4gRGlnaXRhbCBTY29ycGlvIEJs YWNrIFNBVEEgMzIwIEdCLCBXREMgV0QzMjAwQkVLVC0wMEYzVDAsIC9kZXYvc2RiPGJyIC8+Y2hp bmdsQHJhdDp+Jmd0OyBjYXQgL2V0Yy9mc3RhYqCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKA8YnIgLz48YnIgLz4vZGV2L2Rpc2svYnktcGF0aC9wY2ktMDAw MDowMDoxMS4wLXNjc2ktMTowOjA6MC1wYXJ0MSBzd2FwoKCgoKCgoKCgoKCgoKCgoCBzd2FwoKCg oKCgIGRlZmF1bHRzoKCgoKCgoKCgoKCgoCAwPGJyIC8+MKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg PGJyIC8+PGJyIC8+L2Rldi9kaXNrL2J5LXBhdGgvcGNpLTAwMDA6MDA6MTEuMC1zY3NpLTE6MDow OjAtcGFydDIgL6CgoKCgoKCgoKCgoKCgoKCgoKAgeGZzoKCgoKCgoCBkZWZhdWx0cyxsb2didWZz PTgsbG9nYnNpemU9MjU2a6CgoKCgoKCgoKCgoKAgMTxiciAvPjGgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoCA8YnIgLz4vZGV2L2Rpc2svYnkt cGF0aC9wY2ktMDAwMDowMDoxMS4wLXNjc2ktMTowOjA6MC1wYXJ0MyAvaG9tZaCgoKCgoKCgoKCg oKCgoCB4ZnOgoKCgoKCgIGRlZmF1bHRzLGxvZ2J1ZnM9OCxsb2dic2l6ZT0yNTZroKCgoKCgoKCg oKCgoCAxIDI8YnIgLz4vZGV2L2Rpc2svYnktcGF0aC9wY2ktMDAwMDowMDoxMS4wLXNjc2ktMDow OjA6MC1wYXJ0MiAvd2luZG93cy9DoKCgoKCgoKCgoCBudGZzLTNnoKCgIHVzZXJzLGdpZD11c2Vy cyxmbWFzaz0xMzMsZG1hc2s9MDIyLGxvY2FsZT1lbl9VUy5VVEYtOCAwIDAgL2Rldi9kaXNrL2J5 LXBhdGgvcGNpLTAwMDA6MDA6MTEuMC1zY3NpLTA6MDowOjAtcGFydDMgL3dpbmRvd3MvRKCgoKCg oKCgoKAgbnRmcy0zZ6CgoCB1c2VycyxnaWQ9dXNlcnMsZm1hc2s9MTMzLGRtYXNrPTAyMixsb2Nh bGU9ZW5fVVMuVVRGLTggMCAwIHByb2OgoKCgoKCgoKCgoKCgoKCgIC9wcm9joKCgoKCgoKCgoKCg oKCgIHByb2OgoKCgoKAgZGVmYXVsdHOgoKCgoKCgoKCgoKCgIDAgMDxiciAvPnN5c2ZzoKCgoKCg oKCgoKCgoKCgIC9zeXOgoKCgoKCgoKCgoKCgoKCgIHN5c2ZzoKCgoKAgbm9hdXRvoKCgoKCgoKCg oKCgoKCgIDAgMDxiciAvPmRlYnVnZnOgoKCgoKCgoKCgoKCgIC9zeXMva2VybmVsL2RlYnVnoKCg IGRlYnVnZnOgoKAgbm9hdXRvoKCgoKCgoKCgoKCgoKCgIDAgMDxiciAvPnVzYmZzoKCgoKCgoKCg oKCgoKCgIC9wcm9jL2J1cy91c2KgoKCgoKCgIHVzYmZzoKCgoKAgbm9hdXRvoKCgoKCgoKCgoKCg oKCgIDAgMDxiciAvPmRldnB0c6CgoKCgoKCgoKCgoKCgIC9kZXYvcHRzoKCgoKCgoKCgoKCgIGRl dnB0c6CgoKAgbW9kZT0wNjIwLGdpZD01oKCgoKCgIDAgMDxiciAvPmNoaW5nbEByYXQ6fiZndDs8 YnIgLz5jaGluZ2xAcmF0On4mZ3Q7IGNhdCAvcHJvYy9tb3VudHMgPGJyIC8+cm9vdGZzIC8gcm9v dGZzIHJ3IDAgMDxiciAvPmRldnRtcGZzIC9kZXYgZGV2dG1wZnMgcncscmVsYXRpbWUsc2l6ZT0x NzYxMTg0ayxucl9pbm9kZXM9NDQwMjk2LG1vZGU9NzU1IDAgMDxiciAvPnRtcGZzIC9kZXYvc2ht IHRtcGZzIHJ3LHJlbGF0aW1lIDAgMDxiciAvPmRldnB0cyAvZGV2L3B0cyBkZXZwdHMgcncscmVs YXRpbWUsZ2lkPTUsbW9kZT02MjAscHRteG1vZGU9MDAwIDAgMCAvZGV2L3NkYjIgLyB4ZnMgcncs cmVsYXRpbWUsYXR0cjIsbG9nYnVmcz04LGxvZ2JzaXplPTI1Nmssbm9xdW90YSAwIDAgcHJvYyAv cHJvYyBwcm9jIHJ3LHJlbGF0aW1lIDAgMDxiciAvPnN5c2ZzIC9zeXMgc3lzZnMgcncscmVsYXRp bWUgMCAwPGJyIC8+ZGVidWdmcyAvc3lzL2tlcm5lbC9kZWJ1ZyBkZWJ1Z2ZzIHJ3LHJlbGF0aW1l IDAgMDxiciAvPi9kZXYvc2RiMyAvaG9tZSB4ZnMgcncscmVsYXRpbWUsYXR0cjIsbG9nYnVmcz04 LGxvZ2JzaXplPTI1Nmssbm9xdW90YSAwIDAgZnVzZWN0bCAvc3lzL2ZzL2Z1c2UvY29ubmVjdGlv bnMgZnVzZWN0bCBydyxyZWxhdGltZSAwIDA8YnIgLz5zZWN1cml0eWZzIC9zeXMva2VybmVsL3Nl Y3VyaXR5IHNlY3VyaXR5ZnMgcncscmVsYXRpbWUgMCAwPGJyIC8+bm9uZSAvcHJvYy9zeXMvZnMv YmluZm10X21pc2MgYmluZm10X21pc2MgcncscmVsYXRpbWUgMCAwPGJyIC8+bm9uZSAvdmFyL2xp Yi9udHAvcHJvYyBwcm9jIHJvLG5vc3VpZCxub2RldixyZWxhdGltZSAwIDA8YnIgLz5ndmZzLWZ1 c2UtZGFlbW9uIC9ob21lL2NoaW5nbC8uZ3ZmcyBmdXNlLmd2ZnMtZnVzZS1kYWVtb248YnIgLz5y dyxub3N1aWQsbm9kZXYscmVsYXRpbWUsdXNlcl9pZD0xMDAwLGdyb3VwX2lkPTEwMCAwIDA8YnIg Lz5jaGluZ2xAcmF0On4mZ3Q7PGJyIC8+PGJyIC8+oCAmbHQ7NiZndDtboKCgIDEuMDg0MDg1XSBh dGEzOiBTQVRBIGxpbmsgZG93biAoU1N0YXR1cyAwIFNDb250cm9sIDMwMCk8YnIgLz6gICZsdDs2 Jmd0O1ugoKAgMS4wODQxNzJdIGF0YTQ6IFNBVEEgbGluayBkb3duIChTU3RhdHVzIDAgU0NvbnRy b2wgMzAwKTxiciAvPqAgJmx0OzMmZ3Q7W6CgoCAxLjI1NjA1OF0gYXRhMjogc29mdHJlc2V0IGZh aWxlZCAoZGV2aWNlIG5vdCByZWFkeSk8YnIgLz6gICZsdDs0Jmd0O1ugoKAgMS4yNTYwNjddIGF0 YTI6IGFwcGx5aW5nIFNCNjAwIFBNUCBTUlNUIHdvcmthcm91bmQgYW5kIHJldHJ5aW5nIKAgJmx0 OzMmZ3Q7W6CgoCAxLjI1NjA4NF0gYXRhMTogc29mdHJlc2V0IGZhaWxlZCAoZGV2aWNlIG5vdCBy ZWFkeSk8YnIgLz6gICZsdDs0Jmd0O1ugoKAgMS4yNTYwOTVdIGF0YTE6IGFwcGx5aW5nIFNCNjAw IFBNUCBTUlNUIHdvcmthcm91bmQgYW5kIHJldHJ5aW5nIKAgJmx0OzYmZ3Q7W6CgoCAxLjQyODA2 OV0gYXRhMjogU0FUQSBsaW5rIHVwIDMuMCBHYnBzIChTU3RhdHVzIDEyMyBTQ29udHJvbCAzMDAp IKAgJmx0OzYmZ3Q7W6CgoCAxLjQyODA5N10gYXRhMTogU0FUQSBsaW5rIHVwIDMuMCBHYnBzIChT U3RhdHVzIDEyMyBTQ29udHJvbCAzMDApIKAgJmx0OzYmZ3Q7W6CgoCAxLjQyOTQ1NF0gYXRhMS4w MDogQVRBLTg6IEhpdGFjaGkgSFRTNTQzMjMyTDlBMzAwLCBGQjRPQzQwQywgbWF4IFVETUEvMTMz PGJyIC8+oCAmbHQ7NiZndDtboKCgIDEuNDI5NDU4XSBhdGExLjAwOiA2MjUxNDI0NDggc2VjdG9y cywgbXVsdGkgMTY6IExCQTQ4IE5DUSAoZGVwdGggMzEvMzIpLCBBQTxiciAvPqAgJmx0OzYmZ3Q7 W6CgoCAxLjQzMDkyM10gYXRhMS4wMDogY29uZmlndXJlZCBmb3IgVURNQS8xMzM8YnIgLz6gICZs dDs1Jmd0O1ugoKAgMS40MzExNjRdIHNjc2kgMDowOjA6MDogRGlyZWN0LUFjY2Vzc6CgoKAgQVRB oKCgoKAgSGl0YWNoaSBIVFM1NDMyMyBGQjRPIFBROiAwIEFOU0k6IDU8YnIgLz6gICZsdDs1Jmd0 O1ugoKAgMS40MzE1NjBdIHNkIDA6MDowOjA6IFtzZGFdIDYyNTE0MjQ0OCA1MTItYnl0ZSBsb2dp Y2FsIGJsb2NrczogKDMyMCBHQi8yOTggR2lCKTxiciAvPqAgJmx0OzUmZ3Q7W6CgoCAxLjQzMTY3 Ml0gc2QgMDowOjA6MDogW3NkYV0gV3JpdGUgUHJvdGVjdCBpcyBvZmY8YnIgLz6gICZsdDs3Jmd0 O1ugoKAgMS40MzE2NzVdIHNkIDA6MDowOjA6IFtzZGFdIE1vZGUgU2Vuc2U6IDAwIDNhIDAwIDAw PGJyIC8+oCAmbHQ7NSZndDtboKCgIDEuNDMxOTE1XSBzZCAwOjA6MDowOiBbc2RhXSBXcml0ZSBj YWNoZTogZW5hYmxlZCwgcmVhZCBjYWNoZTogZW5hYmxlZCwgZG9lc24ndCBzdXBwb3J0IERQTyBv ciBGVUE8YnIgLz6gICZsdDs2Jmd0O1ugoKAgMS40NDEwNjRdIGF0YTIuMDA6IEFUQS04OiBXREMg V0QzMjAwQkVLVC0wMEYzVDAsIDExLjAxQTExLCBtYXggVURNQS8xMzM8YnIgLz6gICZsdDs2Jmd0 O1ugoKAgMS40NDEwNjddIGF0YTIuMDA6IDYyNTE0MjQ0OCBzZWN0b3JzLCBtdWx0aSAxNjogTEJB NDggTkNRIChkZXB0aCAzMS8zMiksIEFBPGJyIC8+oCAmbHQ7NiZndDtboKCgIDEuNDQyOTc4XSBh dGEyLjAwOiBjb25maWd1cmVkIGZvciBVRE1BLzEzMzxiciAvPqAgJmx0OzUmZ3Q7W6CgoCAxLjQ0 MzIwN10gc2NzaSAxOjA6MDowOiBEaXJlY3QtQWNjZXNzoKCgoCBBVEGgoKCgoCBXREM8YnIgLz5X RDMyMDBCRUtULTAgMTEuMCBQUTogMCBBTlNJOiA1PGJyIC8+oCAmbHQ7NSZndDtboKCgIDEuNDQz Mzg3XSBzZCAxOjA6MDowOiBbc2RiXSA2MjUxNDI0NDggNTEyLWJ5dGUgbG9naWNhbCBibG9ja3M6 ICgzMjAgR0IvMjk4IEdpQik8YnIgLz6gICZsdDs1Jmd0O1ugoKAgMS40NDM3MDddIHNkIDE6MDow OjA6IFtzZGJdIFdyaXRlIFByb3RlY3QgaXMgb2ZmPGJyIC8+oCAmbHQ7NyZndDtboKCgIDEuNDQz NzEwXSBzZCAxOjA6MDowOiBbc2RiXSBNb2RlIFNlbnNlOiAwMCAzYSAwMCAwMDxiciAvPqAgJmx0 OzUmZ3Q7W6CgoCAxLjQ0Mzc1Nl0gc2QgMTowOjA6MDogW3NkYl0gV3JpdGUgY2FjaGU6IGVuYWJs ZWQsIHJlYWQgY2FjaGU6IGVuYWJsZWQsIGRvZXNuJ3Qgc3VwcG9ydCBEUE8gb3IgRlVBPGJyIC8+ oCAmbHQ7NiZndDtboKCgIDEuNDU5NDM4XaAgc2RhOiBzZGExIHNkYTIgc2RhMyBzZGE0PGJyIC8+ oCAmbHQ7NSZndDtboKCgIDEuNDYwMTk3XSBzZCAwOjA6MDowOiBbc2RhXSBBdHRhY2hlZCBTQ1NJ IGRpc2s8YnIgLz6gICZsdDs2Jmd0O1ugoKAgMS40NzYzOTRdIFN5bmFwdGljcyBUb3VjaHBhZCwg bW9kZWw6IDEsIGZ3OiA2LjMsIGlkOiAweDEyYTBiMSwgY2FwczogMHhhMDQ3MTEvMHhhMDQwMDAv MHgwPGJyIC8+oCAmbHQ7NiZndDtboKCgIDEuNDgxODk4XaAgc2RiOiBzZGIxIHNkYjIgc2RiMzxi ciAvPqAgJmx0OzUmZ3Q7W6CgoCAxLjQ4MjI1NF0gc2QgMTowOjA6MDogW3NkYl0gQXR0YWNoZWQg U0NTSSBkaXNrPGJyIC8+PGJyIC8+PGJyIC8+PGJyIC8+oCAmbHQ7NiZndDtboKCgIDMuMjAxMTEx XSBTR0kgWEZTIHdpdGggQUNMcywgc2VjdXJpdHkgYXR0cmlidXRlcywgcmVhbHRpbWUsIGxhcmdl IGJsb2NrL2lub2RlIG51bWJlcnMsIG5vIGRlYnVnIGVuYWJsZWQ8YnIgLz6gICZsdDs2Jmd0O1ug oKAgMy4yMDIyNzldIFNHSSBYRlMgUXVvdGEgTWFuYWdlbWVudCBzdWJzeXN0ZW08YnIgLz6gICZs dDs1Jmd0O1ugoKAgMy4yMzAxNzRdIFhGUyBtb3VudGluZyBmaWxlc3lzdGVtIHNkYjI8YnIgLz6g ICZsdDs3Jmd0O1ugoKAgMy4zNTEzMjNdIEVuZGluZyBjbGVhbiBYRlMgbW91bnQgZm9yIGZpbGVz eXN0ZW06IHNkYjI8YnIgLz48YnIgLz6gICZsdDs1Jmd0O1ugoCAxMS44NjUzOTNdIFhGUyBtb3Vu dGluZyBmaWxlc3lzdGVtIHNkYjM8YnIgLz6gICZsdDs3Jmd0O1ugoCAxMi4wMDg3MDddIEVuZGlu ZyBjbGVhbiBYRlMgbW91bnQgZm9yIGZpbGVzeXN0ZW06IHNkYjM8YnIgLz48YnIgLz5JIGRvIG5v dCBzZWUgYW55dGhpbmcgdGhhdCBzYXlzIGJhcnJpZXIgaXMgbm90IHN1cHBvcnRlZC6gIEluIGZh Y3QsIEkgaGF2ZSBuZXZlciBwZXJzb25hbGx5IHNlZW4gYSBzeXN0ZW0gd2l0aCBhIG1lc3NhZ2Ug dGhhdCBiYXJyaWVyIGlzIG5vdCBzdXBwb3J0ZWQuPGJyIC8+PGJyIC8+Jmd0OyBPbmx5IGJ5IGxv b2tpbmcgYXQgdGhlbSBjYW4geW91IGtub3cuIFJlZ2FyZGxlc3Mgb2Ygd2hhdCBmaWxlc3lzdGVt IHlvdTxiciAvPmFyZSB1c2luZywgcmVjb3Zlcnkgb2YgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIGZy b20gbG9zdCtmb3VuZCBpcyB0aGUgc2FtZSBwcm9jZXNzLiBlLmcuIGRvIGFuIHJwbSBjaGVjayB0 byBzZWUgaWYgYWxsdGVoIGluc3RhbGxlZCBwYWNrYWdlcyBhcmUgaW50YWN0LiB0aGF0IHdpbGwg bmFycm93IGRvd24gd2hlcmUgYWxsIHlvdXIgYmluYXJpZXMgY2FtZSBmcm9tLiB1c2Ugb2Ygc3Ry aW5ncyBjYW4gYWxzbyB0ZWxsIHlvdSB3aGF0IHRoZSBiaW5hcnkgaXMuIGUuZzo8YnIgLz48YnIg Lz4mZ3Q7Jmd0OyBJbnR1aXRpdmVseSwgdGhlIG9ubHkgZmlsZXMgaW4gcm9vdCBmaWxlIHN5c3Rl bSAoYnkgdGhlIHdheSwgcm9vdCBhbHNvPGJyIC8+Y29udGFpbnMgL2Jvb3QpIHRoYXQgYXJlIG9w ZW4gZm9yIHdyaXRpbmcgYXJlIHRob3NlIGluIGxvZ3MgYW5kIC90bXAgYW5kPGJyIC8+Jmd0OyZn dDsgL3Zhci90bXAsIEkgaG9wZSB0aGF0IGlzIHRoZSBjYXNlIGFuZCBJIGNhbiBzYWZlbHkgZGlz Y2FyZCB0aG9zZSBpbjxiciAvPmxvc3QrZm91bmQuPGJyIC8+Jmd0OyZndDsgSSBhbHNvIGhvcGUg dGhhdCB0aGUgaW5vZGUgbGluayBjbGVhbi11cHMgZG9uZSBieSB4ZnNfcmVwYWlyIGRvIG5vdDxi ciAvPmFjdHVhbGx5IHJlbW92ZSBhbnkgZmlsZXMgdGhhdCBhcmUgcmVhbGx5IHRoZXJlLjxiciAv PiZndDsgPGJyIC8+Jmd0OyBEZWZpbmUgJnF1b3Q7cmVhbGx5IHRoZXJlJnF1b3Q7IHdoZW4gaW1w b3J0YW50IG1ldGFkYXRhIChpLmUuIHRoZSBsb2cpIGhhcyBiZWVuPGJyIC8+Y29ycnVwdGVkIGFu ZCBpcyBub3QgYXZhaWxhYmxlIGFueSBtb3JlLiAgSW5kZWVkLCBpZiB0aGluZ3MgbGlrZSBidHJl ZSBzcGxpdHMgb2YgbWVyZ2VzIG9jY3VycmVkIGluIHRoZSBsb2csIGFuZCB0aGV5IGFyZTxiciAv PiZndDsgcGFydGlhbGx5IHdyaXR0ZW4gdG8gZGlzaywgaXQncyBlbnRpcmVseSBwb3NzaWJsZSB0 aGF0IHlvdSBjb3VsZCBsb3NlPGJyIC8+ZGlyZWN0b3J5IHJlZmVyZW5jZXMgdG8gaW5vZGVzIHRo YXQgaGF2ZW4ndCBiZWVuIG1vZGlmaWVkIGZvciBzb21lIHRpbWUuLi4uPGJyIC8+Jmd0OyA8YnIg Lz4mZ3Q7IFJlbWVtYmVyLCBsaWtlIGFsbCBmc2NrIHByb2dyYW1zLCB4ZnNfcmVwYWlyIGlzIGEg YmVzdCBlZmZvcnQ8YnIgLz4mZ3Q7IGF0dGVtcHQgYXQgY29ycmVjdGluZyB0aGUgcHJvYmxlbXMg Zm91bmQgIC0gdGhlcmUgYXJlIG5vIGd1YXJhbnRlZXM8YnIgLz5naXZlbiBhYm91dCB3aGF0IGl0 IGNhbiBhbmQgY2FuJ3QgcmVjb3ZlciB3aGVuIGl0IHJ1bnMuLi48YnIgLz4mZ3Q7IDxiciAvPiZn dDsgRGF2ZS48YnIgLz4mZ3Q7IC0tPGJyIC8+Jmd0OyBEYXZlIENoaW5uZXI8YnIgLz4mZ3Q7IGRh dmlkQGZyb21vcmJpdC5jb208YnIgLz4mZ3Q7IDxiciAvPjxiciAvPkxvb2tpbmcgYXQgdGhlIG1l c3NhZ2VzIGZyb20geGZzX3JlcGFpciwgYW5kIGluc3BlY3Rpb24gb2YgL2xvc3QrZm91bmQsIHRo ZSBmaWxlcyBpbiBpdCBhcmUgZnJvbSAvdG1wIGFuZCAvZXRjL05ldHdvcmtNYW5hZ2VyL3N5c3Rl bS1jb25uZWN0aW9ucy9BdXRvIGV0aDAuoCBJIGRpZCBycG0gLVYgLWEuoCBBbGwgdGhlIGZpbGVz IGluIGxvc3QgPGJyIC8+PGJyIC8+PGJyIC8+PGJyIC8+PGJyIC8+ ------=_20120903001305_82642 Content-Type: text/html; name="untitled-[1.2]" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="untitled-[1.2]" PHA+PC9wPjxwPjwvcD48cD48L3A+PHA+PC9wPjxwPjwvcD48cD48L3A+PHA+PC9wPgo8YnIgLz48 YnIgLz5IaSBEYXZlPGJyIC8+PGJyIC8+SSBkaWQgdGhlIHhmc19yZXBhaXIgLUwgb24gdGhlIHJv b3QgZmlsZSBzeXN0ZW07IHhmc19yZXBhaXIgaXMgdmVyc2lvbiAzLjEuOC6gIFRoZSByZXBhaXIg d2FzIHN1Y2Nlc3NmdWwuPGJyIC8+PGJyIC8+Jmd0OyBZb3UgbWlzdW5kZXJzdG9vZC4gSSB3YXMg YXNraW5nIGZvciB0aGUgbWVzc2FnZXMgd2hlbiBpdDxiciAvPiZndDsgc3VjY2Vzc2Z1bGx5IG1v dW50cyBhbmQgdGhlIGNvbnRlbnRzIG9mIC9wcm9jL21vdW50cyBpcyB3aGVuIGl0IGlzIG1vdW50 ZWQgdG8gc2VlIGlmIGJhcnJpZXJzIHdlcmUgZGlzYWJsZWQgb3Igbm90IHN1cHBvcnRlZCBvbiB5 b3VyIGhhcmR3YXJlLjxiciAvPiZndDsgPGJyIC8+VGhlIG5vdGVib29rIGlzIEFjZXIgQXNwaXJl IDY1MzBHLCBBTUQgVHVyaW9uIFgyIFJNLTc0LCBjaGlwc2V0IGlzIEFNRCBNNzgwRywgc291dGhi cmlkZ2UgaXMgQU1EIFNCIDcwMC6gIFRoZSBoYXJkIGRyaXZlIGlzIFdlc3Rlcm4gRGlnaXRhbCBT Y29ycGlvIEJsYWNrIFNBVEEgMzIwIEdCLCBXREMgV0QzMjAwQkVLVC0wMEYzVDAsIC9kZXYvc2Ri PGJyIC8+Y2hpbmdsQHJhdDp+Jmd0OyBjYXQ8YnIgLz4vZXRjL2ZzdGFioKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoDxiciAvPjxiciAvPi9kZXYvZGlzay9i eS1wYXRoL3BjaS0wMDAwOjAwOjExLjAtc2NzaS0xOjA6MDowLXBhcnQxIHN3YXCgoKCgoKCgoKCg oKCgoKCgIHN3YXCgoKCgoKAgZGVmYXVsdHOgoKCgoKCgoKCgoKCgIDA8YnIgLz4woKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKA8YnIgLz48YnIgLz4vZGV2L2Rpc2svYnktcGF0aC9wY2ktMDAwMDowMDox MS4wLXNjc2ktMTowOjA6MC1wYXJ0MiAvoKCgoKCgoKCgoKCgoKCgoKCgoCB4ZnOgoKCgoKCgIGRl ZmF1bHRzLGxvZ2J1ZnM9OCxsb2dic2l6ZT0yNTZroKCgoKCgoKCgoKCgoCAxPGJyIC8+MaCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgIDxiciAv Pi9kZXYvZGlzay9ieS1wYXRoL3BjaS0wMDAwOjAwOjExLjAtc2NzaS0xOjA6MDowLXBhcnQzIC9o b21loKCgoKCgoKCgoKCgoKCgIHhmc6CgoKCgoKAgZGVmYXVsdHMsbG9nYnVmcz04LGxvZ2JzaXpl PTI1NmugoKCgoKCgoKCgoKCgIDEgMjxiciAvPi9kZXYvZGlzay9ieS1wYXRoL3BjaS0wMDAwOjAw OjExLjAtc2NzaS0wOjA6MDowLXBhcnQyIC93aW5kb3dzL0OgoKCgoKCgoKCgIG50ZnMtM2egoKAg dXNlcnMsZ2lkPXVzZXJzLGZtYXNrPTEzMyxkbWFzaz0wMjIsbG9jYWxlPWVuX1VTLlVURi04IDAg MCAvZGV2L2Rpc2svYnktcGF0aC9wY2ktMDAwMDowMDoxMS4wLXNjc2ktMDowOjA6MC1wYXJ0MyAv d2luZG93cy9EoKCgoKCgoKCgoCBudGZzLTNnoKCgIHVzZXJzLGdpZD11c2VycyxmbWFzaz0xMzMs ZG1hc2s9MDIyLGxvY2FsZT1lbl9VUy5VVEYtOCAwIDAgcHJvY6CgoKCgoKCgoKCgoKCgoKAgL3By b2OgoKCgoKCgoKCgoKCgoKAgcHJvY6CgoKCgoCBkZWZhdWx0c6CgoKCgoKCgoKCgoKAgMCAwPGJy IC8+c3lzZnOgoKCgoKCgoKCgoKCgoKAgL3N5c6CgoKCgoKCgoKCgoKCgoKAgc3lzZnOgoKCgoCBu b2F1dG+goKCgoKCgoKCgoKCgoKAgMCAwPGJyIC8+ZGVidWdmc6CgoKCgoKCgoKCgoKAgL3N5cy9r ZXJuZWwvZGVidWegoKAgZGVidWdmc6CgoCBub2F1dG+goKCgoKCgoKCgoKCgoKAgMCAwPGJyIC8+ dXNiZnOgoKCgoKCgoKCgoKCgoKAgL3Byb2MvYnVzL3VzYqCgoKCgoKAgdXNiZnOgoKCgoCBub2F1 dG+goKCgoKCgoKCgoKCgoKAgMCAwPGJyIC8+ZGV2cHRzoKCgoKCgoKCgoKCgoKAgL2Rldi9wdHOg oKCgoKCgoKCgoKAgZGV2cHRzoKCgoCBtb2RlPTA2MjAsZ2lkPTWgoKCgoKAgMCAwPGJyIC8+Y2hp bmdsQHJhdDp+Jmd0OzxiciAvPmNoaW5nbEByYXQ6fiZndDsgY2F0IC9wcm9jL21vdW50cyA8YnIg Lz5yb290ZnMgLyByb290ZnMgcncgMCAwPGJyIC8+ZGV2dG1wZnMgL2RldiBkZXZ0bXBmcyBydyxy ZWxhdGltZSxzaXplPTE3NjExODRrLG5yX2lub2Rlcz00NDAyOTYsbW9kZT03NTUgMCAwPGJyIC8+ dG1wZnMgL2Rldi9zaG0gdG1wZnMgcncscmVsYXRpbWUgMCAwPGJyIC8+ZGV2cHRzIC9kZXYvcHRz IGRldnB0cyBydyxyZWxhdGltZSxnaWQ9NSxtb2RlPTYyMCxwdG14bW9kZT0wMDAgMCAwIC9kZXYv c2RiMiAvIHhmcyBydyxyZWxhdGltZSxhdHRyMixsb2didWZzPTgsbG9nYnNpemU9MjU2ayxub3F1 b3RhIDAgMCBwcm9jIC9wcm9jIHByb2MgcncscmVsYXRpbWUgMCAwPGJyIC8+c3lzZnMgL3N5cyBz eXNmcyBydyxyZWxhdGltZSAwIDA8YnIgLz5kZWJ1Z2ZzIC9zeXMva2VybmVsL2RlYnVnIGRlYnVn ZnMgcncscmVsYXRpbWUgMCAwPGJyIC8+L2Rldi9zZGIzIC9ob21lIHhmcyBydyxyZWxhdGltZSxh dHRyMixsb2didWZzPTgsbG9nYnNpemU9MjU2ayxub3F1b3RhIDAgMCBmdXNlY3RsIC9zeXMvZnMv ZnVzZS9jb25uZWN0aW9ucyBmdXNlY3RsIHJ3LHJlbGF0aW1lIDAgMDxiciAvPnNlY3VyaXR5ZnMg L3N5cy9rZXJuZWwvc2VjdXJpdHkgc2VjdXJpdHlmcyBydyxyZWxhdGltZSAwIDA8YnIgLz5ub25l IC9wcm9jL3N5cy9mcy9iaW5mbXRfbWlzYyBiaW5mbXRfbWlzYyBydyxyZWxhdGltZSAwIDA8YnIg Lz5ub25lIC92YXIvbGliL250cC9wcm9jIHByb2Mgcm8sbm9zdWlkLG5vZGV2LHJlbGF0aW1lIDAg MDxiciAvPmd2ZnMtZnVzZS1kYWVtb24gL2hvbWUvY2hpbmdsLy5ndmZzIGZ1c2UuZ3Zmcy1mdXNl LWRhZW1vbjxiciAvPnJ3LG5vc3VpZCxub2RldixyZWxhdGltZSx1c2VyX2lkPTEwMDAsZ3JvdXBf aWQ9MTAwIDAgMDxiciAvPmNoaW5nbEByYXQ6fiZndDs8YnIgLz48YnIgLz6gICZsdDs2Jmd0O1ug oKAgMS4wODQwODVdIGF0YTM6IFNBVEEgbGluayBkb3duIChTU3RhdHVzIDAgU0NvbnRyb2wgMzAw KTxiciAvPqAgJmx0OzYmZ3Q7W6CgoCAxLjA4NDE3Ml0gYXRhNDogU0FUQSBsaW5rIGRvd24gKFNT dGF0dXMgMCBTQ29udHJvbCAzMDApPGJyIC8+oCAmbHQ7MyZndDtboKCgIDEuMjU2MDU4XSBhdGEy OiBzb2Z0cmVzZXQgZmFpbGVkIChkZXZpY2Ugbm90IHJlYWR5KTxiciAvPqAgJmx0OzQmZ3Q7W6Cg oCAxLjI1NjA2N10gYXRhMjogYXBwbHlpbmcgU0I2MDAgUE1QIFNSU1Qgd29ya2Fyb3VuZCBhbmQg cmV0cnlpbmcgoCAmbHQ7MyZndDtboKCgIDEuMjU2MDg0XSBhdGExOiBzb2Z0cmVzZXQgZmFpbGVk IChkZXZpY2Ugbm90IHJlYWR5KTxiciAvPqAgJmx0OzQmZ3Q7W6CgoCAxLjI1NjA5NV0gYXRhMTog YXBwbHlpbmcgU0I2MDAgUE1QIFNSU1Qgd29ya2Fyb3VuZCBhbmQgcmV0cnlpbmcgoCAmbHQ7NiZn dDtboKCgIDEuNDI4MDY5XSBhdGEyOiBTQVRBIGxpbmsgdXAgMy4wIEdicHMgKFNTdGF0dXMgMTIz IFNDb250cm9sIDMwMCkgoCAmbHQ7NiZndDtboKCgIDEuNDI4MDk3XSBhdGExOiBTQVRBIGxpbmsg dXAgMy4wIEdicHMgKFNTdGF0dXMgMTIzIFNDb250cm9sIDMwMCkgoCAmbHQ7NiZndDtboKCgIDEu NDI5NDU0XSBhdGExLjAwOiBBVEEtODogSGl0YWNoaSBIVFM1NDMyMzJMOUEzMDAsIEZCNE9DNDBD LCBtYXggVURNQS8xMzM8YnIgLz6gICZsdDs2Jmd0O1ugoKAgMS40Mjk0NThdIGF0YTEuMDA6IDYy NTE0MjQ0OCBzZWN0b3JzLCBtdWx0aSAxNjogTEJBNDggTkNRIChkZXB0aCAzMS8zMiksIEFBPGJy IC8+oCAmbHQ7NiZndDtboKCgIDEuNDMwOTIzXSBhdGExLjAwOiBjb25maWd1cmVkIGZvciBVRE1B LzEzMzxiciAvPqAgJmx0OzUmZ3Q7W6CgoCAxLjQzMTE2NF0gc2NzaSAwOjA6MDowOiBEaXJlY3Qt QWNjZXNzoKCgoCBBVEGgoKCgoCBIaXRhY2hpIEhUUzU0MzIzIEZCNE8gUFE6IDAgQU5TSTogNTxi ciAvPqAgJmx0OzUmZ3Q7W6CgoCAxLjQzMTU2MF0gc2QgMDowOjA6MDogW3NkYV0gNjI1MTQyNDQ4 IDUxMi1ieXRlIGxvZ2ljYWwgYmxvY2tzOiAoMzIwIEdCLzI5OCBHaUIpPGJyIC8+oCAmbHQ7NSZn dDtboKCgIDEuNDMxNjcyXSBzZCAwOjA6MDowOiBbc2RhXSBXcml0ZSBQcm90ZWN0IGlzIG9mZjxi ciAvPqAgJmx0OzcmZ3Q7W6CgoCAxLjQzMTY3NV0gc2QgMDowOjA6MDogW3NkYV0gTW9kZSBTZW5z ZTogMDAgM2EgMDAgMDA8YnIgLz6gICZsdDs1Jmd0O1ugoKAgMS40MzE5MTVdIHNkIDA6MDowOjA6 IFtzZGFdIFdyaXRlIGNhY2hlOiBlbmFibGVkLCByZWFkIGNhY2hlOiBlbmFibGVkLCBkb2Vzbid0 IHN1cHBvcnQgRFBPIG9yIEZVQTxiciAvPqAgJmx0OzYmZ3Q7W6CgoCAxLjQ0MTA2NF0gYXRhMi4w MDogQVRBLTg6IFdEQyBXRDMyMDBCRUtULTAwRjNUMCwgMTEuMDFBMTEsIG1heCBVRE1BLzEzMzxi ciAvPqAgJmx0OzYmZ3Q7W6CgoCAxLjQ0MTA2N10gYXRhMi4wMDogNjI1MTQyNDQ4IHNlY3RvcnMs IG11bHRpIDE2OiBMQkE0OCBOQ1EgKGRlcHRoIDMxLzMyKSwgQUE8YnIgLz6gICZsdDs2Jmd0O1ug oKAgMS40NDI5NzhdIGF0YTIuMDA6IGNvbmZpZ3VyZWQgZm9yIFVETUEvMTMzPGJyIC8+oCAmbHQ7 NSZndDtboKCgIDEuNDQzMjA3XSBzY3NpIDE6MDowOjA6IERpcmVjdC1BY2Nlc3OgoKCgIEFUQaCg oKCgIFdEQzxiciAvPldEMzIwMEJFS1QtMCAxMS4wIFBROiAwIEFOU0k6IDU8YnIgLz6gICZsdDs1 Jmd0O1ugoKAgMS40NDMzODddIHNkIDE6MDowOjA6IFtzZGJdIDYyNTE0MjQ0OCA1MTItYnl0ZSBs b2dpY2FsIGJsb2NrczogKDMyMCBHQi8yOTggR2lCKTxiciAvPqAgJmx0OzUmZ3Q7W6CgoCAxLjQ0 MzcwN10gc2QgMTowOjA6MDogW3NkYl0gV3JpdGUgUHJvdGVjdCBpcyBvZmY8YnIgLz6gICZsdDs3 Jmd0O1ugoKAgMS40NDM3MTBdIHNkIDE6MDowOjA6IFtzZGJdIE1vZGUgU2Vuc2U6IDAwIDNhIDAw IDAwPGJyIC8+oCAmbHQ7NSZndDtboKCgIDEuNDQzNzU2XSBzZCAxOjA6MDowOiBbc2RiXSBXcml0 ZSBjYWNoZTogZW5hYmxlZCwgcmVhZCBjYWNoZTogZW5hYmxlZCwgZG9lc24ndCBzdXBwb3J0IERQ TyBvciBGVUE8YnIgLz6gICZsdDs2Jmd0O1ugoKAgMS40NTk0MzhdoCBzZGE6IHNkYTEgc2RhMiBz ZGEzIHNkYTQ8YnIgLz6gICZsdDs1Jmd0O1ugoKAgMS40NjAxOTddIHNkIDA6MDowOjA6IFtzZGFd IEF0dGFjaGVkIFNDU0kgZGlzazxiciAvPqAgJmx0OzYmZ3Q7W6CgoCAxLjQ3NjM5NF0gU3luYXB0 aWNzIFRvdWNocGFkLCBtb2RlbDogMSwgZnc6IDYuMywgaWQ6IDB4MTJhMGIxLCBjYXBzOiAweGEw NDcxMS8weGEwNDAwMC8weDA8YnIgLz6gICZsdDs2Jmd0O1ugoKAgMS40ODE4OThdoCBzZGI6IHNk YjEgc2RiMiBzZGIzPGJyIC8+oCAmbHQ7NSZndDtboKCgIDEuNDgyMjU0XSBzZCAxOjA6MDowOiBb c2RiXSBBdHRhY2hlZCBTQ1NJIGRpc2s8YnIgLz48YnIgLz48YnIgLz48YnIgLz6gICZsdDs2Jmd0 O1ugoKAgMy4yMDExMTFdIFNHSSBYRlMgd2l0aCBBQ0xzLCBzZWN1cml0eSBhdHRyaWJ1dGVzLCBy ZWFsdGltZSwgbGFyZ2UgYmxvY2svaW5vZGUgbnVtYmVycywgbm8gZGVidWcgZW5hYmxlZDxiciAv PqAgJmx0OzYmZ3Q7W6CgoCAzLjIwMjI3OV0gU0dJIFhGUyBRdW90YSBNYW5hZ2VtZW50IHN1YnN5 c3RlbTxiciAvPqAgJmx0OzUmZ3Q7W6CgoCAzLjIzMDE3NF0gWEZTIG1vdW50aW5nIGZpbGVzeXN0 ZW0gc2RiMjxiciAvPqAgJmx0OzcmZ3Q7W6CgoCAzLjM1MTMyM10gRW5kaW5nIGNsZWFuIFhGUyBt b3VudCBmb3IgZmlsZXN5c3RlbTogc2RiMjxiciAvPjxiciAvPqAgJmx0OzUmZ3Q7W6CgIDExLjg2 NTM5M10gWEZTIG1vdW50aW5nIGZpbGVzeXN0ZW0gc2RiMzxiciAvPqAgJmx0OzcmZ3Q7W6CgIDEy LjAwODcwN10gRW5kaW5nIGNsZWFuIFhGUyBtb3VudCBmb3IgZmlsZXN5c3RlbTogc2RiMzxiciAv PjxiciAvPjxiciAvPiZndDsgSXQncyBub3QgY2hhcmdpbmcgTGktaW9uIGJhdHRlcmllcyB0aGF0 IHNob3J0ZW5zIHRoZWlyIGxpZmUgLSBpdCdzIGhpZ2ggdGVtcGVyYXR1cmVzIHRoYXQgc2hvcnRl biBpdC4gSU9XcywgdGhlIHJlYXNvbiBmb3IgcmVtb3ZpbmcgdGhlIGJhdHRlcnkgd2hlbiBvbiBB QyBpcyB0byBwcmV2ZW50IGhlYXQgc29hayBhbmQgdGhlIGJhdHRlcnk8YnIgLz4mZ3Q7IHN1c3Rh aW5pbmcgZWxldmF0ZWQgdGVtcGVyYXR1cmVzIG92ZXIgbG9uZyBwZXJpb2RzIG9mIHRpbWUuPGJy IC8+Jmd0OyA8YnIgLz4mZ3Q7IEV2ZW4gc28sIHByb3Blcmx5IGRlc2lnbmVkIGxhcHRvcHMgZG9u J3Qgc3VmZmVyIGZyb20gaGVhdCBzb2FrIG9yIGNoYXJnZSBjeWNsZSByZWxhdGVkIGJhdHRlcnkg bGlmZSBwcm9ibGVtcywgYW5kIGVudmlyb25tZW50YWw8YnIgLz4mZ3Q7IGNvbmRpdGlvbnMgcGxh eSBtb3JlIG9mIGEgcGFydCBpbiBkZXRlcm1pbmluZyBiYXR0ZXJ5IGxpZmUgdGhhbjxiciAvPiZn dDsgdXNhZ2UvY2hhcmdlIHBhdHRlcm5zLi4uPGJyIC8+Jmd0OyA8YnIgLz4mZ3Q7Jmd0OyAmZ3Q7 IFRoZSBmaWxlcyBpbiBsb3N0K2ZvdW5kIGFyZSBudW1iZXJlZCBieSB0aGVpciBpbm9kZSBudW1i ZXIuIFlvdSBuZWVkIHRvIGxvb2sgYXQgdGhlIGNvbnRlbnRzIG9mIHRoZW0gdG8gZGV0ZXJtaW5l IHdoZXJlIHRoZXkgY2FtZSBmcm9tLjxiciAvPiZndDsmZ3Q7IElub2RlIG51bWJlcnMgYXJlIG5v dCBpbmZvcm1hdGl2ZSwgcmlnaHQ/PGJyIC8+Jmd0OyA8YnIgLz4mZ3Q7IFN1cmUsIGJ1dCB3aGVu IHlvdSd2ZSBoYWQgYSBkaXJlY3RvcnkgY29ycnVwdGlvbiBhbmQgdGhlIG5hbWVzIGhhdmUgYmVl biBsb3N0LCB3aGF0IGRvIHlvdSBuYW1lIHRoZSBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgdGhhdCBh cmU8YnIgLz4mZ3Q7IGZvdW5kPyBBbGwgd2UgY2FuIGRvIGlzIG5hbWUgdGhlbSBzb21ldGhpbmcg dW5pcXVlLCBoZW5jZSB0aGUgdXNlIG9mIHRoZSBpbm9kZSBudW1iZXIuPGJyIC8+Jmd0OyA8YnIg Lz4mZ3Q7Jmd0OyBUZXh0IGZpbGVzIGFyZSByZWFkYWJsZSwgYnV0IGJpbmFyaWVzLi4uLi4uLCBJ IHdpbGwgaGF2ZSBubyBjbHVlLCBhbmQ8YnIgLz5pZjxiciAvPiZndDsmZ3Q7IEk8YnIgLz4mZ3Q7 Jmd0OyBkZWxldGUgdGhlbSwgd2hvIGtub3dzIGlmIEkgYW0gZGVsZXRpbmcgc29tZSB0aGluZyBy ZWFsbHkgaW1wb3J0YW50PzxiciAvPiZndDsgPGJyIC8+Jmd0OyBPbmx5IGJ5IGxvb2tpbmcgYXQg dGhlbSBjYW4geW91IGtub3cuIFJlZ2FyZGxlc3Mgb2Ygd2hhdCBmaWxlc3lzdGVtIHlvdSBhcmUg dXNpbmcsIHJlY292ZXJ5IG9mIGZpbGVzIGFuZCBkaXJlY3RvcmllcyBmcm9tIGxvc3QrZm91bmQg aXMgdGhlIHNhbWUgcHJvY2Vzcy4gZS5nLiBkbyBhbiBycG0gY2hlY2sgdG8gc2VlIGlmIGFsbHRl aCBpbnN0YWxsZWQgcGFja2FnZXMgYXJlIGludGFjdC4gdGhhdCB3aWxsIG5hcnJvdyBkb3duIHdo ZXJlIGFsbCB5b3VyIGJpbmFyaWVzIGNhbWUgZnJvbS4gdXNlIG9mIHN0cmluZ3MgY2FuIGFsc28g dGVsbCB5b3Ugd2hhdCB0aGUgYmluYXJ5IGlzLiBlLmc6PGJyIC8+Jmd0OyA8YnIgLz4mZ3Q7ICQg c3RyaW5ncyAvc2Jpbi94ZnNfcmVwYWlyIHxncmVwIHhmc19yZXBhaXI8YnIgLz4mZ3Q7IHJlLXJ1 bm5pbmcgeGZzX3JlcGFpci4gIElmIHlvdSBhcmUgdW5hYmxlIHRvIG1vdW50IHRoZSBmaWxlc3lz dGVtLCB0aGVuIHVzZTxiciAvPiZndDsgUGxlYXNlIHJ1biBhIG1vcmUgcmVjZW50IHZlcnNpb24g b2YgeGZzX3JlcGFpci48YnIgLz4mZ3Q7ICQ8YnIgLz4mZ3Q7IDxiciAvPiZndDsmZ3Q7IEludHVp dGl2ZWx5LCB0aGUgb25seSBmaWxlcyBpbiByb290IGZpbGUgc3lzdGVtIChieSB0aGUgd2F5LCBy b290IGFsc28gY29udGFpbnMgL2Jvb3QpIHRoYXQgYXJlIG9wZW4gZm9yIHdyaXRpbmcgYXJlIHRo b3NlIGluIGxvZ3MgYW5kIC90bXA8YnIgLz5hbmQ8YnIgLz4mZ3Q7Jmd0OyAvdmFyL3RtcCwgSSBo b3BlIHRoYXQgaXMgdGhlIGNhc2UgYW5kIEkgY2FuIHNhZmVseSBkaXNjYXJkIHRob3NlIGluIGxv c3QrZm91bmQuPGJyIC8+Jmd0OyZndDsgSSBhbHNvIGhvcGUgdGhhdCB0aGUgaW5vZGUgbGluayBj bGVhbi11cHMgZG9uZSBieSB4ZnNfcmVwYWlyIGRvIG5vdCBhY3R1YWxseSByZW1vdmUgYW55IGZp bGVzIHRoYXQgYXJlIHJlYWxseSB0aGVyZS48YnIgLz4mZ3Q7IDxiciAvPiZndDsgRGVmaW5lICZx dW90O3JlYWxseSB0aGVyZSZxdW90OyB3aGVuIGltcG9ydGFudCBtZXRhZGF0YSAoaS5lLiB0aGUg bG9nKSBoYXMgYmVlbiBjb3JydXB0ZWQgYW5kIGlzIG5vdCBhdmFpbGFibGUgYW55IG1vcmUuICBJ bmRlZWQsIGlmIHRoaW5ncyBsaWtlIGJ0cmVlIHNwbGl0cyBvZiBtZXJnZXMgb2NjdXJyZWQgaW4g dGhlIGxvZywgYW5kIHRoZXkgYXJlPGJyIC8+Jmd0OyBwYXJ0aWFsbHkgd3JpdHRlbiB0byBkaXNr LCBpdCdzIGVudGlyZWx5IHBvc3NpYmxlIHRoYXQgeW91IGNvdWxkIGxvc2UgZGlyZWN0b3J5IHJl ZmVyZW5jZXMgdG8gaW5vZGVzIHRoYXQgaGF2ZW4ndCBiZWVuIG1vZGlmaWVkIGZvciBzb21lIHRp bWUuLi4uPGJyIC8+Jmd0OyA8YnIgLz4mZ3Q7IFJlbWVtYmVyLCBsaWtlIGFsbCBmc2NrIHByb2dy YW1zLCB4ZnNfcmVwYWlyIGlzIGEgYmVzdCBlZmZvcnQ8YnIgLz4mZ3Q7IGF0dGVtcHQgYXQgY29y cmVjdGluZyB0aGUgcHJvYmxlbXMgZm91bmQgIC0gdGhlcmUgYXJlIG5vIGd1YXJhbnRlZXMgZ2l2 ZW4gYWJvdXQgd2hhdCBpdCBjYW4gYW5kIGNhbid0IHJlY292ZXIgd2hlbiBpdCBydW5zLi4uPGJy IC8+Jmd0OyA8YnIgLz4mZ3Q7IENoZWVycyw8YnIgLz4mZ3Q7IDxiciAvPiZndDsgRGF2ZS48YnIg Lz4mZ3Q7IC0tPGJyIC8+Jmd0OyBEYXZlIENoaW5uZXI8YnIgLz4mZ3Q7IGRhdmlkQGZyb21vcmJp dC5jb208YnIgLz4mZ3Q7IDxiciAvPjxiciAvPjxiciAvPkNoaW4gR2ltIExlb25nPGJyIC8+UGVy Zm9ybWFuY2UgQ29tcHV0aW5nIEVuZ2luZWVyPGJyIC8+UGVyZm9ybWFuY2UgQ29tcHV0aW5nIExM UDxiciAvPjxiciAvPmh0dHA6Ly9wZXJmb3JtYW5jZS1jb21wdXRpbmcubmV0PGJyIC8+Q0hJTl9H aW1fTGVvbmdAcGVyZm9ybWFuY2UtY29tcHV0aW5nLm5ldDxiciAvPlRlbDogKzY1LTk3NDY5NDgy PGJyIC8+PGJyIC8+PGJyIC8+ ------=_20120903001305_82642 Content-Type: text/html; name="untitled-[2]" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="untitled-[2]" PHA+SGkgRGF2ZTwvcD48cD48L3A+PHA+SSBkaWQgdGhlIHhmc19yZXBhaXIgLUwgb24gdGhlIHJv b3QgZmlsZSBzeXN0ZW07IHhmc19yZXBhaXIgaXMgdmVyc2lvbiAzLjEuOC6gIFRoZSByZXBhaXIg d2FzIHN1Y2Nlc3NmdWwuPGJyIC8+PGJyIC8+Jmd0OyBZb3UgbWlzdW5kZXJzdG9vZC4gSSB3YXMg YXNraW5nIGZvciB0aGUgbWVzc2FnZXMgd2hlbiBpdDxiciAvPiZndDsgc3VjY2Vzc2Z1bGx5IG1v dW50cyBhbmQgdGhlIGNvbnRlbnRzIG9mIC9wcm9jL21vdW50cyBpcyB3aGVuIGl0IGlzPGJyIC8+ Jmd0OyBtb3VudGVkIHRvIHNlZSBpZiBiYXJyaWVycyB3ZXJlIGRpc2FibGVkIG9yIG5vdCBzdXBw b3J0ZWQgb24geW91cjxiciAvPiZndDsgaGFyZHdhcmUuPGJyIC8+Jmd0OyA8L3A+PHA+VGhlIG5v dGVib29rIGlzIEFjZXIgQXNwaXJlIDY1MzBHLCBBTUQgVHVyaW9uIFgyIFJNLTc0LCBjaGlwc2V0 IGlzIEFNRCBNNzgwRywgc291dGhicmlkZ2UgaXMgQU1EIFNCIDcwMC6gIFRoZSBoYXJkIGRyaXZl IGlzIFdlc3Rlcm4gRGlnaXRhbCBTY29ycGlvIEJsYWNrIFNBVEEgMzIwIEdCLCBXREMgV0QzMjAw QkVLVC0wMEYzVDAsIC9kZXYvc2RiPC9wPjxwPmNoaW5nbEByYXQ6fiZndDsgY2F0IC9ldGMvZnN0 YWKgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgIDxiciAv Pi9kZXYvZGlzay9ieS1wYXRoL3BjaS0wMDAwOjAwOjExLjAtc2NzaS0xOjA6MDowLXBhcnQxIHN3 YXCgoKCgoKCgoKCgoKCgoKCgIHN3YXCgoKCgoKAgZGVmYXVsdHOgoKCgoKCgoKCgoKCgIDAgMKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgIDxiciAvPi9kZXYvZGlzay9ieS1wYXRoL3BjaS0wMDAwOjAw OjExLjAtc2NzaS0xOjA6MDowLXBhcnQyIC+goKCgoKCgoKCgoKCgoKCgoKCgIHhmc6CgoKCgoKAg ZGVmYXVsdHMsbG9nYnVmcz04LGxvZ2JzaXplPTI1NmugoKCgoKCgoKCgoKCgIDEgMaCgoKCgoKCg oKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgIDxiciAvPi9k ZXYvZGlzay9ieS1wYXRoL3BjaS0wMDAwOjAwOjExLjAtc2NzaS0xOjA6MDowLXBhcnQzIC9ob21l oKCgoKCgoKCgoKCgoKCgIHhmc6CgoKCgoKAgZGVmYXVsdHMsbG9nYnVmcz04LGxvZ2JzaXplPTI1 NmugoKCgoKCgoKCgoKCgIDEgMjxiciAvPi9kZXYvZGlzay9ieS1wYXRoL3BjaS0wMDAwOjAwOjEx LjAtc2NzaS0wOjA6MDowLXBhcnQyIC93aW5kb3dzL0OgoKCgoKCgoKCgIG50ZnMtM2egoKAgdXNl cnMsZ2lkPXVzZXJzLGZtYXNrPTEzMyxkbWFzaz0wMjIsbG9jYWxlPWVuX1VTLlVURi04IDAgMDxi ciAvPi9kZXYvZGlzay9ieS1wYXRoL3BjaS0wMDAwOjAwOjExLjAtc2NzaS0wOjA6MDowLXBhcnQz IC93aW5kb3dzL0SgoKCgoKCgoKCgIG50ZnMtM2egoKAgdXNlcnMsZ2lkPXVzZXJzLGZtYXNrPTEz MyxkbWFzaz0wMjIsbG9jYWxlPWVuX1VTLlVURi04IDAgMDxiciAvPnByb2OgoKCgoKCgoKCgoKCg oKCgIC9wcm9joKCgoKCgoKCgoKCgoKCgIHByb2OgoKCgoKAgZGVmYXVsdHOgoKCgoKCgoKCgoKCg IDAgMDxiciAvPnN5c2ZzoKCgoKCgoKCgoKCgoKCgIC9zeXOgoKCgoKCgoKCgoKCgoKCgIHN5c2Zz oKCgoKAgbm9hdXRvoKCgoKCgoKCgoKCgoKCgIDAgMDxiciAvPmRlYnVnZnOgoKCgoKCgoKCgoKCg IC9zeXMva2VybmVsL2RlYnVnoKCgIGRlYnVnZnOgoKAgbm9hdXRvoKCgoKCgoKCgoKCgoKCgIDAg MDxiciAvPnVzYmZzoKCgoKCgoKCgoKCgoKCgIC9wcm9jL2J1cy91c2KgoKCgoKCgIHVzYmZzoKCg oKAgbm9hdXRvoKCgoKCgoKCgoKCgoKCgIDAgMDxiciAvPmRldnB0c6CgoKCgoKCgoKCgoKCgIC9k ZXYvcHRzoKCgoKCgoKCgoKCgIGRldnB0c6CgoKAgbW9kZT0wNjIwLGdpZD01oKCgoKCgIDAgMDxi ciAvPmNoaW5nbEByYXQ6fiZndDs8L3A+PHA+Y2hpbmdsQHJhdDp+Jmd0OyBjYXQgL3Byb2MvbW91 bnRzIDxiciAvPnJvb3RmcyAvIHJvb3RmcyBydyAwIDA8YnIgLz5kZXZ0bXBmcyAvZGV2IGRldnRt cGZzIHJ3LHJlbGF0aW1lLHNpemU9MTc2MTE4NGssbnJfaW5vZGVzPTQ0MDI5Nixtb2RlPTc1NSAw IDA8YnIgLz50bXBmcyAvZGV2L3NobSB0bXBmcyBydyxyZWxhdGltZSAwIDA8YnIgLz5kZXZwdHMg L2Rldi9wdHMgZGV2cHRzIHJ3LHJlbGF0aW1lLGdpZD01LG1vZGU9NjIwLHB0bXhtb2RlPTAwMCAw IDA8YnIgLz4vZGV2L3NkYjIgLyB4ZnMgcncscmVsYXRpbWUsYXR0cjIsbG9nYnVmcz04LGxvZ2Jz aXplPTI1Nmssbm9xdW90YSAwIDA8YnIgLz5wcm9jIC9wcm9jIHByb2MgcncscmVsYXRpbWUgMCAw PGJyIC8+c3lzZnMgL3N5cyBzeXNmcyBydyxyZWxhdGltZSAwIDA8YnIgLz5kZWJ1Z2ZzIC9zeXMv a2VybmVsL2RlYnVnIGRlYnVnZnMgcncscmVsYXRpbWUgMCAwPGJyIC8+L2Rldi9zZGIzIC9ob21l IHhmcyBydyxyZWxhdGltZSxhdHRyMixsb2didWZzPTgsbG9nYnNpemU9MjU2ayxub3F1b3RhIDAg MDxiciAvPmZ1c2VjdGwgL3N5cy9mcy9mdXNlL2Nvbm5lY3Rpb25zIGZ1c2VjdGwgcncscmVsYXRp bWUgMCAwPGJyIC8+c2VjdXJpdHlmcyAvc3lzL2tlcm5lbC9zZWN1cml0eSBzZWN1cml0eWZzIHJ3 LHJlbGF0aW1lIDAgMDxiciAvPm5vbmUgL3Byb2Mvc3lzL2ZzL2JpbmZtdF9taXNjIGJpbmZtdF9t aXNjIHJ3LHJlbGF0aW1lIDAgMDxiciAvPm5vbmUgL3Zhci9saWIvbnRwL3Byb2MgcHJvYyBybyxu b3N1aWQsbm9kZXYscmVsYXRpbWUgMCAwPGJyIC8+Z3Zmcy1mdXNlLWRhZW1vbiAvaG9tZS9jaGlu Z2wvLmd2ZnMgZnVzZS5ndmZzLWZ1c2UtZGFlbW9uIHJ3LG5vc3VpZCxub2RldixyZWxhdGltZSx1 c2VyX2lkPTEwMDAsZ3JvdXBfaWQ9MTAwIDAgMDxiciAvPmNoaW5nbEByYXQ6fiZndDs8L3A+PHA+ PC9wPjxwPqAgJmx0OzYmZ3Q7W6CgoCAxLjA4NDA4NV0gYXRhMzogU0FUQSBsaW5rIGRvd24gKFNT dGF0dXMgMCBTQ29udHJvbCAzMDApPGJyIC8+oCAmbHQ7NiZndDtboKCgIDEuMDg0MTcyXSBhdGE0 OiBTQVRBIGxpbmsgZG93biAoU1N0YXR1cyAwIFNDb250cm9sIDMwMCk8YnIgLz6gICZsdDszJmd0 O1ugoKAgMS4yNTYwNThdIGF0YTI6IHNvZnRyZXNldCBmYWlsZWQgKGRldmljZSBub3QgcmVhZHkp PGJyIC8+oCAmbHQ7NCZndDtboKCgIDEuMjU2MDY3XSBhdGEyOiBhcHBseWluZyBTQjYwMCBQTVAg U1JTVCB3b3JrYXJvdW5kIGFuZCByZXRyeWluZzxiciAvPqAgJmx0OzMmZ3Q7W6CgoCAxLjI1NjA4 NF0gYXRhMTogc29mdHJlc2V0IGZhaWxlZCAoZGV2aWNlIG5vdCByZWFkeSk8YnIgLz6gICZsdDs0 Jmd0O1ugoKAgMS4yNTYwOTVdIGF0YTE6IGFwcGx5aW5nIFNCNjAwIFBNUCBTUlNUIHdvcmthcm91 bmQgYW5kIHJldHJ5aW5nPGJyIC8+oCAmbHQ7NiZndDtboKCgIDEuNDI4MDY5XSBhdGEyOiBTQVRB IGxpbmsgdXAgMy4wIEdicHMgKFNTdGF0dXMgMTIzIFNDb250cm9sIDMwMCk8YnIgLz6gICZsdDs2 Jmd0O1ugoKAgMS40MjgwOTddIGF0YTE6IFNBVEEgbGluayB1cCAzLjAgR2JwcyAoU1N0YXR1cyAx MjMgU0NvbnRyb2wgMzAwKTxiciAvPqAgJmx0OzYmZ3Q7W6CgoCAxLjQyOTQ1NF0gYXRhMS4wMDog QVRBLTg6IEhpdGFjaGkgSFRTNTQzMjMyTDlBMzAwLCBGQjRPQzQwQywgbWF4IFVETUEvMTMzPGJy IC8+oCAmbHQ7NiZndDtboKCgIDEuNDI5NDU4XSBhdGExLjAwOiA2MjUxNDI0NDggc2VjdG9ycywg bXVsdGkgMTY6IExCQTQ4IE5DUSAoZGVwdGggMzEvMzIpLCBBQTxiciAvPqAgJmx0OzYmZ3Q7W6Cg oCAxLjQzMDkyM10gYXRhMS4wMDogY29uZmlndXJlZCBmb3IgVURNQS8xMzM8YnIgLz6gICZsdDs1 Jmd0O1ugoKAgMS40MzExNjRdIHNjc2kgMDowOjA6MDogRGlyZWN0LUFjY2Vzc6CgoKAgQVRBoKCg oKAgSGl0YWNoaSBIVFM1NDMyMyBGQjRPIFBROiAwIEFOU0k6IDU8YnIgLz6gICZsdDs1Jmd0O1ug oKAgMS40MzE1NjBdIHNkIDA6MDowOjA6IFtzZGFdIDYyNTE0MjQ0OCA1MTItYnl0ZSBsb2dpY2Fs IGJsb2NrczogKDMyMCBHQi8yOTggR2lCKTxiciAvPqAgJmx0OzUmZ3Q7W6CgoCAxLjQzMTY3Ml0g c2QgMDowOjA6MDogW3NkYV0gV3JpdGUgUHJvdGVjdCBpcyBvZmY8YnIgLz6gICZsdDs3Jmd0O1ug oKAgMS40MzE2NzVdIHNkIDA6MDowOjA6IFtzZGFdIE1vZGUgU2Vuc2U6IDAwIDNhIDAwIDAwPGJy IC8+oCAmbHQ7NSZndDtboKCgIDEuNDMxOTE1XSBzZCAwOjA6MDowOiBbc2RhXSBXcml0ZSBjYWNo ZTogZW5hYmxlZCwgcmVhZCBjYWNoZTogZW5hYmxlZCwgZG9lc24ndCBzdXBwb3J0IERQTyBvciBG VUE8YnIgLz6gICZsdDs2Jmd0O1ugoKAgMS40NDEwNjRdIGF0YTIuMDA6IEFUQS04OiBXREMgV0Qz MjAwQkVLVC0wMEYzVDAsIDExLjAxQTExLCBtYXggVURNQS8xMzM8YnIgLz6gICZsdDs2Jmd0O1ug oKAgMS40NDEwNjddIGF0YTIuMDA6IDYyNTE0MjQ0OCBzZWN0b3JzLCBtdWx0aSAxNjogTEJBNDgg TkNRIChkZXB0aCAzMS8zMiksIEFBPGJyIC8+oCAmbHQ7NiZndDtboKCgIDEuNDQyOTc4XSBhdGEy LjAwOiBjb25maWd1cmVkIGZvciBVRE1BLzEzMzxiciAvPqAgJmx0OzUmZ3Q7W6CgoCAxLjQ0MzIw N10gc2NzaSAxOjA6MDowOiBEaXJlY3QtQWNjZXNzoKCgoCBBVEGgoKCgoCBXREMgV0QzMjAwQkVL VC0wIDExLjAgUFE6IDAgQU5TSTogNTxiciAvPqAgJmx0OzUmZ3Q7W6CgoCAxLjQ0MzM4N10gc2Qg MTowOjA6MDogW3NkYl0gNjI1MTQyNDQ4IDUxMi1ieXRlIGxvZ2ljYWwgYmxvY2tzOiAoMzIwIEdC LzI5OCBHaUIpPGJyIC8+oCAmbHQ7NSZndDtboKCgIDEuNDQzNzA3XSBzZCAxOjA6MDowOiBbc2Ri XSBXcml0ZSBQcm90ZWN0IGlzIG9mZjxiciAvPqAgJmx0OzcmZ3Q7W6CgoCAxLjQ0MzcxMF0gc2Qg MTowOjA6MDogW3NkYl0gTW9kZSBTZW5zZTogMDAgM2EgMDAgMDA8YnIgLz6gICZsdDs1Jmd0O1ug oKAgMS40NDM3NTZdIHNkIDE6MDowOjA6IFtzZGJdIFdyaXRlIGNhY2hlOiBlbmFibGVkLCByZWFk IGNhY2hlOiBlbmFibGVkLCBkb2Vzbid0IHN1cHBvcnQgRFBPIG9yIEZVQTxiciAvPqAgJmx0OzYm Z3Q7W6CgoCAxLjQ1OTQzOF2gIHNkYTogc2RhMSBzZGEyIHNkYTMgc2RhNDxiciAvPqAgJmx0OzUm Z3Q7W6CgoCAxLjQ2MDE5N10gc2QgMDowOjA6MDogW3NkYV0gQXR0YWNoZWQgU0NTSSBkaXNrPGJy IC8+oCAmbHQ7NiZndDtboKCgIDEuNDc2Mzk0XSBTeW5hcHRpY3MgVG91Y2hwYWQsIG1vZGVsOiAx LCBmdzogNi4zLCBpZDogMHgxMmEwYjEsIGNhcHM6IDB4YTA0NzExLzB4YTA0MDAwLzB4MDxiciAv PqAgJmx0OzYmZ3Q7W6CgoCAxLjQ4MTg5OF2gIHNkYjogc2RiMSBzZGIyIHNkYjM8YnIgLz6gICZs dDs1Jmd0O1ugoKAgMS40ODIyNTRdIHNkIDE6MDowOjA6IFtzZGJdIEF0dGFjaGVkIFNDU0kgZGlz azwvcD48cD48L3A+PHA+PC9wPjxwPjwvcD48cD48L3A+PHA+PC9wPjxwPjwvcD48cD48YnIgLz4m Z3Q7Jmd0OyAmZ3Q7PGJyIC8+Jmd0OyZndDsgJmd0OyZndDsgSSB3b3VsZCBsaWtlIHRvIGtub3cg dGhlIGNhdXNlIG9mIHRoaXMgbG9nIHJlY292ZXJ5IGZhaWx1cmUgYW5kIGlmPGJyIC8+Jmd0OyZn dDsgdGhlcmU8YnIgLz4mZ3Q7Jmd0OyAmZ3Q7PGJyIC8+Jmd0OyZndDsgJmd0OyBZb3UndmUgZ290 IGFuIG9sZCwgdW5zdXBwb3J0ZWQga2VybmVsIHRoYXQgd2FzIGdvaW5nIHRocm91Z2g8YnIgLz4m Z3Q7Jmd0OyAmZ3Q7IHNpZ25pZmljYW50IGNoYW5nZXMgdG8gdGhlIGxvZyBjb2RlIGF0IHRoZSB0 aW1lLCBzbyBpdCBtYXkgbm90IGJlPGJyIC8+Jmd0OyZndDsgJmd0OyBwb3NzaWJsZSB0byB3b3Jr IG91dCB3aGF0IHRoZSBwcm9ibGVtIHdhcy4gSXQgc2VlbXMgbGlrZWx5IHRoYXQgdGhlPGJyIC8+ Jmd0OyZndDsgJmd0OyBwb3dlciBsb3NzIGNhdXNlZCB0aGUgZGlzayBub3QgdG8gd3JpdGUgZXZl cnl0aGluZyBpdCBzaG91bGQgaGF2ZSB0bzxiciAvPiZndDsmZ3Q7ICZndDsgdGhlIGxvZyAtIGxh cHRvcHMgYXJlIG5vdCBzdXBwb3NlZCB0byBqdXN0IGxvc2UgcG93ZXIgYmVjYXVzZTxiciAvPiZn dDsmZ3Q7ICZndDsgdGhleSBoYXZlIGEgYnVpbHQgaW4gVVBTIChpLmUuIGJhdHRlcnkpLi4uLjxi ciAvPiZndDsmZ3Q7PGJyIC8+Jmd0OyZndDsgTXkgbm90ZSBib29rIGlzIGNvbm5lY3RlZCB0byB0 aGUgbWFpbnMsIGFuZCB0aGVyZSBpcyBubyBiYXR0ZXJ5LiAgVGhlPGJyIC8+Jmd0OyZndDsgQWNl cjxiciAvPiZndDsmZ3Q7IHVzZXIgbWFudWFsIGFkdmlzZXMgcmVtb3ZpbmcgdGhlIGJhdHRlcnkg d2hlbiBvbmUgaXMgY29ubmVjdGVkIHRvIHRoZTxiciAvPiZndDsmZ3Q7IG1haW5zLCBzaW5jZSBy ZXBlYXRlZCBjaGFyZ2luZyBvZiBiYXR0ZXJ5IHdpbGwgc2hvcnRlbiBpdHMgbGlmZSBzcGFuLjxi ciAvPiZndDsgPGJyIC8+Jmd0OyBJdCdzIG5vdCBjaGFyZ2luZyBMaS1pb24gYmF0dGVyaWVzIHRo YXQgc2hvcnRlbnMgdGhlaXIgbGlmZSAtIGl0J3M8YnIgLz4mZ3Q7IGhpZ2ggdGVtcGVyYXR1cmVz IHRoYXQgc2hvcnRlbiBpdC4gSU9XcywgdGhlIHJlYXNvbiBmb3IgcmVtb3ZpbmcgdGhlPGJyIC8+ Jmd0OyBiYXR0ZXJ5IHdoZW4gb24gQUMgaXMgdG8gcHJldmVudCBoZWF0IHNvYWsgYW5kIHRoZSBi YXR0ZXJ5PGJyIC8+Jmd0OyBzdXN0YWluaW5nIGVsZXZhdGVkIHRlbXBlcmF0dXJlcyBvdmVyIGxv bmcgcGVyaW9kcyBvZiB0aW1lLjxiciAvPiZndDsgPGJyIC8+Jmd0OyBFdmVuIHNvLCBwcm9wZXJs eSBkZXNpZ25lZCBsYXB0b3BzIGRvbid0IHN1ZmZlciBmcm9tIGhlYXQgc29hayBvcjxiciAvPiZn dDsgY2hhcmdlIGN5Y2xlIHJlbGF0ZWQgYmF0dGVyeSBsaWZlIHByb2JsZW1zLCBhbmQgZW52aXJv bm1lbnRhbDxiciAvPiZndDsgY29uZGl0aW9ucyBwbGF5IG1vcmUgb2YgYSBwYXJ0IGluIGRldGVy bWluaW5nIGJhdHRlcnkgbGlmZSB0aGFuPGJyIC8+Jmd0OyB1c2FnZS9jaGFyZ2UgcGF0dGVybnMu Li48YnIgLz4mZ3Q7IDxiciAvPiZndDsmZ3Q7ICZndDsgVGhlIGZpbGVzIGluIGxvc3QrZm91bmQg YXJlIG51bWJlcmVkIGJ5IHRoZWlyIGlub2RlIG51bWJlci4gWW91IG5lZWQ8YnIgLz4mZ3Q7Jmd0 OyAmZ3Q7IHRvIGxvb2sgYXQgdGhlIGNvbnRlbnRzIG9mIHRoZW0gdG8gZGV0ZXJtaW5lIHdoZXJl IHRoZXkgY2FtZSBmcm9tLjxiciAvPiZndDsmZ3Q7PGJyIC8+Jmd0OyZndDsgSW5vZGUgbnVtYmVy cyBhcmUgbm90IGluZm9ybWF0aXZlLCByaWdodD88YnIgLz4mZ3Q7IDxiciAvPiZndDsgU3VyZSwg YnV0IHdoZW4geW91J3ZlIGhhZCBhIGRpcmVjdG9yeSBjb3JydXB0aW9uIGFuZCB0aGUgbmFtZXMg aGF2ZTxiciAvPiZndDsgYmVlbiBsb3N0LCB3aGF0IGRvIHlvdSBuYW1lIHRoZSBmaWxlcyBhbmQg ZGlyZWN0b3JpZXMgdGhhdCBhcmU8YnIgLz4mZ3Q7IGZvdW5kPyBBbGwgd2UgY2FuIGRvIGlzIG5h bWUgdGhlbSBzb21ldGhpbmcgdW5pcXVlLCBoZW5jZSB0aGUgdXNlIG9mPGJyIC8+Jmd0OyB0aGUg aW5vZGUgbnVtYmVyLjxiciAvPiZndDsgPGJyIC8+Jmd0OyZndDsgVGV4dCBmaWxlcyBhcmUgcmVh ZGFibGUsIGJ1dCBiaW5hcmllcy4uLi4uLiwgSSB3aWxsIGhhdmUgbm8gY2x1ZSwgYW5kIGlmPGJy IC8+Jmd0OyZndDsgSTxiciAvPiZndDsmZ3Q7IGRlbGV0ZSB0aGVtLCB3aG8ga25vd3MgaWYgSSBh bSBkZWxldGluZyBzb21lIHRoaW5nIHJlYWxseSBpbXBvcnRhbnQ/PGJyIC8+Jmd0OyA8YnIgLz4m Z3Q7IE9ubHkgYnkgbG9va2luZyBhdCB0aGVtIGNhbiB5b3Uga25vdy4gUmVnYXJkbGVzcyBvZiB3 aGF0IGZpbGVzeXN0ZW08YnIgLz4mZ3Q7IHlvdSBhcmUgdXNpbmcsIHJlY292ZXJ5IG9mIGZpbGVz IGFuZCBkaXJlY3RvcmllcyBmcm9tIGxvc3QrZm91bmQgaXM8YnIgLz4mZ3Q7IHRoZSBzYW1lIHBy b2Nlc3MuIGUuZy4gZG8gYW4gcnBtIGNoZWNrIHRvIHNlZSBpZiBhbGx0ZWggaW5zdGFsbGVkPGJy IC8+Jmd0OyBwYWNrYWdlcyBhcmUgaW50YWN0LiB0aGF0IHdpbGwgbmFycm93IGRvd24gd2hlcmUg YWxsIHlvdXIgYmluYXJpZXM8YnIgLz4mZ3Q7IGNhbWUgZnJvbS4gdXNlIG9mIHN0cmluZ3MgY2Fu IGFsc28gdGVsbCB5b3Ugd2hhdCB0aGUgYmluYXJ5IGlzLiBlLmc6PGJyIC8+Jmd0OyA8YnIgLz4m Z3Q7ICQgc3RyaW5ncyAvc2Jpbi94ZnNfcmVwYWlyIHxncmVwIHhmc19yZXBhaXI8YnIgLz4mZ3Q7 IHJlLXJ1bm5pbmcgeGZzX3JlcGFpci4gIElmIHlvdSBhcmUgdW5hYmxlIHRvIG1vdW50IHRoZSBm aWxlc3lzdGVtLCB0aGVuPGJyIC8+Jmd0OyB1c2U8YnIgLz4mZ3Q7IFBsZWFzZSBydW4gYSBtb3Jl IHJlY2VudCB2ZXJzaW9uIG9mIHhmc19yZXBhaXIuPGJyIC8+Jmd0OyAkPGJyIC8+Jmd0OyA8YnIg Lz4mZ3Q7Jmd0OyBJbnR1aXRpdmVseSwgdGhlIG9ubHkgZmlsZXMgaW4gcm9vdCBmaWxlIHN5c3Rl bSAoYnkgdGhlIHdheSwgcm9vdCBhbHNvPGJyIC8+Jmd0OyZndDsgY29udGFpbnMgL2Jvb3QpIHRo YXQgYXJlIG9wZW4gZm9yIHdyaXRpbmcgYXJlIHRob3NlIGluIGxvZ3MgYW5kIC90bXAgYW5kPGJy IC8+Jmd0OyZndDsgL3Zhci90bXAsIEkgaG9wZSB0aGF0IGlzIHRoZSBjYXNlIGFuZCBJIGNhbiBz YWZlbHkgZGlzY2FyZCB0aG9zZSBpbjxiciAvPiZndDsmZ3Q7IGxvc3QrZm91bmQuPGJyIC8+Jmd0 OyZndDs8YnIgLz4mZ3Q7Jmd0OyBJIGFsc28gaG9wZSB0aGF0IHRoZSBpbm9kZSBsaW5rIGNsZWFu LXVwcyBkb25lIGJ5IHhmc19yZXBhaXIgZG8gbm90PGJyIC8+Jmd0OyZndDsgYWN0dWFsbHkgcmVt b3ZlIGFueSBmaWxlcyB0aGF0IGFyZSByZWFsbHkgdGhlcmUuPGJyIC8+Jmd0OyA8YnIgLz4mZ3Q7 IERlZmluZSAmcXVvdDtyZWFsbHkgdGhlcmUmcXVvdDsgd2hlbiBpbXBvcnRhbnQgbWV0YWRhdGEg KGkuZS4gdGhlIGxvZykgaGFzPGJyIC8+Jmd0OyBiZWVuIGNvcnJ1cHRlZCBhbmQgaXMgbm90IGF2 YWlsYWJsZSBhbnkgbW9yZS4gIEluZGVlZCwgaWYgdGhpbmdzPGJyIC8+Jmd0OyBsaWtlIGJ0cmVl IHNwbGl0cyBvZiBtZXJnZXMgb2NjdXJyZWQgaW4gdGhlIGxvZywgYW5kIHRoZXkgYXJlPGJyIC8+ Jmd0OyBwYXJ0aWFsbHkgd3JpdHRlbiB0byBkaXNrLCBpdCdzIGVudGlyZWx5IHBvc3NpYmxlIHRo YXQgeW91IGNvdWxkPGJyIC8+Jmd0OyBsb3NlIGRpcmVjdG9yeSByZWZlcmVuY2VzIHRvIGlub2Rl cyB0aGF0IGhhdmVuJ3QgYmVlbiBtb2RpZmllZCBmb3I8YnIgLz4mZ3Q7IHNvbWUgdGltZS4uLi48 YnIgLz4mZ3Q7IDxiciAvPiZndDsgUmVtZW1iZXIsIGxpa2UgYWxsIGZzY2sgcHJvZ3JhbXMsIHhm c19yZXBhaXIgaXMgYSBiZXN0IGVmZm9ydDxiciAvPiZndDsgYXR0ZW1wdCBhdCBjb3JyZWN0aW5n IHRoZSBwcm9ibGVtcyBmb3VuZCAgLSB0aGVyZSBhcmUgbm8gZ3VhcmFudGVlczxiciAvPiZndDsg Z2l2ZW4gYWJvdXQgd2hhdCBpdCBjYW4gYW5kIGNhbid0IHJlY292ZXIgd2hlbiBpdCBydW5zLi4u PGJyIC8+Jmd0OyA8YnIgLz4mZ3Q7IENoZWVycyw8YnIgLz4mZ3Q7IDxiciAvPiZndDsgRGF2ZS48 YnIgLz4mZ3Q7IC0tPGJyIC8+Jmd0OyBEYXZlIENoaW5uZXI8YnIgLz4mZ3Q7IGRhdmlkQGZyb21v cmJpdC5jb208YnIgLz4mZ3Q7IDxiciAvPjxiciAvPjxiciAvPkNoaW4gR2ltIExlb25nPGJyIC8+ UGVyZm9ybWFuY2UgQ29tcHV0aW5nIEVuZ2luZWVyPGJyIC8+UGVyZm9ybWFuY2UgQ29tcHV0aW5n IExMUDxiciAvPjxiciAvPmh0dHA6Ly9wZXJmb3JtYW5jZS1jb21wdXRpbmcubmV0PGJyIC8+Q0hJ Tl9HaW1fTGVvbmdAcGVyZm9ybWFuY2UtY29tcHV0aW5nLm5ldDxiciAvPlRlbDogKzY1LTk3NDY5 NDgyCjwvcD4= ------=_20120903001305_82642-- From raghu.prabhu13@gmail.com Sun Sep 2 19:44:33 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.7 required=5.0 tests=BAYES_00,FREEMAIL_FROM, J_CHICKENPOX_21,T_DKIM_INVALID,URI_OBFU_WWW autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q830iXoh102737 for ; Sun, 2 Sep 2012 19:44:33 -0500 X-ASG-Debug-ID: 1346633127-04cb6c236166830001-NocioJ Received: from mail-pz0-f53.google.com (mail-pz0-f53.google.com [209.85.210.53]) by cuda.sgi.com with ESMTP id DjKdUbXdbaEJ9jFL (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 02 Sep 2012 17:45:27 -0700 (PDT) X-Barracuda-Envelope-From: raghu.prabhu13@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.210.53 X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.53] Received: by dadg9 with SMTP id g9so4329446dad.26 for ; Sun, 02 Sep 2012 17:45:27 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.53] X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.53] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=date:from:to:cc:subject:message-id:mail-followup-to:references :mime-version:content-type:content-disposition:in-reply-to :x-operating-system:x-editor:user-agent; bh=eWEYy3Gsn0hvMMa53sTmgEAUbKLRNw5y4Wiuxb5FLVU=; b=f/dmd3/qhzysc+H3UK9to9iiatnvurN14PeqcSJONnk9xIzZHSyQW0Y2jIAV3Fl7MG a6IJTurTjYqGV9v62xwfTF1C31+I1hJAoVc/MkNzcG3MHP1/6+cBHt6aiO3BnWFXmcCZ OIldjrTyPgIUlve6wEJeLxxUjUc4lSmCT0Ft+7l/4pBazq6un9Okm8k3OlOAaPiFJ2JD ffTrT2TNQ+GKTL6RYECuCWR+8ydBmLhGvRud6kibN44vHk58IeY17ANfneEA1xGkZWL4 dl8ilY9XWSYqf9EibClPjjTWpfLEjAtG4hFmi7Bx3hTK1M3wvX2USEeMON2BrYP4vZ7u 1X2w== Received: by 10.66.78.9 with SMTP id x9mr30081737paw.84.1346633126956; Sun, 02 Sep 2012 17:45:26 -0700 (PDT) Received: from localhost ([122.167.213.46]) by mx.google.com with ESMTPS id oc2sm8638678pbb.69.2012.09.02.17.45.24 (version=TLSv1/SSLv3 cipher=OTHER); Sun, 02 Sep 2012 17:45:26 -0700 (PDT) Date: Mon, 3 Sep 2012 06:15:21 +0530 From: Raghavendra D Prabhu To: Eric Sandeen Cc: xfs@oss.sgi.com Subject: Re: XFS regression: Oops in xfs_buf_do_callbacks on xfstest 137 Message-ID: <20120903004521.GA61118@Archie> X-ASG-Orig-Subj: Re: XFS regression: Oops in xfs_buf_do_callbacks on xfstest 137 Mail-Followup-To: Eric Sandeen , xfs@oss.sgi.com References: <501ABC84.6030708@sandeen.net> <20120817180254.GA15382@infradead.org> <502E8A4F.9050105@sandeen.net> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="3uo+9/B/ebqu+fSQ" Content-Disposition: inline In-Reply-To: <502E8A4F.9050105@sandeen.net> X-Operating-System: Arch linux x86_64 3.5.3-1-ARCH X-Editor: VIM - Vi IMproved 7.3 User-Agent: Mutt/1.5.21 (2011-07-01) X-Barracuda-Connect: mail-pz0-f53.google.com[209.85.210.53] X-Barracuda-Start-Time: 1346633127 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107437 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature --3uo+9/B/ebqu+fSQ Content-Type: multipart/mixed; boundary="BOKacYhQ+x31HxR3" Content-Disposition: inline --BOKacYhQ+x31HxR3 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hi, * On Fri, Aug 17, 2012 at 01:15:43PM -0500, Eric Sandeen wrote: >On 8/17/12 1:02 PM, Christoph Hellwig wrote: >>I'd be this is my new code added to xfs_buf_item_unpin, but I don't >>quite understand why. It's been a long time since I wrote that code, >>but I had to add that code to make sure we clear all buffers during >>a forced shutdown. Can you test if things go away if you just remove it >>(even if causes other hangs?) > >It does go away AFAIK, since the bisect found it. > >Sadly it's been on the back burner for me, under other deadline pressure. > >-Eric > >_______________________________________________ >xfs mailing list >xfs@oss.sgi.com >http://oss.sgi.com/mailman/listinfo/xfs I hit the same bug on xfstest 137 while testing and it is indeed=20 POISON_FREE. Here are the intermediate backtraces: http://sprunge.us/HZeD=20 I am also attaching the full backtrace. git head: commit b686d1f79acb65c6a34473c15fcfa2ee54aed8e2 Author: Jeff Liu Date: Tue Aug 21 17:12:18 2012 +0800 Regards, --=20 Raghavendra Prabhu GPG Id : 0xD72BE977 Fingerprint: B93F EBCB 8E05 7039 CD3C A4B8 A616 DCA1 D72B E977 www: wnohang.net --BOKacYhQ+x31HxR3 Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="full.backtrace" Content-Transfer-Encoding: quoted-printable #0 xfs_buf_iodone_callbacks (bp=3D0xffff88007a9d2d00) at fs/xfs/xfs_buf_it= em.c:1057 lip =3D mp =3D lasttime =3D 0 lasttarg =3D 0x0 __func__ =3D "xfs_buf_iodone_callbacks" #1 0xffffffff815824ee in xfs_buf_iodone_work (work=3Dwork@entry=3D0xffff88= 007a9d2e28) at fs/xfs/xfs_buf.c:1006 bp =3D 0xffff88007a9d2d00 __func__ =3D "xfs_buf_iodone_work" #2 0xffffffff81582dec in xfs_buf_ioend (bp=3Dbp@entry=3D0xffff88007a9d2d00= , schedule=3Dschedule@entry=3D0) at fs/xfs/xfs_buf.c:1027 __func__ =3D "xfs_buf_ioend" #3 0xffffffff8166e161 in xfs_buf_item_unpin (lip=3D0xffff88007a9c0d20, rem= ove=3D1) at fs/xfs/xfs_buf_item.c:533 bp =3D 0xffff88007a9d2d00 ailp =3D 0xffff88007aad5240 stale =3D 0 __func__ =3D "xfs_buf_item_unpin" #4 0xffffffff8165d104 in xfs_trans_committed_bulk (ailp=3D0xffff88007aad52= 40, log_vector=3D, commit_lsn=3D0, aborted=3Daborted@entry= =3D2) at fs/xfs/xfs_trans.c:1305 lip =3D 0xffff88007a9c0d20 item_lsn =3D 0 log_items =3D {0xffff88007f9d37c0, 0xffff880079fbbe80, 0xffff880072= 4d5ac8, 0xffffffff81dba277 <__schedule+3791>, 0xffff8800724d5b28, 0xffff880= 07ad99560, 0xffff88007ad99560, 0xffff88007aebef60, 0x2 ,= 0xffff8800790df578, 0xffff8800724d5b98,=20 0xffffffff8189d08e , 0xffff88007f8000= 00, 0x3 , 0x1 , 0xffff88007aaf2b28, 0= xffff8800724d5fd8, 0xffff8800724d4000, 0x2 , 0xffff88007= 24d5ad8, 0xffffffff810cd59a ,=20 0xffffffff81dbeb74 , 0xffff8800724d59d0, 0xffffffff= 81e03e40 , 0xffff880079151cb8, 0x2 , 0xf= fff8800724adfb0, 0x2 , 0x0 , 0xffff8800= 7affd520, 0xffff88007aad5240,=20 0xffffffffffffff10} lv =3D 0xffff88007affd520 cur =3D i =3D __func__ =3D "xfs_trans_committed_bulk" #5 0xffffffff81669107 in xlog_cil_committed (args=3Dargs@entry=3D0xffff880= 07ad99560, abort=3Dabort@entry=3D2) at fs/xfs/xfs_log_cil.c:337 ctx =3D 0xffff88007ad99560 mp =3D 0xffff88007aebef60 __func__ =3D "xlog_cil_committed" #6 0xffffffff8166a301 in xlog_cil_push (log=3Dlog@entry=3D0xffff8800724adf= b0) at fs/xfs/xfs_log_cil.c:582 cil =3D 0xffff8800790df480 lv =3D ctx =3D 0xffff88007ad99560 new_ctx =3D commit_iclog =3D 0xffffffff81170cb4 <__lock_release+100> tic =3D 0xffff880079151c00 num_iovecs =3D error =3D thdr =3D { th_magic =3D 1414676814,=20 th_type =3D 42,=20 th_tid =3D -576842867,=20 th_num_items =3D 3777 } lhdr =3D { i_addr =3D 0xffff8800724d5be8,=20 i_len =3D 16,=20 i_type =3D 19 } lvhdr =3D { lv_next =3D 0xffff88007affd520,=20 lv_niovecs =3D 1,=20 lv_iovecp =3D 0xffff8800724d5bd8,=20 lv_item =3D 0x0 ,=20 lv_buf =3D 0x0 ,=20 lv_buf_len =3D 0 } commit_lsn =3D push_seq =3D 1 __func__ =3D "xlog_cil_push" #7 0xffffffff8166a4a9 in xlog_cil_push_foreground (log=3Dlog@entry=3D0xfff= f8800724adfb0, push_seq=3Dpush_seq@entry=3D1) at fs/xfs/xfs_log_cil.c:659 cil =3D 0xffff8800790df480 __func__ =3D "xlog_cil_push_foreground" #8 0xffffffff8166a8f1 in xlog_cil_force_lsn (log=3Dlog@entry=3D0xffff88007= 24adfb0, sequence=3D1) at fs/xfs/xfs_log_cil.c:771 cil =3D 0xffff8800790df480 ctx =3D commit_lsn =3D -1 __func__ =3D "xlog_cil_force_lsn" #9 0xffffffff81665d5c in xlog_cil_force (log=3D0xffff8800724adfb0) at fs/x= fs/xfs_log_priv.h:668 No locals. #10 _xfs_log_force (mp=3Dmp@entry=3D0xffff88007aebef60, flags=3Dflags@entry= =3D1, log_flushed=3Dlog_flushed@entry=3D0x0 ) at fs/xfs/xf= s_log.c:2889 log =3D 0xffff8800724adfb0 iclog =3D lsn =3D __func__ =3D "_xfs_log_force" #11 0xffffffff81666479 in xfs_log_force (mp=3Dmp@entry=3D0xffff88007aebef60= , flags=3Dflags@entry=3D1) at fs/xfs/xfs_log.c:3004 error =3D __func__ =3D "xfs_log_force" #12 0xffffffff815ad9ec in xfs_quiesce_data (mp=3Dmp@entry=3D0xffff88007aebe= f60) at fs/xfs/xfs_sync.c:310 error =3D error2 =3D 0 __func__ =3D "xfs_quiesce_data" #13 0xffffffff815a78a0 in xfs_fs_sync_fs (sb=3D, wait=3D) at fs/xfs/xfs_super.c:946 mp =3D 0xffff88007aebef60 error =3D __func__ =3D "xfs_fs_sync_fs" #14 0xffffffff813b0389 in __sync_filesystem (sb=3Dsb@entry=3D0xffff88007a1a= d668, wait=3Dwait@entry=3D1) at fs/sync.c:38 __func__ =3D "__sync_filesystem" #15 0xffffffff813b0477 in sync_filesystem (sb=3Dsb@entry=3D0xffff88007a1ad6= 68) at fs/sync.c:66 ret =3D __func__ =3D "sync_filesystem" #16 0xffffffff8134da7f in generic_shutdown_super (sb=3D0xffff88007a1ad668) = at fs/super.c:439 sop =3D 0xffffffff81e86360 __func__ =3D "generic_shutdown_super" #17 0xffffffff8134dc62 in kill_block_super (sb=3D) at fs/sup= er.c:1104 bdev =3D 0xffff88007d0115c0 mode =3D 131 __func__ =3D "kill_block_super" #18 0xffffffff8134ed14 in deactivate_locked_super (s=3Ds@entry=3D0xffff8800= 7a1ad668) at fs/super.c:306 fs =3D 0xffffffff828057c0 __func__ =3D "deactivate_locked_super" #19 0xffffffff813501c7 in deactivate_super (s=3Ds@entry=3D0xffff88007a1ad66= 8) at fs/super.c:337 __func__ =3D "deactivate_super" #20 0xffffffff813902f4 in mntfree (mnt=3D0xffff88007ababd40) at fs/namespac= e.c:855 m =3D 0xffff88007ababd60 sb =3D 0xffff88007a1ad668 #21 mntput_no_expire (mnt=3Dmnt@entry=3D0xffff88007ababd40) at fs/namespace= =2Ec:893 __func__ =3D "mntput_no_expire" #22 0xffffffff81392ce5 in sys_umount (name=3D, flags=3D0) at= fs/namespace.c:1276 path =3D mnt =3D 0xffff88007ababd40 retval =3D 0 lookup_flags =3D __func__ =3D "sys_umount" #23 No locals. #24 0x00007f66053c34f7 in ?? () No symbol table info available. #25 0x000000050003123b in ?? () No symbol table info available. #26 0x0000000000100000 in cpu_lock_stats () No symbol table info available. Continuing. Program received signal SIGINT, Interrupt. 0xffffffff810607bb in native_safe_halt () at /media/Vone/kernel/xfs-next/ar= ch/x86/include/asm/irqflags.h:49 49 asm volatile("sti; hlt": : :"memory"); A debugging session is active. Inferior 1 [Remote target] will be killed. Quit anyway? (y or n)=20 --BOKacYhQ+x31HxR3-- --3uo+9/B/ebqu+fSQ Content-Type: application/pgp-signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.19 (GNU/Linux) iQEcBAEBAgAGBQJQQ/2hAAoJEKYW3KHXK+l3L3AH/1EQQyel63dJNyLcERgPHgiZ iVGSINpUaWu8r40+3CCr6S6tAVwFbRF+RjNCQa1IOOsn0Stiu4Xr92f1RcmJm8+B ooNULuQ4tcv8cxJRzqLd1CWfLr32T0fY+Xb9M4M32FnaSCWmWmdRkAdeTk53X8Et Als6B2oBr3iiHKQ2FqPg68+0IbkvCYPG6/QP/POiPmxJ3cs9x589wjDc+Pkzi6xK ffegDYSHoilOZG4OQQgV07vTv8sITH0u+udmko9advYYuYR5OCEWZ5plBBWW1Uf7 w2MJRCQbQVCw4lQ27/yvAc5FiaRr+uFkgsz+3TrqGEMPpDo6XxkET2Az8To1oBA= =j16h -----END PGP SIGNATURE----- --3uo+9/B/ebqu+fSQ-- From raghu.prabhu13@gmail.com Sun Sep 2 22:04:17 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.7 required=5.0 tests=BAYES_00,FREEMAIL_FROM, J_CHICKENPOX_21,T_DKIM_INVALID,URI_OBFU_WWW autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8334H0t123792 for ; Sun, 2 Sep 2012 22:04:17 -0500 X-ASG-Debug-ID: 1346641511-04cbb0271860da0001-NocioJ Received: from mail-pb0-f53.google.com (mail-pb0-f53.google.com [209.85.160.53]) by cuda.sgi.com with ESMTP id EeXeR93dJS5UfI8j (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 02 Sep 2012 20:05:12 -0700 (PDT) X-Barracuda-Envelope-From: raghu.prabhu13@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.160.53 X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.53] Received: by pbbro2 with SMTP id ro2so8989606pbb.26 for ; Sun, 02 Sep 2012 20:05:11 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.53] X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.53] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=date:from:to:subject:message-id:mail-followup-to:references :mime-version:content-type:content-disposition:in-reply-to :x-operating-system:x-editor:user-agent; bh=W10DDrSAHxm/jP0yHEY0gj5o7D3qen63eqOfPJYoHSU=; b=tBKoEloLAjd+6/MgzA0kmcY8hwnXtof+zA8ti7TqXkvUucO5I68+9k6KNgpcpe/D+Z MJa0sC7IqJ1mu/fW0hBUnL8kiBGzinkOO7tcLPa7XwRPQYduhuXJVx6KAOdZP3pB5j8x Q460Y+ADwpX11O0cfA6uO6izsXH5X0Xq6hcSMWNMKGBk49sDbN2mfnAqPD4A98gCw9bi /BgJEljZZrmfQyrE9D80c6HrHLUSAdrbvPZME5FZplJPRhkdBLoqgGmxDraaVZoE8Hcj MMbZ7PmG/BABgyIoziKkaBSjxU0oNW1Atsu9sWqmWPa+bzkhO54LK6D8G89gnjrZeeJf GrNQ== Received: by 10.68.221.72 with SMTP id qc8mr34448155pbc.63.1346641511606; Sun, 02 Sep 2012 20:05:11 -0700 (PDT) Received: from localhost ([122.167.213.46]) by mx.google.com with ESMTPS id ka4sm8876316pbc.61.2012.09.02.20.05.08 (version=TLSv1/SSLv3 cipher=OTHER); Sun, 02 Sep 2012 20:05:10 -0700 (PDT) Date: Mon, 3 Sep 2012 08:35:06 +0530 From: Raghavendra D Prabhu To: Eric Sandeen , xfs@oss.sgi.com Subject: Re: XFS regression: Oops in xfs_buf_do_callbacks on xfstest 137 Message-ID: <20120903030506.GA48608@Archie.local> X-ASG-Orig-Subj: Re: XFS regression: Oops in xfs_buf_do_callbacks on xfstest 137 Mail-Followup-To: Eric Sandeen , xfs@oss.sgi.com References: <501ABC84.6030708@sandeen.net> <20120817180254.GA15382@infradead.org> <502E8A4F.9050105@sandeen.net> <20120903004521.GA61118@Archie> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="PEIAKu/WMn1b1Hv9" Content-Disposition: inline In-Reply-To: <20120903004521.GA61118@Archie> X-Operating-System: Arch linux x86_64 3.5.3-1-ARCH X-Editor: VIM - Vi IMproved 7.3 User-Agent: Mutt/1.5.21 (2011-07-01) X-Barracuda-Connect: mail-pb0-f53.google.com[209.85.160.53] X-Barracuda-Start-Time: 1346641512 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107447 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature --PEIAKu/WMn1b1Hv9 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hi, * On Mon, Sep 03, 2012 at 06:15:21AM +0530, Raghavendra D Prabhu wrote: >Hi, > > >* On Fri, Aug 17, 2012 at 01:15:43PM -0500, Eric Sandeen wrote: >>On 8/17/12 1:02 PM, Christoph Hellwig wrote: >>>I'd be this is my new code added to xfs_buf_item_unpin, but I don't >>>quite understand why. It's been a long time since I wrote that code, >>>but I had to add that code to make sure we clear all buffers during >>>a forced shutdown. Can you test if things go away if you just remove it >>>(even if causes other hangs?) >> >>It does go away AFAIK, since the bisect found it. >> >>Sadly it's been on the back burner for me, under other deadline pressure. >> >>-Eric >> >>_______________________________________________ >>xfs mailing list >>xfs@oss.sgi.com >>http://oss.sgi.com/mailman/listinfo/xfs > >I hit the same bug on xfstest 137 while testing and it is indeed=20 >POISON_FREE. > >Here are the intermediate backtraces: http://sprunge.us/HZeD > >I am also attaching the full backtrace. > > >git head: > >commit b686d1f79acb65c6a34473c15fcfa2ee54aed8e2 > Author: Jeff Liu > Date: Tue Aug 21 17:12:18 2012 +0800 > With DEBUG_PAGEALLOC enabled, I got following: [ 182.925026] [] ? xfs_buf_iodone_work+0x43/0xb7 [ 182.925026] [] xfs_buf_iodone_callbacks+0x4d2/0x5aa [ 182.925026] [] ? xfs_buf_item_unpin+0x7b4/0x812 [ 182.925026] [] xfs_buf_iodone_work+0x43/0xb7 [ 182.925026] [] xfs_buf_ioend+0x29a/0x2fc [ 182.925026] [] xfs_buf_item_unpin+0x7b4/0x812 [ 182.925026] [] xfs_trans_committed_bulk+0x223/0x6d1 [ 182.925026] [] ? __slab_free+0xa46/0xc2f [ 182.925026] [] ? xlog_write+0x18b/0x95c [ 182.925026] [] ? debug_check_no_locks_freed+0x121/0x1= 7b [ 182.925026] [] ? kmem_cache_free+0x338/0x491 [ 182.925026] [] ? xfs_log_ticket_put+0xaf/0xbc [ 182.925026] [] xlog_cil_committed+0x3b/0x1fa [ 182.925026] [] xlog_cil_push+0x6ca/0x6f6 [ 182.925026] [] ? __lock_release+0x64/0xb6 [ 182.925026] [] xlog_cil_push_foreground+0x17c/0x1fa [ 182.925026] [] xlog_cil_force_lsn+0x90/0x27e [ 182.925026] [] ? sync_inodes_sb+0x23e/0x26c [ 182.925026] [] _xfs_log_force+0x67/0x620 [ 182.925026] [] ? wait_for_common+0x231/0x3ac [ 182.925026] [] xfs_log_force+0x164/0x1c2 [ 182.925026] [] xfs_quiesce_data+0x21/0x9f [ 182.925026] [] xfs_fs_sync_fs+0x5a/0xe0 [ 182.925026] [] __sync_filesystem+0x9e/0xc2 [ 182.925026] [] sync_filesystem+0xca/0x12d [ 182.925026] [] generic_shutdown_super+0x61/0x203 [ 182.925026] [] kill_block_super+0x41/0x1a6 [ 182.925026] [] deactivate_locked_super+0x9b/0x104 [ 182.925026] [] deactivate_super+0x147/0x187 [ 182.925026] [] mntput_no_expire+0x308/0x32a [ 182.925026] [] sys_umount+0x1a6/0x1e4 [ 182.925026] [] system_call_fastpath+0x16/0x1b Full here -- http://sprunge.us/CPKW=20 One more thing, in xfs_buf_do_callbacks, while ((lip =3D bp->b_fspriv) !=3D NULL) { bp->b_fspriv =3D lip->li_bio_list; ASSERT(lip->li_cb !=3D NULL); In the loop before the crash, lip->li_bio_list is NULL which=20 explains the use-after-free. >_______________________________________________ >xfs mailing list >xfs@oss.sgi.com >http://oss.sgi.com/mailman/listinfo/xfs Regards, --=20 Raghavendra Prabhu GPG Id : 0xD72BE977 Fingerprint: B93F EBCB 8E05 7039 CD3C A4B8 A616 DCA1 D72B E977 www: wnohang.net --PEIAKu/WMn1b1Hv9 Content-Type: application/pgp-signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.19 (GNU/Linux) iQEcBAEBAgAGBQJQRB5iAAoJEKYW3KHXK+l3/3sIAK7DAHaVxjpjkf38TQPyIKmK 0dho5D3gVfTd3WuDDBHzjI2onDYWiCT/ADGajGXlFGm9vjlrkurc09dusE5EeUXT AIJGWIc8rGoikW+WOnbdFlO6ux57vLXci0LGTqLrS6+f72T7ai/qIyS6MHxxu/+3 B1bNFj/QK5tWV/NqNOctvp2+axuQUu/IVd++gT2b1qyGYfx7H9qutINF6psOYQNa fNkVQc2/yYs40yGCIY7RjDlxkVuFKRgj8sM3CQtg23TRlBBE2HgtIkTj7k1u6Nfw MLFgvCBoDtgT6G/GQBhgMf08JtdEzwQHplM+oUbCtm6rZQMeJLnrFVqh/M2x7tI= =DHsg -----END PGP SIGNATURE----- --PEIAKu/WMn1b1Hv9-- From david@fromorbit.com Sun Sep 2 22:09:11 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8339BXc124771 for ; Sun, 2 Sep 2012 22:09:11 -0500 X-ASG-Debug-ID: 1346641805-04bdf078fe65720001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id RC71uXW4V7VE6hnq for ; Sun, 02 Sep 2012 20:10:06 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AsANAIEeRFB5LHJk/2dsb2JhbABFhRy1AgEBAn+BCIIgAQEFOhwjEAgDDgcDLhQlAyETiAy6EBSKeS9hfDSEYwOVWIk0hmeCdQ Received: from ppp121-44-114-100.lns20.syd6.internode.on.net (HELO dastard) ([121.44.114.100]) by ipmail06.adl6.internode.on.net with ESMTP; 03 Sep 2012 12:40:05 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1T8N30-0002gT-Ss; Mon, 03 Sep 2012 13:09:58 +1000 Date: Mon, 3 Sep 2012 13:09:58 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 02/13] xfs: rename the xfs_syncd workqueue Message-ID: <20120903030958.GN15292@dastard> X-ASG-Orig-Subj: Re: [PATCH 02/13] xfs: rename the xfs_syncd workqueue References: <1346328017-2795-1-git-send-email-david@fromorbit.com> <1346328017-2795-3-git-send-email-david@fromorbit.com> <20120901231722.GB27456@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20120901231722.GB27456@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1346641806 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107447 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat, Sep 01, 2012 at 07:17:22PM -0400, Christoph Hellwig wrote: > On Thu, Aug 30, 2012 at 10:00:06PM +1000, Dave Chinner wrote: > > From: Dave Chinner > > > > There is nothing "sync" realted to this work queue any more. It is a general > > purpose per-filesystem work queue. Rename it appropriately, and remove the > > "syncd" naming from various functions. > > > > Signed-off-by: Dave Chinner > > With the current leight-weight workqueues I don't see why we'd even want > a shared one for the different callers. Let's move the patch until > after killing xfs_flush_worker & co, and then add a workqueue for > background and the log sync individually. OK. It starts to make workqueues like slab caches - all the cool kids have got one. :) Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun Sep 2 22:35:42 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q833Zgsf128463 for ; Sun, 2 Sep 2012 22:35:42 -0500 X-ASG-Debug-ID: 1346643397-04cb6c23636c000001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id BJcsmJOm2Refgv9d for ; Sun, 02 Sep 2012 20:36:37 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AsANANMkRFB5LHJk/2dsb2JhbABFhRy1AgEBAn+BCIIgAQEFOhwjEAgDDgcDLhQlAyETiAy6DhSKeS9hfDSEYwOVWJAbgnU Received: from ppp121-44-114-100.lns20.syd6.internode.on.net (HELO dastard) ([121.44.114.100]) by ipmail06.adl6.internode.on.net with ESMTP; 03 Sep 2012 13:06:36 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1T8NSc-0002hI-3p; Mon, 03 Sep 2012 13:36:26 +1000 Date: Mon, 3 Sep 2012 13:36:26 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 05/13] xfs: sync work is now only periodic log work Message-ID: <20120903033626.GO15292@dastard> X-ASG-Orig-Subj: Re: [PATCH 05/13] xfs: sync work is now only periodic log work References: <1346328017-2795-1-git-send-email-david@fromorbit.com> <1346328017-2795-6-git-send-email-david@fromorbit.com> <20120901232343.GA31634@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20120901232343.GA31634@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1346643397 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107449 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat, Sep 01, 2012 at 07:23:43PM -0400, Christoph Hellwig wrote: > On Thu, Aug 30, 2012 at 10:00:09PM +1000, Dave Chinner wrote: > > From: Dave Chinner > > > > The only thing the periodic sync work does now is flush the AIL and > > idle the log. These are really functions of the log code, so move > > the work to xfs_log.c and rename it appropriately. > > > > The only wart that this leaves behind is the xfssyncd_centisecs > > sysctl, otherwise the xfssyncd is dead. Clean up any comments that > > related to xfssyncd to reflect it's passing. > > FYI: A while ago I looked into folding the work here into xfsaild. > While soing the periodic ail push there aka just waking up with a > timeout which we did more often anyway at that point was easy, getting > the log force / dummy log never really worked out. > > I think at least the former probably should be dropped here as well. Perhaps. We've always had a periodic log force as a get out gaol free card for issues with pinned objects, so I'm not really inclined to remove it/change that behaviour in this series. IOWs, while I do agree that the log covering and AIL pushing code should be more tightly integrated so that we can get the filesystem to an idle state much faster than we do now, I don't think this patchset is the place to start doing bits of that work. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun Sep 2 23:04:56 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8344uoj132893 for ; Sun, 2 Sep 2012 23:04:56 -0500 X-ASG-Debug-ID: 1346645150-04cbb0271962d20001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id jy6ZXwM1xh3tDLAh for ; Sun, 02 Sep 2012 21:05:51 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AsINAFAsRFB5LHJk/2dsb2JhbABFhRy1AgEBAn+BCIIgAQEBAwEBAQEbCRMcGAsFCwgDGC4UExIDIROIBwUMuXsUinkvYXw0hGMDlViQG4J1 Received: from ppp121-44-114-100.lns20.syd6.internode.on.net (HELO dastard) ([121.44.114.100]) by ipmail06.adl6.internode.on.net with ESMTP; 03 Sep 2012 13:35:24 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1T8Nud-0002io-Fg; Mon, 03 Sep 2012 14:05:23 +1000 Date: Mon, 3 Sep 2012 14:05:23 +1000 From: Dave Chinner To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: [PATCH V2 00/13] xfs: remove the xfssyncd mess Message-ID: <20120903040523.GP15292@dastard> X-ASG-Orig-Subj: Re: [PATCH V2 00/13] xfs: remove the xfssyncd mess References: <1346328017-2795-1-git-send-email-david@fromorbit.com> <5040C3A0.2050107@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5040C3A0.2050107@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1346645150 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107451 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Aug 31, 2012 at 09:01:04AM -0500, Mark Tinguely wrote: > On 08/30/12 07:00, Dave Chinner wrote: > >Version 2 of the patchset I described here: > > > >http://oss.sgi.com/archives/xfs/2012-06/msg00064.html > > > >This version has run through xfstests completely once, so it's > >less likely to let smoke out.... > > > >Version 2: > >- fix writeback_inodes_sb_if_idle call in xfs_create() > >- refreshed patch 13 before sending. > > > >_______________________________________________ > >xfs mailing list > >xfs@oss.sgi.com > >http://oss.sgi.com/mailman/listinfo/xfs > > I wanted to get a fast look at your patch series. I am getting the > following ASSERT on xfstest 179 when running the series with the > latest OSS soruces.The ASSERT appears to start at patch number 3. > Sorry these boxes won't kdump the top of tree kernels: > > [17474.545964] XFS: Assertion failed: atomic_read(&bp->b_hold) > 0, > file: /root/xfs/fs/xfs/xfs_buf.c, line: 896 FWIW, when you paste stack traces, can you turn off line wrapping when you paste it so the crash is simple to quote in reply? (use :set paste in mutt, the :set nopaste when finished pasting it in). > [17474.559784] Process umount (pid: 26427, threadinfo ... > [17474.559784] Call Trace: > [17474.559784] [] xfs_buf_rele+0xa4/0x1b0 [xfs] > [17474.559784] [] xfs_buf_iodone_work+0x46/0x50 [xfs] > [17474.559784] [] xfs_buf_ioend+0x96/0x120 [xfs] > [17474.559784] [] xfs_buf_iodone_callbacks+0x59/0x230 [xfs] > [17474.559784] [] xfs_buf_iodone_work+0x21/0x50 [xfs] > [17474.559784] [] xfs_buf_ioend+0x96/0x120 [xfs] > [17474.559784] [] xfs_buf_item_unpin+0x289/0x2d0 [xfs] > [17474.559784] [] xfs_trans_committed_bulk+0x213/0x300 [xfs] > [17474.559784] [] xlog_cil_committed+0x36/0x130 [xfs] > [17474.559784] [] xlog_cil_push+0x308/0x430 [xfs] > [17474.559784] [] xlog_cil_force_lsn+0x146/0x1b0 [xfs] > [17474.559784] [] _xfs_log_force+0x64/0x280 [xfs] > [17474.559784] [] xfs_log_force+0x54/0x80 [xfs] > [17474.559784] [] xfs_fs_sync_fs+0x2d/0x50 [xfs] > [17474.559784] [] __sync_filesystem+0x2b/0x50 > [17474.559784] [] sync_filesystem+0x43/0x60 > [17474.559784] [] generic_shutdown_super+0x36/0xe0 > [17474.559784] [] kill_block_super+0x2c/0x80 > [17474.559784] [] deactivate_locked_super+0x38/0x90 > [17474.559784] [] deactivate_super+0x61/0x70 > [17474.559784] [] mntput_no_expire+0x149/0x1b0 > [17474.559784] [] sys_umount+0x6e/0xd0 Nothing has been shut down in XFS at this point (i.e. .put_super() has not yet been called) so none of the shutdown changes could have caused this problem. Indeed, it looks like this is during a forced shutdown here in xfs_buf_item_unpin: } else if (freed && remove) { xfs_buf_lock(bp); xfs_buf_ioerror(bp, EIO); XFS_BUF_UNDONE(bp); xfs_buf_stale(bp); >>>>>> xfs_buf_ioend(bp, 0); } Now, xfs_buf_stale() does this: ASSERT(atomic_read(&bp->b_hold) >= 1); Which means that in calling xfs_buf_ioend(), at least two references to the buffer are being dropped. Working out why that is occurring will find the root cause of this problem. All that I can say at this point is that I find it highly unlikely that it is caused by the changes in this patchset. > I got this ASSERT when I ran it on the 8/27 OSS sources: > > [188646.952426] XFS: Assertion failed: > atomic_read(&iclog->ic_refcnt) == 0, file: > /root/xfs/fs/xfs/xfs_log.c, line: 2590 > [188646.967020] Process kworker/2:1H (pid: 356, threadinfo ffff8808396a4000, task ffff88083a9aa1c0) > [188646.967020] Call Trace: > [188646.967020] [] xlog_state_done_syncing+0x7f/0x110 [xfs] > [188646.967020] [] xlog_iodone+0x7e/0x100 [xfs] > [188646.967020] [] xfs_buf_iodone_work+0x21/0x50 [xfs] > [188646.967020] [] process_one_work+0x1d3/0x370 > [188646.967020] [] worker_thread+0x133/0x390 > [188646.967020] [] kthread+0x9e/0xb0 > [188646.967020] [] kernel_thread_helper+0x4/0x10 I've never seen that ASSERT fire. That implies we've got a log buffer that is being actively modified under IO, but I cannot see how that would happen. Was this during an unmount? What test? /me is starting to wonder about memory errors... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Sun Sep 2 23:20:40 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q834KeFx136448 for ; Sun, 2 Sep 2012 23:20:40 -0500 X-ASG-Debug-ID: 1346646094-04bdf078fe67fb0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 8CGCmogqPaNK52gP for ; Sun, 02 Sep 2012 21:21:35 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AsENAOMvRFB5LHJk/2dsb2JhbAA7CoUctQIBAQJ/gQiCIAEBBAEnExwjBQsIAw4KLhQlAyETiAcFugEUinkQH2F8NIRjA5VYkBuCdQ Received: from ppp121-44-114-100.lns20.syd6.internode.on.net (HELO dastard) ([121.44.114.100]) by ipmail06.adl6.internode.on.net with ESMTP; 03 Sep 2012 13:51:09 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1T8O9J-0002jP-On; Mon, 03 Sep 2012 14:20:33 +1000 Date: Mon, 3 Sep 2012 14:20:33 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [RFC PATCH 1/4] xfs: add EOFBLOCKS inode tagging/untagging Message-ID: <20120903042033.GQ15292@dastard> X-ASG-Orig-Subj: Re: [RFC PATCH 1/4] xfs: add EOFBLOCKS inode tagging/untagging References: <1346097111-4476-1-git-send-email-bfoster@redhat.com> <1346097111-4476-2-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1346097111-4476-2-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1346646094 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107453 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Aug 27, 2012 at 03:51:48PM -0400, Brian Foster wrote: > Add the XFS_ICI_EOFBLOCKS_TAG inode tag to identify inodes with > speculatively preallocated blocks beyond EOF. An inode is tagged > when speculative preallocation occurs and untagged either via > truncate down or when post-EOF blocks are freed via release or > reclaim. > > The tag management is intentionally not aggressive to prefer > simplicity over the complexity of handling all the corner cases > under which post-EOF blocks could be freed (i.e., forward > truncation, fallocate, write error conditions, etc.). This means > that a tagged inode may or may not have post-EOF blocks after a > period of time. The tag is eventually cleared when the inode is > released or reclaimed. > > Signed-off-by: Brian Foster ..... > diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h > index 94b32f9..2cd2883 100644 > --- a/fs/xfs/xfs_inode.h > +++ b/fs/xfs/xfs_inode.h > @@ -305,10 +305,16 @@ xfs_iflags_set(xfs_inode_t *ip, unsigned short flags) > } > > static inline void > +__xfs_iflags_clear(xfs_inode_t *ip, unsigned short flags) > +{ > + ip->i_flags &= ~flags; > +} > + > +static inline void > xfs_iflags_clear(xfs_inode_t *ip, unsigned short flags) > { > spin_lock(&ip->i_flags_lock); > - ip->i_flags &= ~flags; > + __xfs_iflags_clear(ip, flags); > spin_unlock(&ip->i_flags_lock); > } Left overs from a previous version? > > diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c > index 973dff6..2968ee8 100644 > --- a/fs/xfs/xfs_iomap.c > +++ b/fs/xfs/xfs_iomap.c > @@ -459,6 +459,13 @@ retry: > if (!(imap[0].br_startblock || XFS_IS_REALTIME_INODE(ip))) > return xfs_alert_fsblock_zero(ip, &imap[0]); > > + /* > + * Tag the inode as speculatively preallocated so we can reclaim this > + * space on demand, if necessary. > + */ > + if (prealloc) > + xfs_inode_set_eofblocks_tag(ip); > + > *ret_imap = imap[0]; > return 0; > } > diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c > index 4e00cf0..dcd1d5f 100644 > --- a/fs/xfs/xfs_iops.c > +++ b/fs/xfs/xfs_iops.c > @@ -854,6 +854,9 @@ xfs_setattr_size( > * and do not wait the usual (long) time for writeout. > */ > xfs_iflags_set(ip, XFS_ITRUNCATED); > + > + /* A truncate down always removes post-EOF blocks. */ > + xfs_inode_clear_eofblocks_tag(ip); > } > > if (mask & ATTR_CTIME) { > diff --git a/fs/xfs/xfs_sync.c b/fs/xfs/xfs_sync.c > index 9654817..5e14741 100644 > --- a/fs/xfs/xfs_sync.c > +++ b/fs/xfs/xfs_sync.c > @@ -971,3 +971,79 @@ xfs_reclaim_inodes_count( > return reclaimable; > } > > +STATIC void > +__xfs_inode_set_eofblocks_tag( > + struct xfs_perag *pag, > + struct xfs_inode *ip) > +{ > + int tagged = radix_tree_tagged(&pag->pag_ici_root, > + XFS_ICI_EOFBLOCKS_TAG); > + > + radix_tree_tag_set(&pag->pag_ici_root, > + XFS_INO_TO_AGINO(ip->i_mount, ip->i_ino), > + XFS_ICI_EOFBLOCKS_TAG); > + > + if (!tagged) { > + /* propagate the eofblocks tag up into the perag radix tree */ > + spin_lock(&ip->i_mount->m_perag_lock); > + radix_tree_tag_set(&ip->i_mount->m_perag_tree, > + XFS_INO_TO_AGNO(ip->i_mount, ip->i_ino), > + XFS_ICI_EOFBLOCKS_TAG); > + spin_unlock(&ip->i_mount->m_perag_lock); > + > + trace_xfs_perag_set_eofblocks(ip->i_mount, pag->pag_agno, > + -1, _RET_IP_); > + } > +} > + > +void > +xfs_inode_set_eofblocks_tag( > + xfs_inode_t *ip) > +{ > + struct xfs_mount *mp = ip->i_mount; > + struct xfs_perag *pag; > + > + pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, ip->i_ino)); > + spin_lock(&pag->pag_ici_lock); > + trace_xfs_set_eofblocks_tag(ip); > + __xfs_inode_set_eofblocks_tag(pag, ip); > + spin_unlock(&pag->pag_ici_lock); > + xfs_perag_put(pag); > +} I know the code you copied had this two-function structure, but that was because it has callers of the __ versions of the functions. I'd just make these a single function. > + > +STATIC void > +__xfs_inode_clear_eofblocks( > + xfs_perag_t *pag, > + xfs_inode_t *ip) > +{ > + radix_tree_tag_clear(&pag->pag_ici_root, > + XFS_INO_TO_AGINO(ip->i_mount, ip->i_ino), > + XFS_ICI_EOFBLOCKS_TAG); > + > + if (!radix_tree_tagged(&pag->pag_ici_root, XFS_ICI_EOFBLOCKS_TAG)) { > + /* clear the eofblocks tag from the perag radix tree */ > + spin_lock(&ip->i_mount->m_perag_lock); > + radix_tree_tag_clear(&ip->i_mount->m_perag_tree, > + XFS_INO_TO_AGNO(ip->i_mount, ip->i_ino), > + XFS_ICI_EOFBLOCKS_TAG); > + spin_unlock(&ip->i_mount->m_perag_lock); > + trace_xfs_perag_clear_eofblocks(ip->i_mount, pag->pag_agno, > + -1, _RET_IP_); > + } > +} > + > +void > +xfs_inode_clear_eofblocks_tag( > + xfs_inode_t *ip) > +{ > + struct xfs_mount *mp = ip->i_mount; > + struct xfs_perag *pag; > + > + pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, ip->i_ino)); > + spin_lock(&pag->pag_ici_lock); > + trace_xfs_clear_eofblocks_tag(ip); > + __xfs_inode_clear_eofblocks(pag, ip); > + spin_unlock(&pag->pag_ici_lock); > + xfs_perag_put(pag); > +} Same here. > diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c > index 2a5c6373..658ee2e 100644 > --- a/fs/xfs/xfs_vnodeops.c > +++ b/fs/xfs/xfs_vnodeops.c > @@ -467,6 +467,8 @@ xfs_release( > if (error) > return error; > > + xfs_inode_clear_eofblocks_tag(ip); > + > /* delalloc blocks after truncation means it really is dirty */ > if (ip->i_delayed_blks) > xfs_iflags_set(ip, XFS_IDIRTY_RELEASE); > @@ -523,6 +525,7 @@ xfs_inactive( > error = xfs_free_eofblocks(mp, ip, false); > if (error) > return VN_INACTIVE_CACHE; > + xfs_inode_clear_eofblocks_tag(ip); > } > goto out; I think it's better to call xfs_inode_clear_eofblocks_tag() inside xfs_free_eofblocks() - that's where the blocks are being freed, after all. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Sep 3 00:05:21 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8355Kxl143791 for ; Mon, 3 Sep 2012 00:05:21 -0500 X-ASG-Debug-ID: 1346648775-04cbb02719649e0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 0a8UodXJNS2S2Yci for ; Sun, 02 Sep 2012 22:06:15 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AsANAJM5RFB5LHJk/2dsb2JhbABFhRy1AgEBAn+BCIIgAQEFJxMcIxAIAw4KLhQlAyETiAy5fBSKeRwTYXw0hGMDlViQG4J1gUc Received: from ppp121-44-114-100.lns20.syd6.internode.on.net (HELO dastard) ([121.44.114.100]) by ipmail06.adl6.internode.on.net with ESMTP; 03 Sep 2012 14:36:14 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1T8OrV-0002lp-0Z; Mon, 03 Sep 2012 15:06:13 +1000 Date: Mon, 3 Sep 2012 15:06:12 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [RFC PATCH 2/4] xfs: create function to scan and clear EOFBLOCKS inodes Message-ID: <20120903050612.GR15292@dastard> X-ASG-Orig-Subj: Re: [RFC PATCH 2/4] xfs: create function to scan and clear EOFBLOCKS inodes References: <1346097111-4476-1-git-send-email-bfoster@redhat.com> <1346097111-4476-3-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1346097111-4476-3-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1346648775 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107455 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Aug 27, 2012 at 03:51:49PM -0400, Brian Foster wrote: > xfs_inodes_free_eofblocks() implements scanning functionality for > EOFBLOCKS inodes. It scans the radix tree and frees post-EOF blocks > for inodes that meet particular criteria. The scan can be filtered > by a particular quota type/id and minimum file size. The scan can > also be invoked in trylock mode or wait (force) mode. > > The xfs_free_eofblocks() helper is invoked to clear post-EOF space. > It is slightly modified to support an output parameter that > indicates whether space was freed and helps decide whether the > EOFBLOCKS tag should be cleared in trylock scans. > > Signed-off-by: Brian Foster > --- > fs/xfs/xfs_sync.c | 168 +++++++++++++++++++++++++++++++++++++++++++++++++ > fs/xfs/xfs_sync.h | 3 + > fs/xfs/xfs_vnodeops.c | 17 +++-- > fs/xfs/xfs_vnodeops.h | 2 + > 4 files changed, 184 insertions(+), 6 deletions(-) > > diff --git a/fs/xfs/xfs_sync.c b/fs/xfs/xfs_sync.c > index 5e14741..27c3c46 100644 > --- a/fs/xfs/xfs_sync.c > +++ b/fs/xfs/xfs_sync.c > @@ -971,6 +971,174 @@ xfs_reclaim_inodes_count( > return reclaimable; > } > > +/* > + * Handle an EOFBLOCKS tagged inode. If this is a forced scan, we wait on the > + * iolock ourselves rather than rely on the trylock in xfs_free_eofblocks(). > + * > + * We rely on the output parameter from xfs_free_eofblocks() to determine > + * whether we should clear the tag because in the trylock case, it could have > + * skipped the inode due to lock contention. > + */ > +STATIC int > +xfs_inode_free_eofblocks( > + struct xfs_inode *ip, > + int flags) > +{ > + int ret = 0; > + bool freed = false; > + bool wait_iolock = (flags & EOFBLOCKS_WAIT) ? true : false; > + > + if (wait_iolock) > + xfs_ilock(ip, XFS_IOLOCK_EXCL); Why do we need the IO lock here? xfs_free_eofblocks() does all the necessary locking.... > + > + if ((S_ISREG(ip->i_d.di_mode) && > + (VFS_I(ip)->i_size > 0 || > + (VN_CACHED(VFS_I(ip)) > 0 || ip->i_delayed_blks > 0)) && > + (ip->i_df.if_flags & XFS_IFEXTENTS)) && > + (!(ip->i_d.di_flags & (XFS_DIFLAG_PREALLOC | XFS_DIFLAG_APPEND)))) { This check is now repeated in 3 places - xfs_inactive, xfs_release and now here. I think it needs a helper. > + /* !wait_iolock == need_iolock in xfs_free_eofblocks() */ > + ret = xfs_free_eofblocks(ip->i_mount, ip, !wait_iolock, &freed); > + if (freed) > + xfs_inode_clear_eofblocks_tag(ip); If you move xfs_inode_clear_eofblocks_tag() inside xfs_free_eofblocks(), there's no need for this extra return value. > + } else { > + /* inode could be preallocated or append-only */ > + xfs_inode_clear_eofblocks_tag(ip); This should be a rare event - it's probably worth adding a pair of trace events here for the two cases so we can see if there is ever a significant number of inodes being scanned for prealloc that can't be cleared... (e.g 'perf top -e xfs:xfs_i*' to count all the inode events) > + } > + > + if (wait_iolock) > + xfs_iunlock(ip, XFS_IOLOCK_EXCL); > + > + return ret; > +} > + > +/* > + * Determine whether an inode matches a particular qouta id. > + */ > +STATIC int > +xfs_inode_match_quota_id( > + struct xfs_inode *ip, > + int qtype, > + uint32_t id) > +{ > + switch (qtype) { > + case XFS_DQ_USER: > + return ip->i_d.di_uid == id; > + case XFS_DQ_GROUP: > + return ip->i_d.di_gid == id; > + default: > + return xfs_get_projid(ip) == id; > + } > + > + return 0; > +} There's nothing really quota specific about this scan. I'd leave this functionality to a separate patch once all the core infrastructure is in place. > + > +/* > + * This is mostly copied from xfs_reclaim_inodes_ag(). > + * > + * TODO: > + * - Could we enhance ag_iterator to support a tag and use it instead of this? Yes. This code is too tricky to duplicate for every use case, and this doesn't have special case requirements like the reclaim code. i.e. the xfs_inode_free_eofblocks() becomes the execute function (and the quota checks move inside that eventually). Passing a tag of "-1" would indicate a non-tag lookup, otherwise use a tag based lookup. Given the extra fields that this version uses, passing a void *args is probably necessary so that a structure can be passed to the execute function along with the flags.... I'd suggest this conversion should be done in a patch prior to introducing this scanner. FWIW, this is going to conflict with my "get rid of xfs-sync.c patch series, so we'll need to work out who rebases what at some point. > + */ > +int > +xfs_inodes_free_eofblocks( > + struct xfs_mount *mp, > + int qtype, > + uint32_t id, > + uint64_t min_file_size, > + int flags) > +{ ..... > + for (i = 0; i < nr_found; i++) { > + if (!batch[i]) > + continue; > + > + /* default projid represents a full scan */ I don't think thats a good idea. From a normal users perspective, the background trimming will occur irrespective of the quota groups the inode is part of. Background trimming defines the default behaviour, because that's what 99.99% of users will see active, not quota/application specific events driven through ioctls. IOWs, selecting inodes by quota type/id for pruning is a secondary function of the execute implementation, not a primary concern of the infrastructure. > + if ((!(qtype == XFS_DQ_PROJ && > + id == XFS_PROJID_DEFAULT) && > + !xfs_inode_match_quota_id(batch[i], qtype, > + id)) || > + (min_file_size && XFS_ISIZE(batch[i]) < > + min_file_size) > + ) { > + IRELE(batch[i]); > + continue; > + } Moving this check to the execute function will get rid of the indent mess.... > + > + error = xfs_inode_free_eofblocks(batch[i], flags); > + IRELE(batch[i]); > + if (error) > + last_error = error; > + } > + > + cond_resched(); > + > + } while (nr_found && !done); > + > + xfs_perag_put(pag); > + } > + > + return XFS_ERROR(last_error); > +} > + > STATIC void > __xfs_inode_set_eofblocks_tag( > struct xfs_perag *pag, > diff --git a/fs/xfs/xfs_sync.h b/fs/xfs/xfs_sync.h > index 4486491..78aca41 100644 > --- a/fs/xfs/xfs_sync.h > +++ b/fs/xfs/xfs_sync.h > @@ -43,8 +43,11 @@ void __xfs_inode_set_reclaim_tag(struct xfs_perag *pag, struct xfs_inode *ip); > void __xfs_inode_clear_reclaim_tag(struct xfs_mount *mp, struct xfs_perag *pag, > struct xfs_inode *ip); > > +#define EOFBLOCKS_WAIT 0x0001 I'd just reuse SYNC_WAIT and SYNC_TRYLOCK which are already defined and used by the sync and reclaim iterators. > + > void xfs_inode_set_eofblocks_tag(struct xfs_inode *ip); > void xfs_inode_clear_eofblocks_tag(struct xfs_inode *ip); > +int xfs_inodes_free_eofblocks(struct xfs_mount *, int, uint32_t, uint64_t, int); > > int xfs_sync_inode_grab(struct xfs_inode *ip); > int xfs_inode_ag_iterator(struct xfs_mount *mp, > diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c > index 658ee2e..53460f3 100644 > --- a/fs/xfs/xfs_vnodeops.c > +++ b/fs/xfs/xfs_vnodeops.c > @@ -150,11 +150,12 @@ xfs_readlink( > * when the link count isn't zero and by xfs_dm_punch_hole() when > * punching a hole to EOF. > */ > -STATIC int > +int > xfs_free_eofblocks( > xfs_mount_t *mp, > xfs_inode_t *ip, > - bool need_iolock) > + bool need_iolock, > + bool *blocks_freed) I don't really see a point to adding this. Either we removed all the EOF blocks or we didn't, and that means we should just clear the tags directly in this function if it is appropriate. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Sep 3 00:17:37 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_42 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q835HbFt145614 for ; Mon, 3 Sep 2012 00:17:37 -0500 X-ASG-Debug-ID: 1346649504-04cbb0271a64ec0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id hGeYkgnQF8CdUsvi for ; Sun, 02 Sep 2012 22:18:24 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ar8NAF49RFB5LHJk/2dsb2JhbABFhRy1AgEBAn+BCIIgAQEFOhwjEAgDDgouFCUDIROIDLl/FIp5HBNhfDSEYwOLNIokhkyCaIZngnWBRw Received: from ppp121-44-114-100.lns20.syd6.internode.on.net (HELO dastard) ([121.44.114.100]) by ipmail06.adl6.internode.on.net with ESMTP; 03 Sep 2012 14:47:52 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1T8P2d-0002mN-1A; Mon, 03 Sep 2012 15:17:43 +1000 Date: Mon, 3 Sep 2012 15:17:43 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [RFC PATCH 3/4] xfs: add FREE_EOFBLOCKS ioctl Message-ID: <20120903051742.GS15292@dastard> X-ASG-Orig-Subj: Re: [RFC PATCH 3/4] xfs: add FREE_EOFBLOCKS ioctl References: <1346097111-4476-1-git-send-email-bfoster@redhat.com> <1346097111-4476-4-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1346097111-4476-4-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1346649504 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107457 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Aug 27, 2012 at 03:51:50PM -0400, Brian Foster wrote: > The XFS_IOC_FREE_EOFBLOCKS ioctl allows users to invoke an EOFBLOCKS > scan. The xfs_eofblocks structure is defined to support the command > parameters (quota type/id and minimum file size). > > Signed-off-by: Brian Foster > --- > fs/xfs/xfs_fs.h | 10 ++++++++++ > fs/xfs/xfs_ioctl.c | 25 +++++++++++++++++++++++++ > fs/xfs/xfs_quota.h | 1 + > fs/xfs/xfs_quotaops.c | 2 +- > 4 files changed, 37 insertions(+), 1 deletions(-) > > diff --git a/fs/xfs/xfs_fs.h b/fs/xfs/xfs_fs.h > index c13fed8..6f93db9 100644 > --- a/fs/xfs/xfs_fs.h > +++ b/fs/xfs/xfs_fs.h > @@ -339,6 +339,15 @@ typedef struct xfs_error_injection { > > > /* > + * Speculative preallocation trimming. > + */ > +typedef struct xfs_eofblocks { > + __u32 id; /* quota id */ > + __u32 qtype; /* quota type */ > + __u64 min_file_size; /* minimum file size */ > +} xfs_eofblocks_t; No typedefs. Additionally: this is a user facing API for functionality that has wider potential use than quota. For example, xfs_fsr runs out of space in an AG, but it really wants to put a file there, so it calls XFS_IOC_FREE_EOFBLOCKS to specify the AG it wants all the prealloc removed from. So, the structure needs a version number so the kernel knows what fields the application is aware of, a flags field to say what operation is being done (i.e. flush by projid) rather than a "qtype" and a bunch of padding so that we can add new elements to it as need arises without breaking existing user binaries. > * ioctl commands that replace IRIX syssgi()'s > diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c > index 0e0232c..b91cbcd 100644 > --- a/fs/xfs/xfs_ioctl.c > +++ b/fs/xfs/xfs_ioctl.c > @@ -1602,6 +1602,31 @@ xfs_file_ioctl( > error = xfs_errortag_clearall(mp, 1); > return -error; > > + case XFS_IOC_FREE_EOFBLOCKS: { > + struct xfs_eofblocks eofb; > + int qtype; > + > + if (copy_from_user(&eofb, arg, sizeof(eofb))) > + return -XFS_ERROR(EFAULT); > + > + qtype = xfs_quota_type(eofb.qtype); > + > + /* > + * TODO: The filtering code currently uses the id in the inode. > + * Therefore, I don't think it really matters whether the > + * particular quota type is enabled (and the dquot is attached). > + * > + * Alternatively, we could filter by dquot type. This would > + * mean we might have to make sure dquot's are attached during > + * the scan and that the particular quota type is enabled. I'm > + * not sure that this buys us anything. > + */ If quota is not enabled, then a request to free blocks determined by a quota ID is invalid and should be rejected. It's a user API - what is and isn't supported needs to be written down in black and white (i.e. in the xfsctl man page). > + /* TODO: might want to just use the eofb structure here */ > + error = xfs_inodes_free_eofblocks(mp, qtype, eofb.id, eofb.min_file_size, EOFBLOCKS_WAIT); Yes, just pass the structure - it means it can be passed all the way down to the execute function, and only that code needs to handle different versions of the structure. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Sep 3 00:27:50 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q835RoW8146960 for ; Mon, 3 Sep 2012 00:27:50 -0500 X-ASG-Debug-ID: 1346650125-04bdf078fe69fe0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id KPHZ8CRO3UWrFEpg for ; Sun, 02 Sep 2012 22:28:46 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ar8NAEo/RFB5LHJk/2dsb2JhbABFhRy1AgEBAn+BCIIgAQEFOhwjEAgDDgouFCUDIROIDLoBFIp5L2F8NIRjA5VYkBuCdQ Received: from ppp121-44-114-100.lns20.syd6.internode.on.net (HELO dastard) ([121.44.114.100]) by ipmail07.adl2.internode.on.net with ESMTP; 03 Sep 2012 14:58:44 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1T8PDG-0002mk-Uk; Mon, 03 Sep 2012 15:28:43 +1000 Date: Mon, 3 Sep 2012 15:28:42 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [RFC PATCH 4/4] xfs: add background scanning to clear EOFBLOCKS inodes Message-ID: <20120903052842.GT15292@dastard> X-ASG-Orig-Subj: Re: [RFC PATCH 4/4] xfs: add background scanning to clear EOFBLOCKS inodes References: <1346097111-4476-1-git-send-email-bfoster@redhat.com> <1346097111-4476-5-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1346097111-4476-5-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1346650125 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107457 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Aug 27, 2012 at 03:51:51PM -0400, Brian Foster wrote: > Create a delayed_work to enable background scanning and freeing > of EOFBLOCKS inodes. The scanner kicks in once speculative > preallocation occurs and stops requeueing itself when no EOFBLOCKS > inodes exist. > > Scans are queued on the existing syncd workqueue and the interval > is tied to the syncd interval, which is a default of 30s. The > minimum file size for a background scan is hardcoded to 100MB. I'd set it to be much longer than the xfs_syncd_centisecs period. The data may not be written back for a long while, and a file that is open, written and closed repeatedly (NFS write patterns for large and/or slowly written files) should not have it's preallocation truncated every 30s. I'd suggest that a 5 minute sweep is probably sufficiently frequent to avoid most fragmentation issues and long term buildup of speculative preallocation whilst not perturbing large/slow writers too much.... Apart from that, there isn't anything wrong with the code, except I'll note again that it conflicts with my syncd removal patchset.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Sep 3 00:30:18 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q835UIT4147304 for ; Mon, 3 Sep 2012 00:30:18 -0500 X-ASG-Debug-ID: 1346650273-04cbb02718654f0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id WDjOU2lEMsl0YJu9 for ; Sun, 02 Sep 2012 22:31:14 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ar8NAEo/RFB5LHJk/2dsb2JhbABFhRy1AgEBAn+BCIIgAQEFOhwjEAgDDgouFCUDIROIDLoBFIp5L2F8NIRjA5VYkBuCdQ Received: from ppp121-44-114-100.lns20.syd6.internode.on.net (HELO dastard) ([121.44.114.100]) by ipmail07.adl2.internode.on.net with ESMTP; 03 Sep 2012 15:01:12 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1T8PFf-0002mw-Od; Mon, 03 Sep 2012 15:31:11 +1000 Date: Mon, 3 Sep 2012 15:31:11 +1000 From: Dave Chinner To: Rich Johnston Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/5] xfstests: Use libtool to install lstat64 Message-ID: <20120903053111.GU15292@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/5] xfstests: Use libtool to install lstat64 References: <20120828172605.607853317@sgi.com> <20120828172928.785762590@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20120828172928.785762590@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1346650273 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107457 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Aug 28, 2012 at 12:26:06PM -0500, Rich Johnston wrote: > Use libtool to install lstat64 on $SCRATCH_MNT instead of cp. Libtool will > install the binary from the proper location and display a warning if any > shared library dependancies are not properly installed. This ensures that a > libtool wrapper shell script is not installed in place of lstat64 when libtool > wrappers are being used. This patch is unnecessary if the configure script does the right thing and refuse to build is library dependencies are not correct. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Sep 3 00:35:42 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q835ZgMh148104 for ; Mon, 3 Sep 2012 00:35:42 -0500 X-ASG-Debug-ID: 1346650597-04cbb0271a657a0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id HMob6u7Cge2s05cG for ; Sun, 02 Sep 2012 22:36:37 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ar8NAJNARFB5LHJk/2dsb2JhbABFhRy1AgEBAn+BCIIgAQEFOhwjEAgDDgouFCUDIROIDLoAFIp5L2F8NIRjA5VYkBuCdQ Received: from ppp121-44-114-100.lns20.syd6.internode.on.net (HELO dastard) ([121.44.114.100]) by ipmail07.adl2.internode.on.net with ESMTP; 03 Sep 2012 15:06:36 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1T8PKu-0002nG-IL; Mon, 03 Sep 2012 15:36:36 +1000 Date: Mon, 3 Sep 2012 15:36:36 +1000 From: Dave Chinner To: Rich Johnston Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/5] xfstests: Use libtool to install applications Message-ID: <20120903053636.GV15292@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/5] xfstests: Use libtool to install applications References: <20120828172605.607853317@sgi.com> <20120828172928.999971219@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20120828172928.999971219@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1346650597 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107457 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Aug 28, 2012 at 12:26:07PM -0500, Rich Johnston wrote: > This patch replaces the INSTALL macro with LTINSTALL so that libtool is used > to install the applications. Libtool will install the binary from the proper > location and display a warning if any shared library dependancies are not > properly installed. This ensures that a libtool wrapper shell script is not > installed in place of application when libtool wrappers are being used. > > > Signed-off-by: Rich Johnston Looks OK - do any of the dmapi/ makefiles need this treatment? Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Sep 3 00:37:14 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q835bEmM148241 for ; Mon, 3 Sep 2012 00:37:14 -0500 X-ASG-Debug-ID: 1346650689-04cb6c23626fce0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id lBOg1vH2H4GMWV9i for ; Sun, 02 Sep 2012 22:38:10 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AsANANFBRFB5LHJk/2dsb2JhbABFhRy1AgEBAn+BCIIgAQEEATocIwULCAMOCi4UJQMhE4gHBboBFIp5L2F8NIRjA5VYkBuCdQ Received: from ppp121-44-114-100.lns20.syd6.internode.on.net (HELO dastard) ([121.44.114.100]) by ipmail07.adl2.internode.on.net with ESMTP; 03 Sep 2012 15:07:49 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1T8PM4-0002nP-Ob; Mon, 03 Sep 2012 15:37:48 +1000 Date: Mon, 3 Sep 2012 15:37:48 +1000 From: Dave Chinner To: Rich Johnston Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/5] xftests: Use installed libraries only Message-ID: <20120903053748.GW15292@dastard> X-ASG-Orig-Subj: Re: [PATCH 3/5] xftests: Use installed libraries only References: <20120828172605.607853317@sgi.com> <20120828172929.203767140@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20120828172929.203767140@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1346650689 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107457 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Aug 28, 2012 at 12:26:08PM -0500, Rich Johnston wrote: > The xfstests autotools currently searches locally in > ../{acl,attr,dmapi,xfsprogs} > for libraries that xfstests depends upon, in addition to searching for them in > their regular installed locations on a system, e.g. /usr/lib. It appears this > feature was added (but not documented) so that xfs developers can build and run > xfstests without having to install the libraries. This can lead to touble if trouble. (the subject also has a typo) > you expect that xfstests is using the versions of the libraries installed on > the system. > > If a local library was found and not installed, libtool will create a wrapper > script to call the binary from the .libs directory. This patch will remove > searching for local libraies so that the installed libraries are always used. libraries > Signed-off-by: Rich Johnston Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Sep 3 00:37:22 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q835bMLI148284 for ; Mon, 3 Sep 2012 00:37:22 -0500 X-ASG-Debug-ID: 1346650698-04cb6c23606fcf0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id EQzhZMZIZUmcArSD for ; Sun, 02 Sep 2012 22:38:18 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ar8NANFBRFB5LHJk/2dsb2JhbABFhRy1AgEBAn+BCIIgAQEFOhwjEAgDDgouFCUDIROIDLoBFIp5L2F8NIRjA5VYkBuCdQ Received: from ppp121-44-114-100.lns20.syd6.internode.on.net (HELO dastard) ([121.44.114.100]) by ipmail07.adl2.internode.on.net with ESMTP; 03 Sep 2012 15:08:12 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1T8PMS-0002nW-2X; Mon, 03 Sep 2012 15:38:12 +1000 Date: Mon, 3 Sep 2012 15:38:12 +1000 From: Dave Chinner To: Rich Johnston Cc: xfs@oss.sgi.com Subject: Re: [PATCH 4/5] dmapi: Use installed libraries only Message-ID: <20120903053812.GX15292@dastard> X-ASG-Orig-Subj: Re: [PATCH 4/5] dmapi: Use installed libraries only References: <20120828172605.607853317@sgi.com> <20120828172929.413312035@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20120828172929.413312035@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1346650698 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107457 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Aug 28, 2012 at 12:26:09PM -0500, Rich Johnston wrote: > If a local library was found and not installed, libtool will create a wrapper > script to call the binary from the .libs directory. This patch will remove > searching for local libraies so that the installed libraries are always used. > > Signed-off-by: Rich Johnston Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Sep 3 00:38:11 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q835cAcB148650 for ; Mon, 3 Sep 2012 00:38:10 -0500 X-ASG-Debug-ID: 1346650746-04cb6c23636fd90001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id 6EeCXy7ySXjjjzhW for ; Sun, 02 Sep 2012 22:39:06 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ar8NANFBRFB5LHJk/2dsb2JhbABFhRy1AgEBAn+BCIIgAQEFOhwjEAgDDgouFCUDIROIDLoBFIp5L2F8NIRjA5VYkBuCdQ Received: from ppp121-44-114-100.lns20.syd6.internode.on.net (HELO dastard) ([121.44.114.100]) by ipmail07.adl2.internode.on.net with ESMTP; 03 Sep 2012 15:09:05 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1T8PNJ-0002nk-5p; Mon, 03 Sep 2012 15:39:05 +1000 Date: Mon, 3 Sep 2012 15:39:05 +1000 From: Dave Chinner To: Rich Johnston Cc: xfs@oss.sgi.com Subject: Re: [PATCH 5/5] xfsdump: Use installed libraries only Message-ID: <20120903053905.GY15292@dastard> X-ASG-Orig-Subj: Re: [PATCH 5/5] xfsdump: Use installed libraries only References: <20120828172605.607853317@sgi.com> <20120828172929.623554040@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20120828172929.623554040@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1346650746 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107457 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Aug 28, 2012 at 12:26:10PM -0500, Rich Johnston wrote: > If a local library was found and not installed, libtool will create a wrapper > script to call the binary from the .libs directory. This patch will remove > searching for local libraies so that the installed libraries are always used. > > Signed-off-by: Rich Johnston Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Sep 3 00:42:41 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q835gfe2149488 for ; Mon, 3 Sep 2012 00:42:41 -0500 X-ASG-Debug-ID: 1346651016-04bdf078fe6a9b0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id ei3u0chiwJYCvnxG for ; Sun, 02 Sep 2012 22:43:37 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AsENAMxCRFB5LHJk/2dsb2JhbABFhRy1AgEBAn+BCIIgAQEEAScTHCMFCwgDDgouFCUDIROIBwW6ARSKeS9hfDSEYwOVWIk0hmeCdQ Received: from ppp121-44-114-100.lns20.syd6.internode.on.net (HELO dastard) ([121.44.114.100]) by ipmail07.adl2.internode.on.net with ESMTP; 03 Sep 2012 15:13:28 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1T8PRX-0002nv-Jb; Mon, 03 Sep 2012 15:43:27 +1000 Date: Mon, 3 Sep 2012 15:43:27 +1000 From: Dave Chinner To: Christoph Hellwig Cc: Justin Piszcz , linux-m@kvack.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com Subject: Re: 3.5.2: moving files from xfs/disk -> nfs: radix_tree_lookup_slot+0xe/0x10 Message-ID: <20120903054327.GZ15292@dastard> X-ASG-Orig-Subj: Re: 3.5.2: moving files from xfs/disk -> nfs: radix_tree_lookup_slot+0xe/0x10 References: <20120901231338.GE6896@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20120901231338.GE6896@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1346651016 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107457 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat, Sep 01, 2012 at 07:13:38PM -0400, Christoph Hellwig wrote: > I'd suspect it's something with the actual radix tree code, Ccing > linux-mm in case they know more. I don't think it has anything to do with the radix tree code.... > On Mon, Aug 27, 2012 at 11:00:10AM -0400, Justin Piszcz wrote: > > Hi, > > > > Moving ~276GB of files (mainly large backups) and everything has > > seemed to lockup on the client moving data to the server, it is still > > in this state.. ..... > > [75716.705720] Call Trace: > > [75716.705729] [] ? radix_tree_lookup_slot+0xe/0x10 It's just a symbol that was found in the stack. The real trace is this: > > [75716.705747] [] schedule+0x24/0x70 > > [75716.705751] [] schedule_timeout+0x1a9/0x210 > > [75716.705764] [] wait_for_common+0xc0/0x150 > > [75716.705773] [] wait_for_completion+0x18/0x20 > > [75716.705777] [] writeback_inodes_sb_nr+0x77/0xa0 > > [75716.705785] [] writeback_inodes_sb+0x29/0x40 > > [75716.705788] [] __sync_filesystem+0x47/0x90 > > [75716.705791] [] sync_one_sb+0x1b/0x20 > > [75716.705795] [] iterate_supers+0xe1/0xf0 > > [75716.705798] [] sys_sync+0x2b/0x60 > > [75716.705802] [] system_call_fastpath+0x1a/0x1f > > [75836.701197] INFO: task sync:8790 blocked for more than 120 seconds. Which simply says that writeback of the dirty data at the time of the sync call has taken longer than 120s. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Sep 3 01:03:13 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8363CKX153389 for ; Mon, 3 Sep 2012 01:03:13 -0500 X-ASG-Debug-ID: 1346652248-04bdf078ff6b380001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id yCXGEil5G5p7YoJC for ; Sun, 02 Sep 2012 23:04:08 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AsENAKBHRFB5LHJk/2dsb2JhbABFhRy1AQEBAn+BCIIgAQEFOhwWCgMQCAMOCi4UJQMhExSHeLoKFIp5L2F8NIQDYAOVWJAbgnU Received: from ppp121-44-114-100.lns20.syd6.internode.on.net (HELO dastard) ([121.44.114.100]) by ipmail07.adl2.internode.on.net with ESMTP; 03 Sep 2012 15:34:08 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1T8PlW-0002p6-Vi; Mon, 03 Sep 2012 16:04:07 +1000 Date: Mon, 3 Sep 2012 16:04:06 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [RFC, PATCH 0/102]: xfs: 3.0.x stable kernel update Message-ID: <20120903060406.GA15292@dastard> X-ASG-Orig-Subj: Re: [RFC, PATCH 0/102]: xfs: 3.0.x stable kernel update References: <1345698180-13612-1-git-send-email-david@fromorbit.com> <20120901231019.GC6896@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20120901231019.GC6896@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1346652248 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=COMMA_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107459 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 COMMA_SUBJECT Subject is like 'Re: FDSDS, this is a subject' On Sat, Sep 01, 2012 at 07:10:19PM -0400, Christoph Hellwig wrote: > I've done a brief look over the patches this week and while I can't spot > anything wrong I'm defintively a bit concerned about the amount of churn > for a long term stable series. A lot of this does not seem to fit the > strict -stable criteria, and given that I've not really seen any major > issues with the current 3.0-stable codebase I'm wondering what the > guranteed gain vs the status quo is. You didn't troll the RH bugzilla ;) The XFS code base in RHEL6 is sitting at 3.0, and several of the problems that have workarounds in 3.0.x don't fix the problems reported (e.g. the log space hangs), while the fixes in the more recent mainline kernel do. I simply figured that I've got to do this much work to fix all the bugs reported in RHEL6 and given the code bases are almost identical I'd do a community service and push it to 3.0.x first. I'm quite happy not to push it to 3.0.x if the consensus is that it is too much churn. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Sep 3 01:08:40 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8368ett154254 for ; Mon, 3 Sep 2012 01:08:40 -0500 X-ASG-Debug-ID: 1346652575-04bdf078ff6b6b0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id eBE96ieFCEain5Si for ; Sun, 02 Sep 2012 23:09:36 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AsANABVJRFB5LHJk/2dsb2JhbABFhRy1AQEBAn+BCIIgAQEFJxMcIxAIAw4HAy4UJQMhE4gMugwUinkvYXw0hANgA5VYiTSGZ4J1 Received: from ppp121-44-114-100.lns20.syd6.internode.on.net (HELO dastard) ([121.44.114.100]) by ipmail05.adl6.internode.on.net with ESMTP; 03 Sep 2012 15:39:07 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1T8PqD-0002pL-2J; Mon, 03 Sep 2012 16:08:57 +1000 Date: Mon, 3 Sep 2012 16:08:57 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH 07/13] xfs: xfs_sync_data is redundant. Message-ID: <20120903060857.GB15292@dastard> X-ASG-Orig-Subj: Re: [PATCH 07/13] xfs: xfs_sync_data is redundant. References: <1346328017-2795-1-git-send-email-david@fromorbit.com> <1346328017-2795-8-git-send-email-david@fromorbit.com> <20120901232456.GB31634@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20120901232456.GB31634@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1346652575 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107459 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat, Sep 01, 2012 at 07:24:56PM -0400, Christoph Hellwig wrote: > On Thu, Aug 30, 2012 at 10:00:11PM +1000, Dave Chinner wrote: > > From: Dave Chinner > > > > We don't do any data writeback from XFS any more - the VFS is > > completely responsible for that, including for freeze. We can > > replace the remaining caller with the VFS level function that > > achieves the same thing, but without conflicting with current > > writeback work - writeback_inodes_sb_if_idle(). > > > > This means we can remove the flush_work and xfs_flush_inodes() - the > > VFS functionality completely replaces the internal flush queue for > > doing this writeback work in a separate context to avoid stack > > overruns.. > > Are the lock ordering issues with writeback_inodes_sb_if_idle sorted out > by now? IIRC it still needs to be switch to a trylock. It never gets called from unmount or freeze context, so I can't see how it would deadlock in these use cases. It's only when we call writeback_inodes_sb_if_idle() from a context that already holds s_umount that the locking it has matters - that's where btrfs and ext4 have been getting into trouble with this. > > - xfs_flush_inodes(ip); > > + writeback_inodes_sb_if_idle(VFS_I(ip)->i_sb, > > + WB_REASON_FS_FREE_SPACE); > > I'd prefer to still keep a wrapper for an ugly call like this if we can. OK, I'll add an inline function to do this. Cheers, Dave. -- Dave Chinner david@fromorbit.com From xfs-owner@oss.sgi.com Mon Sep 3 02:20:37 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00, T_TVD_MIME_NO_HEADERS autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q837Kb1a163251 for ; Mon, 3 Sep 2012 02:20:37 -0500 X-ASG-Debug-ID: 1346656889-04cbb0271a69d00001-w1Z2WR Received: from helios.rbi.informatik.uni-frankfurt.de (helios.rbi.informatik.uni-frankfurt.de [141.2.1.4]) by cuda.sgi.com with ESMTP id lL0KY8ICQahCjGFx for ; Mon, 03 Sep 2012 00:21:32 -0700 (PDT) X-Barracuda-Envelope-From: X-Barracuda-Apparent-Source-IP: 141.2.1.4 Received: from localhost (localhost) by helios.rbi.informatik.uni-frankfurt.de (8.14.3/8.13.8) id q837LTOv004322; Mon, 3 Sep 2012 09:21:29 +0200 Date: Mon, 3 Sep 2012 09:21:29 +0200 From: Mail Delivery Subsystem Message-Id: <201209030721.q837LTOv004322@helios.rbi.informatik.uni-frankfurt.de> To: MIME-Version: 1.0 Content-Type: multipart/report; report-type=delivery-status; boundary="q837LTOv004322.1346656889/helios.rbi.informatik.uni-frankfurt.de" Content-Transfer-Encoding: 8bit Subject: Returned mail: see transcript for details Auto-Submitted: auto-generated (failure) X-ASG-Orig-Subj: Returned mail: see transcript for details X-Barracuda-Connect: helios.rbi.informatik.uni-frankfurt.de[141.2.1.4] X-Barracuda-Start-Time: 1346656892 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.20 X-Barracuda-Spam-Status: No, SCORE=0.20 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=ANY_BOUNCE_MESSAGE, BOUNCE_MESSAGE, BSF_SC0_SA590, EMPTY_ENV_FROM X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107465 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 EMPTY_ENV_FROM Empty Envelope From Address 0.20 BSF_SC0_SA590 Custom Rule SA590 0.00 BOUNCE_MESSAGE MTA bounce message 0.00 ANY_BOUNCE_MESSAGE Message is some kind of bounce message This is a MIME-encapsulated message --q837LTOv004322.1346656889/helios.rbi.informatik.uni-frankfurt.de The original message was received at Mon, 3 Sep 2012 09:20:58 +0200 from triband-mum-59.182.143.138.mtnl.net.in [59.182.143.138] ----- The following addresses had permanent fatal errors ----- (reason: 550 5.1.1 ... User unknown) ----- Transcript of session follows ----- ... while talking to mail.informatik.uni-frankfurt.de.: >>> DATA <<< 550 5.1.1 ... User unknown 550 5.1.1 ... User unknown <<< 503 5.0.0 Need RCPT (recipient) --q837LTOv004322.1346656889/helios.rbi.informatik.uni-frankfurt.de Content-Type: message/delivery-status Reporting-MTA: dns; helios.rbi.informatik.uni-frankfurt.de Received-From-MTA: DNS; triband-mum-59.182.143.138.mtnl.net.in Arrival-Date: Mon, 3 Sep 2012 09:20:58 +0200 Final-Recipient: RFC822; fp@informatik.uni-frankfurt.de Action: failed Status: 5.1.1 Remote-MTA: DNS; mail.informatik.uni-frankfurt.de Diagnostic-Code: SMTP; 550 5.1.1 ... User unknown Last-Attempt-Date: Mon, 3 Sep 2012 09:21:29 +0200 --q837LTOv004322.1346656889/helios.rbi.informatik.uni-frankfurt.de Content-Type: text/rfc822-headers Content-Transfer-Encoding: 8bit Return-Path: Received: from oss.sgi.com (triband-mum-59.182.143.138.mtnl.net.in [59.182.143.138]) by helios.rbi.informatik.uni-frankfurt.de (8.14.3/8.13.8) with ESMTP id q837KuOv004269 for ; Mon, 3 Sep 2012 09:20:58 +0200 Message-Id: <201209030720.q837KuOv004269@helios.rbi.informatik.uni-frankfurt.de> From: linux-xfs@oss.sgi.com To: fp@informatik.uni-frankfurt.de Subject: Delivery failed Date: Mon, 3 Sep 2012 12:51:00 +0530 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_0013_9317198C.940976AB" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2600.0000 X-MIMEOLE: Produced By Microsoft MimeOLE V6.00.2600.0000 X-Spam-Flag: YES X-Spam-Status: Yes, score=16.5 required=5.0 version=3.2.5 X-Spam-Level: **************** X-Spam-Checker-Version: SpamAssassin 3.2.5 (2008-06-10) on helios.rbi.informatik.uni-frankfurt.de --q837LTOv004322.1346656889/helios.rbi.informatik.uni-frankfurt.de-- From jack@suse.cz Mon Sep 3 05:18:03 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q83AI2m0184642 for ; Mon, 3 Sep 2012 05:18:02 -0500 X-ASG-Debug-ID: 1346667536-04bdf07900786a0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id qMHSglRpQSBdVEFY (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 03 Sep 2012 03:18:58 -0700 (PDT) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay1.suse.de (unknown [195.135.220.254]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx2.suse.de (Postfix) with ESMTP id 1C6DDA3ABA; Mon, 3 Sep 2012 12:18:55 +0200 (CEST) Received: by quack.suse.cz (Postfix, from userid 1000) id ABA6120636; Mon, 3 Sep 2012 12:18:54 +0200 (CEST) Date: Mon, 3 Sep 2012 12:18:54 +0200 From: Jan Kara To: Dave Chinner Cc: Christoph Hellwig , Sage Weil , Jan Kara , xfs@oss.sgi.com Subject: Re: xfs sb_internal#2 lockdep splat Message-ID: <20120903101854.GD21109@quack.suse.cz> X-ASG-Orig-Subj: Re: xfs sb_internal#2 lockdep splat References: <20120901230425.GA6896@infradead.org> <20120902003731.GK15292@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20120902003731.GK15292@dastard> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1346667537 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107475 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sun 02-09-12 10:37:31, Dave Chinner wrote: > On Sat, Sep 01, 2012 at 07:04:26PM -0400, Christoph Hellwig wrote: > > I've had some time to look at this issue and it seems to be due to the > > brand new filesystem freezing code in the VFS which (ab-)uses lockdep > > in a creative way. > > Yes. It's interacting strangely with other lockdep abuses like the > work queue annotations, which is where this one is coming from. > Basically, freeze counters and work queue flushes are *not locks*, > but lockdep is being told they are locks and it's not smart enough > to know the difference. It just sees different orders in different > contexts and complains. Well, freeze counters are locks (if we didn't care for performance they would be rw semaphores) but their usage is rather specific so not everything lockdep thinks is possible is really possible. But that has always been the problem with lockdep and more unusual lock usage. > > In short the XFS code to flush pending delalloc data when running into > > ENOSPC conditions. I don't understand the fsfreeze code and its usage > > of lockdep enough to confirm if the warning is correct, but Dave has > > patches to rip this code path out in the current from and replace it > > with the VM layer code used by ext4 and btrfs. I suspect that should > > sort out this issue. > > Right, after a couple of days of thinking, I think the root of the > issue is that lockdep sees that the data writeback done by the > xfs_flush_worker can run transactions, but does so while holding an > open transaction. So we have a wait synchronous with an open > transaction that is dependent on other transactions being started. > > However, this is a false positive warning because of freeze > behaviour (context) that lockdep is not aware of and cannot be told > about. That is, the inode flush will always be completed before the > freeze can progress past the FREEZE_WRITE stage, and the > transactions are in the FREEZE_FS context. IOWs: > > > > [23405.638393] Possible unsafe locking scenario: > > > [23405.638393] > > > [23405.638394] CPU0 CPU1 > > > [23405.638394] ---- ---- > > > [23405.638396] lock(sb_internal#2); > > > [23405.638398] lock((&mp->m_flush_work)); > > > [23405.638400] lock(sb_internal#2); > > > [23405.638402] lock((&mp->m_flush_work)); > > ignores the fact the CPU0 lock order is actually: > > lock(sb_internal#0); << FREEZE_WRITE > lock(sb_internal#2); << FREEZE_FS > lock((&mp->m_flush_work)); > > And that it is safe to do any sort of dependent lock of > sb_internal#2 while a sb_internal#0 lock is held and that nested > dependent sb_internal#2 lock levels is also safe for the same > reason. Inversions/nesting of FREEZE_FS only matter outside > FREEZE_WRITE/FREEZE_PAGECACHE context, not when they are inside that > context. > > Indeed, changing the code to use the VFS flush functions doesn't > change this at all - we still block waiting for IO submission and > hence allocation transactions whilst holding the same "locks". We'll > just avoid lockdep false positives because the VFS writeback code > doesn't use the workqueue infrastructure and hence has no lockdep > annotations to make waiting for the IO submission look like a > lock... Yeah. If locking annotations for freeze locks show up doing more bad than good we can remove them (at least at innermost level which seems to be the most problematic for XFS) but they caught quite some problems when I was developing the code so I believe there is a value in them. Honza -- Jan Kara SUSE Labs, CR From tinguely@sgi.com Mon Sep 3 19:12:54 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q840CsW7004490 for ; Mon, 3 Sep 2012 19:12:54 -0500 Received: from [128.162.232.196] (eagdhcp-232-196.americas.sgi.com [128.162.232.196]) by relay1.corp.sgi.com (Postfix) with ESMTP id 798488F8049; Mon, 3 Sep 2012 17:13:49 -0700 (PDT) Message-ID: <504547BC.3000907@sgi.com> Date: Mon, 03 Sep 2012 19:13:48 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH V2 00/13] xfs: remove the xfssyncd mess References: <1346328017-2795-1-git-send-email-david@fromorbit.com> <5040C3A0.2050107@sgi.com> <20120903040523.GP15292@dastard> In-Reply-To: <20120903040523.GP15292@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/02/12 23:05, Dave Chinner wrote: > On Fri, Aug 31, 2012 at 09:01:04AM -0500, Mark Tinguely wrote: >> On 08/30/12 07:00, Dave Chinner wrote: >>> Version 2 of the patchset I described here: >>> >>> http://oss.sgi.com/archives/xfs/2012-06/msg00064.html >>> >>> This version has run through xfstests completely once, so it's >>> less likely to let smoke out.... >>> >>> Version 2: >>> - fix writeback_inodes_sb_if_idle call in xfs_create() >>> - refreshed patch 13 before sending. >>> >>> _______________________________________________ >>> xfs mailing list >>> xfs@oss.sgi.com >>> http://oss.sgi.com/mailman/listinfo/xfs >> >> I wanted to get a fast look at your patch series. I am getting the >> following ASSERT on xfstest 179 when running the series with the >> latest OSS soruces.The ASSERT appears to start at patch number 3. >> Sorry these boxes won't kdump the top of tree kernels: >> >> [17474.545964] XFS: Assertion failed: atomic_read(&bp->b_hold)> 0, >> file: /root/xfs/fs/xfs/xfs_buf.c, line: 896 > > FWIW, when you paste stack traces, can you turn off line wrapping > when you paste it so the crash is simple to quote in reply? (use > :set paste in mutt, the :set nopaste when finished pasting it in). > >> [17474.559784] Process umount (pid: 26427, threadinfo > ... >> [17474.559784] Call Trace: >> [17474.559784] [] xfs_buf_rele+0xa4/0x1b0 [xfs] >> [17474.559784] [] xfs_buf_iodone_work+0x46/0x50 [xfs] >> [17474.559784] [] xfs_buf_ioend+0x96/0x120 [xfs] >> [17474.559784] [] xfs_buf_iodone_callbacks+0x59/0x230 [xfs] >> [17474.559784] [] xfs_buf_iodone_work+0x21/0x50 [xfs] >> [17474.559784] [] xfs_buf_ioend+0x96/0x120 [xfs] >> [17474.559784] [] xfs_buf_item_unpin+0x289/0x2d0 [xfs] >> [17474.559784] [] xfs_trans_committed_bulk+0x213/0x300 [xfs] >> [17474.559784] [] xlog_cil_committed+0x36/0x130 [xfs] >> [17474.559784] [] xlog_cil_push+0x308/0x430 [xfs] >> [17474.559784] [] xlog_cil_force_lsn+0x146/0x1b0 [xfs] >> [17474.559784] [] _xfs_log_force+0x64/0x280 [xfs] >> [17474.559784] [] xfs_log_force+0x54/0x80 [xfs] >> [17474.559784] [] xfs_fs_sync_fs+0x2d/0x50 [xfs] >> [17474.559784] [] __sync_filesystem+0x2b/0x50 >> [17474.559784] [] sync_filesystem+0x43/0x60 >> [17474.559784] [] generic_shutdown_super+0x36/0xe0 >> [17474.559784] [] kill_block_super+0x2c/0x80 >> [17474.559784] [] deactivate_locked_super+0x38/0x90 >> [17474.559784] [] deactivate_super+0x61/0x70 >> [17474.559784] [] mntput_no_expire+0x149/0x1b0 >> [17474.559784] [] sys_umount+0x6e/0xd0 > > Nothing has been shut down in XFS at this point (i.e. .put_super() > has not yet been called) so none of the shutdown changes could have > caused this problem. > > Indeed, it looks like this is during a forced shutdown here in > xfs_buf_item_unpin: > > } else if (freed&& remove) { > xfs_buf_lock(bp); > xfs_buf_ioerror(bp, EIO); > XFS_BUF_UNDONE(bp); > xfs_buf_stale(bp); >>>>>>> xfs_buf_ioend(bp, 0); > } > > Now, xfs_buf_stale() does this: > > ASSERT(atomic_read(&bp->b_hold)>= 1); > > Which means that in calling xfs_buf_ioend(), at least two references > to the buffer are being dropped. Working out why that is occurring > will find the root cause of this problem. > > All that I can say at this point is that I find it highly unlikely > that it is caused by the changes in this patchset. > >> I got this ASSERT when I ran it on the 8/27 OSS sources: >> >> [188646.952426] XFS: Assertion failed: >> atomic_read(&iclog->ic_refcnt) == 0, file: >> /root/xfs/fs/xfs/xfs_log.c, line: 2590 > >> [188646.967020] Process kworker/2:1H (pid: 356, threadinfo ffff8808396a4000, task ffff88083a9aa1c0) >> [188646.967020] Call Trace: >> [188646.967020] [] xlog_state_done_syncing+0x7f/0x110 [xfs] >> [188646.967020] [] xlog_iodone+0x7e/0x100 [xfs] >> [188646.967020] [] xfs_buf_iodone_work+0x21/0x50 [xfs] >> [188646.967020] [] process_one_work+0x1d3/0x370 >> [188646.967020] [] worker_thread+0x133/0x390 >> [188646.967020] [] kthread+0x9e/0xb0 >> [188646.967020] [] kernel_thread_helper+0x4/0x10 > > I've never seen that ASSERT fire. That implies we've got a log > buffer that is being actively modified under IO, but I cannot see > how that would happen. Was this during an unmount? What test? > > /me is starting to wonder about memory errors... > > Cheers, > > Dave. all panic on xfstest 179 - 3 different machines: 2 are x86_64 and one is x86_32. I believe all have XFS debug turned. I will see what else I can find out. --Mark. From 3VMZFUAgHA3801_dxglr459.frp0ivrvv.vjl.frp@photos-server.bounces.google.com Tue Sep 4 04:13:01 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.8 required=5.0 tests=BAYES_50,FROM_126 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q849D1Rp057054 for ; Tue, 4 Sep 2012 04:13:01 -0500 X-ASG-Debug-ID: 1346750037-04cb6c2363d40b0001-NocioJ Received: from mail-pz0-f73.google.com (mail-pz0-f73.google.com [209.85.210.73]) by cuda.sgi.com with ESMTP id 9A11w8OWZzvOEQpH (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 04 Sep 2012 02:13:57 -0700 (PDT) X-Barracuda-Envelope-From: 3VMZFUAgHA3801_dxglr459.frp0ivrvv.vjl.frp@photos-server.bounces.google.com X-Barracuda-Apparent-Source-IP: 209.85.210.73 X-Barracuda-IPDD: Level1 [photos-server.bounces.google.com/209.85.210.73] Received: by dala9 with SMTP id a9so484612dal.2 for ; Tue, 04 Sep 2012 02:13:56 -0700 (PDT) X-Barracuda-IPDD: Level1 [photos-server.bounces.google.com/209.85.210.73] X-Barracuda-IPDD: Level1 [photos-server.bounces.google.com/209.85.210.73] MIME-Version: 1.0 Received: by 10.66.88.168 with SMTP id bh8mt8266340pab.10.1346750036888; Tue, 04 Sep 2012 02:13:56 -0700 (PDT) Reply-To: xingyao wu Message-ID: Date: Tue, 04 Sep 2012 09:13:56 +0000 Subject: xingyao wu shared photos with you From: xingyao wu X-ASG-Orig-Subj: xingyao wu shared photos with you To: xfs@oss.sgi.com Content-Type: multipart/mixed; boundary=f46d042dfcf98d269d04c8dcadaf X-Barracuda-Connect: mail-pz0-f73.google.com[209.85.210.73] X-Barracuda-Start-Time: 1346750037 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107567 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --f46d042dfcf98d269d04c8dcadaf Content-Type: text/plain; charset=ISO-8859-1; format=flowed; delsp=yes Hello my Friend How are you? We have JBL speakers, YAMAHA amplifier,SHURE microphones, DBX equalizer. . . If you are interested in our products, please contact us, we can send the price list to you, we can give you the lowest price, best quality. We will make you satisfied. Thank you I wish you happy every day! Meiling --f46d042dfcf98d269d04c8dcadaf Content-Type: image/jpeg; name="=?UTF-8?B?5YWt5Lu25aWXLkpQRw==?=" Content-Disposition: attachment; filename="=?UTF-8?B?5YWt5Lu25aWXLkpQRw==?=" Content-Transfer-Encoding: base64 /9j/4AAQSkZJRgABAQAAAQABAAD/4V3GRXhpZgAASUkqAAgAAAAMAA4BAgAgAAAAngAAAA8BAgAF AAAAvgAAABABAgAJAAAAwwAAABoBBQABAAAAzAAAABsBBQABAAAA1AAAACgBAwABAAAAAgAAADEB AgAHAAAA3AAAADIBAgAUAAAA4wAAADsBAgAHAAAA9wAAABMCAwABAAAAAgAAAGmHBAABAAAAGgEA AKXEBwAcAAAA/gAAAFAqAAAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgAFNPTlkARFND LVczNTAASAAAAAEAAABIAAAAAQAAAFBpY2FzYQAyMDEwOjA2OjI3IDEwOjA2OjAyAFBpY2FzYQBQ cmludElNADAzMDAAAAIAAgABAAAAAQEBAAAAHwCaggUAAQAAAJQCAACdggUAAQAAAJwCAAAiiAMA AQAAAAIAAAAniAMAAQAAAPoAAAAAkAcABAAAADAyMjEDkAIAFAAAAKQCAAAEkAIAFAAAALgCAAAB kQcABAAAAAECAwACkQUAAQAAAMwCAAAEkgoAAQAAANQCAAAFkgUAAQAAANwCAAAHkgMAAQAAAAUA AAAIkgMAAQAAAAAAAAAJkgMAAQAAAB8AAAAKkgUAAQAAAOQCAAB8kgcADCcAAA4DAAAAoAcABAAA ADAxMDABoAMAAQAAAAEAAAACoAQAAQAAAOABAAADoAQAAQAAAGgBAAAFoAQAAQAAABoqAAAAowcA AQAAAAMAAAABowcAAQAAAAEAAAABpAMAAQAAAAAAAAACpAMAAQAAAAAAAAADpAMAAQAAAAAAAAAG pAMAAQAAAAAAAAAIpAMAAQAAAAAAAAAJpAMAAQAAAAAAAAAKpAMAAQAAAAAAAAAgpAIAIQAAAOwC AAAAAAAACgAAAIIAAAAbAAAACgAAADIwMTA6MDY6MjcgMTA6MDY6MDIAMjAxMDowNjoyNyAxMDow NjowMgAEAAAAAQAAAAAAAAAKAAAALwAAABAAAADWAQAAZAAAADg4OGQ3ZjJiYWJkZjQ4YTcxMDg1 YmFlYzE1M2ZmMGU2AABTT05ZIERTQyAAAAArAAAgBwABAAAAAAAAAAogBAABAAAAAAAAAAAwBwBI AQAAJAUAAAGQBwBYAgAAbAYAAAKQBwBEAQAAxAgAAAOQBwCwAQAACAoAAASQBwAcAgAAuAsAAAWQ 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 v1w006ZqD9MHLw/TQpXx06dRDi/gXb7TdNPxUc7TE1HwLwhdh1H0UZXTD1FsLztRXdMQXU7TH1EH LyfTvtOH0wYvAAAAAAAAAADTAAAAAAAAAAAACAAAANgAAAAAAAAAQADqAAAACACBAAAAAAAAAAQA AADYAAUAAAAAAAAAIAAAANgAkgAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAA2ACtCMoBLAgs CG8I6gjJAG8IBAgNCCwIIghsCEoAbwg4CIIIWQhmCBEInwDJCCAIYAjbCMkBEAgHAT4IJAioCKII vgjtCIYBbwgsCMoIVAgsCMkIbgipAa0BSQH6AC4BfggsCHwIUkBtQP7Y6Q7rDusOf1582DTYhtjd 2BpeLg7950UEcQ6UXo9eRV532FbY+H0M2AfYpX0yfWZ9FkDVQHtAwkCgQMEbORtCCF0IIAidAZcB ngFtAUEBLwFAAQ0AZADWAGMAogC0AKYAnwA6AOEA6QA6ANoAdgAlADYAqwBkABEbGwAAAAAASqxv I0tYAAAA2BSKy4q8lXbiHwwAADUAYF71G/PYDVYfVg8vWAS8G+Eb30AnVkfquIhFBA8ImRuXCPPq x17qBAtWiX3lG4EIz3DM2El9k2lZG79AGn3nKGkOWQ5HvnxeXH012BFeUtj+54Xna9gKG8VAIghk QBvYmw4K2EwAMwBYAFMAagEnAGwAtwArABgAMQDBAFcAbAB0AEwASADbAGEASAAjAJEAagBCADIA 8ACtAAIAIwCRAHUBRQDEAPkAQQDjAE8AlgC3AEEAgwBuAC8AagC7ACgAxQBhAM8AoQHEfYkbgkB1 BMXY7wHZAcsIDkByG0zYNQjCARQIqAHb53wbUxsPDgYbXQg/AaReahtrAa9e7gjNCC19s3BfCHoB 3Oqr2GMI+AjHG2obc0BUQIkb6QhNCP4BCgHbG05ATxsBAAAAeQD2AMIAAAAAAF4AAAAvAFEAKwAA AAAAQAAAAL4AzQC2AM0AAABeAAAAzQAbAAgAzQAAAH0AAAAgAEAAGwCIAAAAfQBAAEAAAQAEAFYA QAAAAAAAAAAAAAAAfQBwABsAcmk4IJwwANee1+LXq74JMOMgAyCmvqGBgLsPkneSW7tLgc++AAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAk+rTBQRwVmmYiEppHLbaigrNyM3a iha2aSD1MHogGIhctu+KAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXLqC ur26bLrGRz5HCUfeR/VHtrbtcCpwvXBOcGlwZ4qFiq+KAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAABeAAAADqKaAF9EBQHiILYBQJfBAA3yCAAOopoAX0QFAeIgtgFAl8EA DqKaAF9EBQHiILYBQJfBAA3yCAAN8ggADqKaAF9EBQHiILYBQJfBAKYNYAAum9sAtEQxAIKjjgAO opoAX0QFAeIgtgFAl8EA754AAGxMAQAjIwEAhXoAAA3yCAAOEAEADfIIAH5AAAAzTCIx2oeW5W/T tMwGUWy48GovJTNMCOWM8Op7s0x5c8fF9uX80x0GugchbfNqAMwfh3nlDofye0saBsMX8JMxbcXT jArFSOUPOSCwD0ywFSTFvPMvhxbUqEx6vIWHNC3MTDUxLYf35aAalOg/THLbX4fOFe2HBzE44g2k VRpcFS9Ma+U+Gsnz6UyOc71MOxgeTLFzSExfvMQaMsOSTHdzj4fQGItMj3O5xT2/VIcZ1F3FlvPt xYlfdIf75XiHhhgrGgAxBASVoEXnBVYEDCgCDrbqVpWBbAzqtlYk175qzQXqjgyVTAVwcCC2DIFp DupezbYwDAAAAAAAAAAAAAAAG7tpAbV+8xxFJbsIAP/+uwAAAAAAAAAAAAAAAAAAAAAA3P9rAAAA AAAAAAAAAP/64U/hdhzyHHwAAAAAAAAA6kpAbf5KMAVwSvdKl0qQ13BKAW3rSiC+cEpZSkJK67tw SmltLEppKHBKZ0pCSkOBcG3+baNKQDBwSo9KTUqjbHBt+230SgFpcEqdStVKcYFwbfRt0UoAknBK 7UrVStnXcG3xbfJt+tdwSmRK8kr9oHBt7W2AbRKScEpvSlk8AdNwbQ1t1m07u3BK9UqJPDAocG14 bS5teLZwPDBKDzwwIHBtj22nbaiBcEr+Sv08bHBwbT9toW1CvnA8BTwbPCi+cAgAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAXogAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAA4b3Di6AAAAigABAAEAAAAAAAAAAQAAAAAAAAAkeSSsAAAAALoA AAAAxEo2AEpYAJVw2Dlw2AgAAAAAAKsaSjb2AQAAAAAAAADESjYAABcAAHAAAABeSjaVAAAAAAAA AAgAAQATw6SVAkeVAiQkugAAAAAAeQKRArqReUcAAAAAs822IOBwtgfgcLZwAG26hgAAAAAATDQ9 AAAAAAAAAAA02kUcsWm2lUJptlEjMLbTAQEBADgwti8zMLa2FIG2amG7tl1Bu7YCAABKCD4BAAAA ACkcACfnAKW7tsSmu7ZpNNpFHNAWRRzZu7Zc2bu2iABstjkAbLa3PnCu6gBKWAA02kUcx31HQAAA 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 AgAAADIBAgAUAAAA7CoAAAECBAABAAAAACsAAAICBAABAAAAvTIAAAAAAABTT05ZAERTQy1XMzUw AEgAAAABAAAASAAAAAEAAAAyMDEwOjA2OjI3IDEwOjA2OjAyAP/Y/9sAhAABAQEBAQEBAQEBAQEB AgIDAgICAgIEAwMCAwUEBQUFBAQEBQYHBgUFBwYEBAYJBgcICAgICAUGCQoJCAoHCAgIAQEBAQIC AgQCAgQIBQQFCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI CAj/xAGiAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgsQAAIBAwMCBAMFBQQEAAABfQECAwAE EQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZH SElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1 tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+gEAAwEBAQEBAQEBAQAA AAAAAAECAwQFBgcICQoLEQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGh scEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlq c3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV 1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/wAARCAB4AKADASEAAhEBAxEB/9oADAMBAAIRAxEAPwD+ Uvwz4bh1ixuxInkzw8qp+XK4znHT/wCv9K9D0rTdQtp7XSZrVbyJn8oXRGQOnGeccHqPUVg9bmsb t3Z6dq2m3ekXj3WlwWlxp01upuIhwYnDAAxjGSRwcH615B+0UdNh+OVh47vFxonjTw7ZazI7rgC6 2fZ7kt6H7RbTk+ma0optNk1dzBPh628KNb+JtN842x+SeFGyHjPAb8ODW5a2nhjx0zvIrrKoKkBi HUdj/Shtv3iRLHWbbwk58N6ik09smFhlYgZjb+8fatm98GadaQf8JVYArdxfvxGD8suP5cGlre/c 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 VOvDd6Aqb26nFeJ/HX7LWrWVrH4S+Gmt+F75R++u3lmuPOb+8UaUqvOTgVw1n4l8Aw7Y4ta1ERjl S9qy/wAs1r7WHczlTncg1GfwVfahbazD4pFvNBL53kvA+JMKVwWwMAg9a2vhpqviPT/Eni/4ga78 O7rx74a0+2Ol6mb6O7uLOMM4ZBNKp+UDAKgtjp6VVeHLhni5tKmpxhdu3vTvyr1dml3ehDm1Lllv v/X3mjrvxpimvnu/h3o+n/DSxnhSO5t9DlmSK7I3gM+9yS2JGX6Vy0/xf8dSK5n8XeIpA2SS105z kDPf/ZB/AVy+0dzVI888afETxBqlmbS51q9v3kcswmlZtik5ORnuc/rXX/s9+F/CfxF1vVPCnisy JeSx+basH2q237y49cc/nXPJ88rNnTKLVNz6n//ZAP/hAiZodHRwOi8vbnMuYWRvYmUuY29tL3hh cC8xLjAvADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlk Ij8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3Jl IDUuMS4yIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIy LXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6ZGM9 Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj4gPGRjOmNyZWF0b3I+IDxyZGY6U2Vx PiA8cmRmOmxpPlBpY2FzYTwvcmRmOmxpPiA8L3JkZjpTZXE+IDwvZGM6Y3JlYXRvcj4gPC9yZGY6 RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+ICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD94cGFj a2V0IGVuZD0idyI/Pv/tAFpQaG90b3Nob3AgMy4wADhCSU0EBAAAAAAAIRwBAAACAAQcAVoAAxsl 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 --f46d042dfcf98d269d04c8dcadaf-- From bfoster@redhat.com Tue Sep 4 09:08:18 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q84E8H5O104756 for ; Tue, 4 Sep 2012 09:08:17 -0500 X-ASG-Debug-ID: 1346767754-04bdf078fdda950001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id OcXHDXzYv3PkNKWD for ; Tue, 04 Sep 2012 07:09:15 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q84E9DwJ006525 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 4 Sep 2012 10:09:14 -0400 Received: from bfoster.bfoster ([10.16.225.83]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q84E9CwI031723; Tue, 4 Sep 2012 10:09:12 -0400 Message-ID: <50460BB8.1060701@redhat.com> Date: Tue, 04 Sep 2012 10:10:00 -0400 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:14.0) Gecko/20120717 Thunderbird/14.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [RFC PATCH 2/4] xfs: create function to scan and clear EOFBLOCKS inodes References: <1346097111-4476-1-git-send-email-bfoster@redhat.com> <1346097111-4476-3-git-send-email-bfoster@redhat.com> <20120903050612.GR15292@dastard> X-ASG-Orig-Subj: Re: [RFC PATCH 2/4] xfs: create function to scan and clear EOFBLOCKS inodes In-Reply-To: <20120903050612.GR15292@dastard> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1346767755 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com On 09/03/2012 01:06 AM, Dave Chinner wrote: > On Mon, Aug 27, 2012 at 03:51:49PM -0400, Brian Foster wrote: ... >> +/* >> + * Handle an EOFBLOCKS tagged inode. If this is a forced scan, we wait on the >> + * iolock ourselves rather than rely on the trylock in xfs_free_eofblocks(). >> + * >> + * We rely on the output parameter from xfs_free_eofblocks() to determine >> + * whether we should clear the tag because in the trylock case, it could have >> + * skipped the inode due to lock contention. >> + */ >> +STATIC int >> +xfs_inode_free_eofblocks( >> + struct xfs_inode *ip, >> + int flags) >> +{ >> + int ret = 0; >> + bool freed = false; >> + bool wait_iolock = (flags & EOFBLOCKS_WAIT) ? true : false; >> + >> + if (wait_iolock) >> + xfs_ilock(ip, XFS_IOLOCK_EXCL); > > Why do we need the IO lock here? xfs_free_eofblocks() does all the > necessary locking.... > This was for the wait case (e.g., xfs_free_eofblocks() does a trylock on the IO lock and we want to wait for the lock in this case). Brian >> + >> + if ((S_ISREG(ip->i_d.di_mode) && >> + (VFS_I(ip)->i_size > 0 || >> + (VN_CACHED(VFS_I(ip)) > 0 || ip->i_delayed_blks > 0)) && >> + (ip->i_df.if_flags & XFS_IFEXTENTS)) && >> + (!(ip->i_d.di_flags & (XFS_DIFLAG_PREALLOC | XFS_DIFLAG_APPEND)))) { > > This check is now repeated in 3 places - xfs_inactive, xfs_release > and now here. I think it needs a helper. > >> + /* !wait_iolock == need_iolock in xfs_free_eofblocks() */ >> + ret = xfs_free_eofblocks(ip->i_mount, ip, !wait_iolock, &freed); >> + if (freed) >> + xfs_inode_clear_eofblocks_tag(ip); > > If you move xfs_inode_clear_eofblocks_tag() inside > xfs_free_eofblocks(), there's no need for this extra return value. > >> + } else { >> + /* inode could be preallocated or append-only */ >> + xfs_inode_clear_eofblocks_tag(ip); > > This should be a rare event - it's probably worth adding a pair of > trace events here for the two cases so we can see if there is ever a > significant number of inodes being scanned for prealloc that can't > be cleared... > > (e.g 'perf top -e xfs:xfs_i*' to count all the inode events) > >> + } >> + >> + if (wait_iolock) >> + xfs_iunlock(ip, XFS_IOLOCK_EXCL); >> + >> + return ret; >> +} >> + >> +/* >> + * Determine whether an inode matches a particular qouta id. >> + */ >> +STATIC int >> +xfs_inode_match_quota_id( >> + struct xfs_inode *ip, >> + int qtype, >> + uint32_t id) >> +{ >> + switch (qtype) { >> + case XFS_DQ_USER: >> + return ip->i_d.di_uid == id; >> + case XFS_DQ_GROUP: >> + return ip->i_d.di_gid == id; >> + default: >> + return xfs_get_projid(ip) == id; >> + } >> + >> + return 0; >> +} > > There's nothing really quota specific about this scan. I'd leave > this functionality to a separate patch once all the core > infrastructure is in place. > >> + >> +/* >> + * This is mostly copied from xfs_reclaim_inodes_ag(). >> + * >> + * TODO: >> + * - Could we enhance ag_iterator to support a tag and use it instead of this? > > Yes. This code is too tricky to duplicate for every use case, and > this doesn't have special case requirements like the reclaim code. > > i.e. the xfs_inode_free_eofblocks() becomes the execute function > (and the quota checks move inside that eventually). Passing a tag of > "-1" would indicate a non-tag lookup, otherwise use a tag based > lookup. Given the extra fields that this version uses, passing a > void *args is probably necessary so that a structure can be passed > to the execute function along with the flags.... > > I'd suggest this conversion should be done in a patch prior to > introducing this scanner. > > FWIW, this is going to conflict with my "get rid of xfs-sync.c patch > series, so we'll need to work out who rebases what at some point. > >> + */ >> +int >> +xfs_inodes_free_eofblocks( >> + struct xfs_mount *mp, >> + int qtype, >> + uint32_t id, >> + uint64_t min_file_size, >> + int flags) >> +{ > ..... >> + for (i = 0; i < nr_found; i++) { >> + if (!batch[i]) >> + continue; >> + >> + /* default projid represents a full scan */ > > I don't think thats a good idea. From a normal users perspective, > the background trimming will occur irrespective of the quota groups > the inode is part of. Background trimming defines the default > behaviour, because that's what 99.99% of users will see active, not > quota/application specific events driven through ioctls. > > IOWs, selecting inodes by quota type/id for pruning is a secondary > function of the execute implementation, not a primary concern of the > infrastructure. > >> + if ((!(qtype == XFS_DQ_PROJ && >> + id == XFS_PROJID_DEFAULT) && >> + !xfs_inode_match_quota_id(batch[i], qtype, >> + id)) || >> + (min_file_size && XFS_ISIZE(batch[i]) < >> + min_file_size) > >> + ) { >> + IRELE(batch[i]); >> + continue; >> + } > > Moving this check to the execute function will get rid of the indent > mess.... > >> + >> + error = xfs_inode_free_eofblocks(batch[i], flags); >> + IRELE(batch[i]); >> + if (error) >> + last_error = error; >> + } >> + >> + cond_resched(); >> + >> + } while (nr_found && !done); >> + >> + xfs_perag_put(pag); >> + } >> + >> + return XFS_ERROR(last_error); >> +} >> + >> STATIC void >> __xfs_inode_set_eofblocks_tag( >> struct xfs_perag *pag, >> diff --git a/fs/xfs/xfs_sync.h b/fs/xfs/xfs_sync.h >> index 4486491..78aca41 100644 >> --- a/fs/xfs/xfs_sync.h >> +++ b/fs/xfs/xfs_sync.h >> @@ -43,8 +43,11 @@ void __xfs_inode_set_reclaim_tag(struct xfs_perag *pag, struct xfs_inode *ip); >> void __xfs_inode_clear_reclaim_tag(struct xfs_mount *mp, struct xfs_perag *pag, >> struct xfs_inode *ip); >> >> +#define EOFBLOCKS_WAIT 0x0001 > > I'd just reuse SYNC_WAIT and SYNC_TRYLOCK which are already defined > and used by the sync and reclaim iterators. > >> + >> void xfs_inode_set_eofblocks_tag(struct xfs_inode *ip); >> void xfs_inode_clear_eofblocks_tag(struct xfs_inode *ip); >> +int xfs_inodes_free_eofblocks(struct xfs_mount *, int, uint32_t, uint64_t, int); >> >> int xfs_sync_inode_grab(struct xfs_inode *ip); >> int xfs_inode_ag_iterator(struct xfs_mount *mp, >> diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c >> index 658ee2e..53460f3 100644 >> --- a/fs/xfs/xfs_vnodeops.c >> +++ b/fs/xfs/xfs_vnodeops.c >> @@ -150,11 +150,12 @@ xfs_readlink( >> * when the link count isn't zero and by xfs_dm_punch_hole() when >> * punching a hole to EOF. >> */ >> -STATIC int >> +int >> xfs_free_eofblocks( >> xfs_mount_t *mp, >> xfs_inode_t *ip, >> - bool need_iolock) >> + bool need_iolock, >> + bool *blocks_freed) > > I don't really see a point to adding this. Either we removed all the > EOF blocks or we didn't, and that means we should just clear the > tags directly in this function if it is appropriate. > > Cheers, > > Dave. > From bfoster@redhat.com Tue Sep 4 09:08:52 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_42 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q84E8qSa104824 for ; Tue, 4 Sep 2012 09:08:52 -0500 X-ASG-Debug-ID: 1346767789-04cbb0271bd3140001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id WqeKSwbIrVdGcXOZ for ; Tue, 04 Sep 2012 07:09:49 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q84E9mWN006627 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 4 Sep 2012 10:09:48 -0400 Received: from bfoster.bfoster ([10.16.225.83]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id q84E9mXt011992; Tue, 4 Sep 2012 10:09:48 -0400 Message-ID: <50460BDB.40806@redhat.com> Date: Tue, 04 Sep 2012 10:10:35 -0400 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:14.0) Gecko/20120717 Thunderbird/14.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [RFC PATCH 3/4] xfs: add FREE_EOFBLOCKS ioctl References: <1346097111-4476-1-git-send-email-bfoster@redhat.com> <1346097111-4476-4-git-send-email-bfoster@redhat.com> <20120903051742.GS15292@dastard> X-ASG-Orig-Subj: Re: [RFC PATCH 3/4] xfs: add FREE_EOFBLOCKS ioctl In-Reply-To: <20120903051742.GS15292@dastard> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1346767789 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com On 09/03/2012 01:17 AM, Dave Chinner wrote: > On Mon, Aug 27, 2012 at 03:51:50PM -0400, Brian Foster wrote: >> The XFS_IOC_FREE_EOFBLOCKS ioctl allows users to invoke an EOFBLOCKS >> scan. The xfs_eofblocks structure is defined to support the command >> parameters (quota type/id and minimum file size). >> >> Signed-off-by: Brian Foster >> --- >> fs/xfs/xfs_fs.h | 10 ++++++++++ >> fs/xfs/xfs_ioctl.c | 25 +++++++++++++++++++++++++ >> fs/xfs/xfs_quota.h | 1 + >> fs/xfs/xfs_quotaops.c | 2 +- >> 4 files changed, 37 insertions(+), 1 deletions(-) >> >> diff --git a/fs/xfs/xfs_fs.h b/fs/xfs/xfs_fs.h >> index c13fed8..6f93db9 100644 >> --- a/fs/xfs/xfs_fs.h >> +++ b/fs/xfs/xfs_fs.h >> @@ -339,6 +339,15 @@ typedef struct xfs_error_injection { >> >> >> /* >> + * Speculative preallocation trimming. >> + */ >> +typedef struct xfs_eofblocks { >> + __u32 id; /* quota id */ >> + __u32 qtype; /* quota type */ >> + __u64 min_file_size; /* minimum file size */ >> +} xfs_eofblocks_t; > > No typedefs. > This is something I see throughout the code that I haven't quite followed (i.e., using the _t typedefs vs. not). Is the general consensus to move away from typedefs when possible? ... >> + case XFS_IOC_FREE_EOFBLOCKS: { >> + struct xfs_eofblocks eofb; >> + int qtype; >> + >> + if (copy_from_user(&eofb, arg, sizeof(eofb))) >> + return -XFS_ERROR(EFAULT); >> + >> + qtype = xfs_quota_type(eofb.qtype); >> + >> + /* >> + * TODO: The filtering code currently uses the id in the inode. >> + * Therefore, I don't think it really matters whether the >> + * particular quota type is enabled (and the dquot is attached). >> + * >> + * Alternatively, we could filter by dquot type. This would >> + * mean we might have to make sure dquot's are attached during >> + * the scan and that the particular quota type is enabled. I'm >> + * not sure that this buys us anything. >> + */ > > If quota is not enabled, then a request to free blocks determined by > a quota ID is invalid and should be rejected. It's a user API - what > is and isn't supported needs to be written down in black and white > (i.e. in the xfsctl man page). > Ok. I was thinking that we could support the ability to scan by uid/gid regardless of whether quota is enabled, but perhaps there's no purpose to that if a quota isn't enabled. Brian >> + /* TODO: might want to just use the eofb structure here */ >> + error = xfs_inodes_free_eofblocks(mp, qtype, eofb.id, eofb.min_file_size, EOFBLOCKS_WAIT); > > Yes, just pass the structure - it means it can be passed all the way > down to the execute function, and only that code needs to handle > different versions of the structure. > > Cheers, > > Dave. > From bfoster@redhat.com Tue Sep 4 09:09:13 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q84E9DD5104946 for ; Tue, 4 Sep 2012 09:09:13 -0500 X-ASG-Debug-ID: 1346767811-04cbb02718d3190001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id bTHBCITQtHyKnmUr for ; Tue, 04 Sep 2012 07:10:11 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q84EAAua032001 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 4 Sep 2012 10:10:10 -0400 Received: from bfoster.bfoster ([10.16.225.83]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q84EA9MX016991; Tue, 4 Sep 2012 10:10:09 -0400 Message-ID: <50460BF1.3070100@redhat.com> Date: Tue, 04 Sep 2012 10:10:57 -0400 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:14.0) Gecko/20120717 Thunderbird/14.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [RFC PATCH 4/4] xfs: add background scanning to clear EOFBLOCKS inodes References: <1346097111-4476-1-git-send-email-bfoster@redhat.com> <1346097111-4476-5-git-send-email-bfoster@redhat.com> <20120903052842.GT15292@dastard> X-ASG-Orig-Subj: Re: [RFC PATCH 4/4] xfs: add background scanning to clear EOFBLOCKS inodes In-Reply-To: <20120903052842.GT15292@dastard> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1346767811 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com On 09/03/2012 01:28 AM, Dave Chinner wrote: > On Mon, Aug 27, 2012 at 03:51:51PM -0400, Brian Foster wrote: >> Create a delayed_work to enable background scanning and freeing >> of EOFBLOCKS inodes. The scanner kicks in once speculative >> preallocation occurs and stops requeueing itself when no EOFBLOCKS >> inodes exist. >> >> Scans are queued on the existing syncd workqueue and the interval >> is tied to the syncd interval, which is a default of 30s. The >> minimum file size for a background scan is hardcoded to 100MB. > > I'd set it to be much longer than the xfs_syncd_centisecs period. > The data may not be written back for a long while, and a file that > is open, written and closed repeatedly (NFS write patterns for large > and/or slowly written files) should not have it's preallocation > truncated every 30s. > > I'd suggest that a 5 minute sweep is probably sufficiently frequent > to avoid most fragmentation issues and long term buildup of speculative > preallocation whilst not perturbing large/slow writers too much.... > Any thoughts on having tunables for both values (time and min size?) on the background scanning? > Apart from that, there isn't anything wrong with the code, except > I'll note again that it conflicts with my syncd removal patchset.... > Yeah, I skimmed through those patches and noticed it would shuffle this code around. Thanks for pointing it out. I'll keep an eye on that set. Thanks for the review. I'll follow up with a patchset that incorporates the feedback. Brian > Cheers, > > Dave. > From tinguely@sgi.com Tue Sep 4 10:47:24 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q84FlOOt117656 for ; Tue, 4 Sep 2012 10:47:24 -0500 Received: from [128.162.232.196] (eagdhcp-232-196.americas.sgi.com [128.162.232.196]) by relay1.corp.sgi.com (Postfix) with ESMTP id BEF338F8064; Tue, 4 Sep 2012 08:48:19 -0700 (PDT) Message-ID: <504622C1.20201@sgi.com> Date: Tue, 04 Sep 2012 10:48:17 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 03/13] xfs: rationalise xfs_mount_wq users References: <1346328017-2795-1-git-send-email-david@fromorbit.com> <1346328017-2795-4-git-send-email-david@fromorbit.com> In-Reply-To: <1346328017-2795-4-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 08/30/12 07:00, Dave Chinner wrote: > - /* > - * We shouldn't write/force the log if we are in the mount/unmount > - * process or on a read only filesystem. The workqueue still needs to be > - * active in both cases, however, because it is used for inode reclaim > - * during these times. Use the MS_ACTIVE flag to avoid doing anything > - * during mount. Doing work during unmount is avoided by calling > - * cancel_delayed_work_sync on this work queue before tearing down > - * the ail and the log in xfs_log_unmount. > - */ > - if (!(mp->m_super->s_flags& MS_ACTIVE)&& > - !(mp->m_flags& XFS_MOUNT_RDONLY)) { > + if (!(mp->m_flags& XFS_MOUNT_RDONLY)) { > /* dgc: errors ignored here */ > if (mp->m_super->s_writers.frozen == SB_UNFROZEN&& > xfs_log_need_covered(mp)) > @@ -408,8 +398,7 @@ xfs_sync_worker( > else > xfs_log_force(mp, 0); > > - /* start pushing all the metadata that is currently > - * dirty */ > + /* start pushing all the metadata that is currently dirty */ > xfs_ail_push_all(mp->m_ail); > } > It appears that the removal of the MS_ACTIVE flag is causing the "atomic_read(&bp->b_hold)> 0," ASSERT. --Mark. From bpm@sgi.com Tue Sep 4 11:06:12 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q84G6BkG120614 for ; Tue, 4 Sep 2012 11:06:11 -0500 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay3.corp.sgi.com (Postfix) with ESMTP id D63A6AC005; Tue, 4 Sep 2012 09:07:06 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 661E64266DC; Tue, 4 Sep 2012 11:07:06 -0500 (CDT) Date: Tue, 4 Sep 2012 11:07:06 -0500 From: Ben Myers To: Rich Johnston Cc: xfs@oss.sgi.com Subject: Re: [PATCH 0/5] Use libtool to install apps and remove relative lib paths Message-ID: <20120904160706.GJ3274@sgi.com> References: <20120828172605.607853317@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20120828172605.607853317@sgi.com> User-Agent: Mutt/1.5.20 (2009-06-14) Hey Rich, On Tue, Aug 28, 2012 at 12:26:05PM -0500, Rich Johnston wrote: > This 5 part patchset (for xfstests, dmapi and xfsdump): > > 1. Uses libtool to install the binary from the proper location and display a > warning if any shared library dependancies are not properly installed. > 2. Ensures that a libtool wrapper shell script is not installed in place of > the application when libtool wrappers are being used. > 3. Removes the undocumented feature which allowed xfs developers to build and > run xfstests without having to install the libraries. This can lead to > touble if you expect that xfstests is using the versions of the libraries > installed on the system. This patchset looks great to me. Although Dave has mentioned that the first patch probably isn't strictly necessary... I think that it's worth pulling in. Since we build with libtool we should also install with libtool. Dave also asked about dmapi. I took a brief look at the dmapi Makefiles. It appears the library is already installed using INSTALL_LTLIB. Looks good! Reviewed-by: Ben Myers From tinguely@sgi.com Tue Sep 4 11:09:20 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q84G9KqZ121113 for ; Tue, 4 Sep 2012 11:09:20 -0500 Received: from [128.162.232.196] (eagdhcp-232-196.americas.sgi.com [128.162.232.196]) by relay2.corp.sgi.com (Postfix) with ESMTP id 41285304066; Tue, 4 Sep 2012 09:10:16 -0700 (PDT) Message-ID: <504627E6.4000208@sgi.com> Date: Tue, 04 Sep 2012 11:10:14 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 01/13] xfs: xfs_syncd_stop must die References: <1346328017-2795-1-git-send-email-david@fromorbit.com> <1346328017-2795-2-git-send-email-david@fromorbit.com> In-Reply-To: <1346328017-2795-2-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 08/30/12 07:00, Dave Chinner wrote: > From: Dave Chinner > > xfs_syncd_start and xfs_syncd_stop tie a bunch of unrelated > functionailty together that actually have different start and stop > requirements. Kill these functions and open code the start/stop > methods for each of the background functions. > > Subsequent patches will move the start/stop functions around to the > correct places to avoid races and shutdown issues. > > Signed-off-by: Dave Chinner Looks good. Reviewed-by: Mark Tinguely From tinguely@sgi.com Tue Sep 4 11:13:02 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_72 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q84GD2tF121598 for ; Tue, 4 Sep 2012 11:13:02 -0500 Received: from [128.162.232.196] (eagdhcp-232-196.americas.sgi.com [128.162.232.196]) by relay2.corp.sgi.com (Postfix) with ESMTP id 42E3F304084; Tue, 4 Sep 2012 09:14:00 -0700 (PDT) Message-ID: <504628C6.8020106@sgi.com> Date: Tue, 04 Sep 2012 11:13:58 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 04/13] xfs: don't run the sync work if the filesyste is read-only References: <1346328017-2795-1-git-send-email-david@fromorbit.com> <1346328017-2795-5-git-send-email-david@fromorbit.com> In-Reply-To: <1346328017-2795-5-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 08/30/12 07:00, Dave Chinner wrote: > From: Dave Chinner > > If the filesytem is mounted or remounted read-only, stop the sync > worker that tries to flush or cover the log if the filesystem is > dirty. It's read-only, so it isn't dirty. Restart it on a remount,rw > as necessary. This avoids the need for RO checks in the work. > > Similarly, stop the sync work when the filesystem is frozen, and > start it again when the filesysetm is thawed. This avoids the need > for special freeze checks in the work. > > Signed-off-by: Dave Chinner Looks good. Reviewed-by: Mark Tinguely From tinguely@sgi.com Tue Sep 4 11:13:55 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q84GDtrO121668 for ; Tue, 4 Sep 2012 11:13:55 -0500 Received: from [128.162.232.196] (eagdhcp-232-196.americas.sgi.com [128.162.232.196]) by relay2.corp.sgi.com (Postfix) with ESMTP id A2F10304081; Tue, 4 Sep 2012 09:14:53 -0700 (PDT) Message-ID: <504628FB.5080304@sgi.com> Date: Tue, 04 Sep 2012 11:14:51 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 05/13] xfs: sync work is now only periodic log work References: <1346328017-2795-1-git-send-email-david@fromorbit.com> <1346328017-2795-6-git-send-email-david@fromorbit.com> In-Reply-To: <1346328017-2795-6-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 08/30/12 07:00, Dave Chinner wrote: > + * Every sync period we need to unpin all items in the AIL and push them to > + * disk. If there is nothing dirty, then we might need to cover the log to > + * indicate that the filesystem is idle. > + */ > +void > +xfs_log_worker( > + struct work_struct *work) > +{ > + struct xlog *log = container_of(to_delayed_work(work), > + struct xlog, l_work); > + struct xfs_mount *mp = log->l_mp; > + > + /* dgc: errors ignored - not fatal and nowhere to report them */ > + if (xfs_log_need_covered(mp)) > + xfs_fs_log_dummy(mp); > + else > + xfs_log_force(mp, 0); > + > + /* start pushing all the metadata that is currently dirty */ > + xfs_ail_push_all(mp->m_ail); > + > + /* queue us up again */ > + xfs_log_work_queue(mp); > +} Having log space for the xfs_fs_log_dummy() is the weak point in the remaining log hang problems. I agree with Dave and the above should remain in this series and log issue handled in another series. Reviewed-by: Mark Tinguely From tinguely@sgi.com Tue Sep 4 13:56:45 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q84Iuj8t143963 for ; Tue, 4 Sep 2012 13:56:45 -0500 Received: from [128.162.232.196] (eagdhcp-232-196.americas.sgi.com [128.162.232.196]) by relay2.corp.sgi.com (Postfix) with ESMTP id 55113304062; Tue, 4 Sep 2012 11:57:40 -0700 (PDT) Message-ID: <50464F22.2030308@sgi.com> Date: Tue, 04 Sep 2012 13:57:38 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 05/13] xfs: sync work is now only periodic log work References: <1346328017-2795-1-git-send-email-david@fromorbit.com> <1346328017-2795-6-git-send-email-david@fromorbit.com> In-Reply-To: <1346328017-2795-6-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 08/30/12 07:00, Dave Chinner wrote: > From: Dave Chinner > > The only thing the periodic sync work does now is flush the AIL and > idle the log. These are really functions of the log code, so move > the work to xfs_log.c and rename it appropriately. > > The only wart that this leaves behind is the xfssyncd_centisecs > sysctl, otherwise the xfssyncd is dead. Clean up any comments that > related to xfssyncd to reflect it's passing. > > Signed-off-by: Dave Chinner > --- ... > > diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c > index 7f4f937..598f279 100644 > --- a/fs/xfs/xfs_log.c > +++ b/fs/xfs/xfs_log.c > @@ -34,6 +34,7 @@ > #include "xfs_dinode.h" > #include "xfs_inode.h" > #include "xfs_trace.h" > +#include "xfs_fsops.h" > > kmem_zone_t *xfs_log_ticket_zone; > > @@ -698,6 +699,8 @@ xfs_log_mount_finish(xfs_mount_t *mp) > ASSERT(mp->m_flags& XFS_MOUNT_RDONLY); > } > Looking at this closer, shouldn't there be a check for recovery failure. If it did, the mount will stop: if (!error) > + xfs_log_work_queue(mp); > + > return error; > } --Mark. From tinguely@sgi.com Tue Sep 4 14:10:36 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q84JAa20146418 for ; Tue, 4 Sep 2012 14:10:36 -0500 Received: from [128.162.232.196] (eagdhcp-232-196.americas.sgi.com [128.162.232.196]) by relay2.corp.sgi.com (Postfix) with ESMTP id EF431304071; Tue, 4 Sep 2012 12:11:31 -0700 (PDT) Message-ID: <50465261.8010207@sgi.com> Date: Tue, 04 Sep 2012 14:11:29 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 06/13] xfs: Bring some sanity to log unmounting References: <1346328017-2795-1-git-send-email-david@fromorbit.com> <1346328017-2795-7-git-send-email-david@fromorbit.com> In-Reply-To: <1346328017-2795-7-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 08/30/12 07:00, Dave Chinner wrote: > From: Dave Chinner > > When unmounting the filesystem, there are lots of operations that > need to be done in a specific order, and they are spread across > across a couple of functions. We have to drain the AIL before we > write the unmount record, and we have to shut down the background > log work before we do either of them. > > But this is all split haphazardly across xfs_unmountfs() and > xfs_log_unmount(). Move all the AIL flushing and log manipulations > to xfs_log_unmount() so that the responisbilities of each function > is clear and the operations they perform obvious. > > Signed-off-by: Dave Chinner > --- Looks good. Reviewed-by: Mark Tinguely From tinguely@sgi.com Tue Sep 4 15:48:05 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q84Km55J158796 for ; Tue, 4 Sep 2012 15:48:05 -0500 Received: from [128.162.232.196] (eagdhcp-232-196.americas.sgi.com [128.162.232.196]) by relay1.corp.sgi.com (Postfix) with ESMTP id D8B488F8064; Tue, 4 Sep 2012 13:49:00 -0700 (PDT) Message-ID: <5046693A.9010102@sgi.com> Date: Tue, 04 Sep 2012 15:48:58 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 07/13] xfs: xfs_sync_data is redundant. References: <1346328017-2795-1-git-send-email-david@fromorbit.com> <1346328017-2795-8-git-send-email-david@fromorbit.com> In-Reply-To: <1346328017-2795-8-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 08/30/12 07:00, Dave Chinner wrote: > From: Dave Chinner > > We don't do any data writeback from XFS any more - the VFS is > completely responsible for that, including for freeze. We can > replace the remaining caller with the VFS level function that > achieves the same thing, but without conflicting with current > writeback work - writeback_inodes_sb_if_idle(). > > This means we can remove the flush_work and xfs_flush_inodes() - the > VFS functionality completely replaces the internal flush queue for > doing this writeback work in a separate context to avoid stack > overruns.. > > Signed-off-by: Dave Chinner > --- I get a XFS hang on xfstest 205 - couple different machines: # cat /proc/413/stack [] sleep_on_page+0x9/0x10 [] __lock_page+0x64/0x70 [] write_cache_pages+0x368/0x510 [] generic_writepages+0x4c/0x70 [] xfs_vm_writepages+0x54/0x70 [xfs] [] do_writepages+0x1b/0x40 [] __writeback_single_inode+0x45/0x160 [] writeback_sb_inodes+0x2a7/0x490 [] wb_writeback+0x119/0x2b0 [] wb_do_writeback+0xd4/0x230 [] bdi_writeback_thread+0xdb/0x230 [] kthread+0x9e/0xb0 [] kernel_thread_helper+0x4/0x10 [] 0xffffffffffffffff # cat /proc/12489/stack (dd command) [] writeback_inodes_sb_nr+0x85/0xb0 [] writeback_inodes_sb+0x5c/0x80 [] writeback_inodes_sb_if_idle+0x42/0x60 [] xfs_iomap_write_delay+0x28e/0x320 [xfs] [] __xfs_get_blocks+0x2b8/0x500 [xfs] [] xfs_get_blocks+0xc/0x10 [xfs] [] __block_write_begin+0x2af/0x5c0 [] xfs_vm_write_begin+0x61/0xd0 [xfs] [] generic_perform_write+0xc2/0x1e0 [] generic_file_buffered_write+0x60/0xa0 [] xfs_file_buffered_aio_write+0x11d/0x1b0 [xfs] [] xfs_file_aio_write+0x110/0x170 [xfs] [] do_sync_write+0xa1/0xf0 [] vfs_write+0xcb/0x130 [] sys_write+0x50/0x90 [] system_call_fastpath+0x16/0x1b [] 0xffffffffffffffff From tinguely@sgi.com Tue Sep 4 15:58:39 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q84Kwdhd160921 for ; Tue, 4 Sep 2012 15:58:39 -0500 Received: from [128.162.232.196] (eagdhcp-232-196.americas.sgi.com [128.162.232.196]) by relay1.corp.sgi.com (Postfix) with ESMTP id 64FAB8F8050; Tue, 4 Sep 2012 13:59:38 -0700 (PDT) Message-ID: <50466BB8.8050101@sgi.com> Date: Tue, 04 Sep 2012 15:59:36 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 08/13] xfs: xfs_sync_fsdata is redundant References: <1346328017-2795-1-git-send-email-david@fromorbit.com> <1346328017-2795-9-git-send-email-david@fromorbit.com> In-Reply-To: <1346328017-2795-9-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 08/30/12 07:00, Dave Chinner wrote: > From: Dave Chinner > > Why do we need to write the superblock to disk once we've written > all the data? We don't actually - the reasons for doing this are > lost in the mists of time, and go back to the way Irix used to drive > VFS flushing. > > On linux, this code is only called from two contexts: remount and > .sync_fs. In the remount case, the call is followed by a metadata > sync, which unpins and writes the superblock. In the sync_fs case, > we only need to force the log to disk to ensure that the superblock > is correctly on disk, so we don't actually need to write it. Hence > the functionality is either redundant or superfluous and thus can be > removed. > > Seeing as xfs_quiesce_data is essentially now just a log force, > remove it as well and fold the code back into the two callers. > Neither of them need the log covering check, either, as that is > redundant for the remount case, and unnecessary for the .sync_fs > case. > > Signed-off-by: Dave Chinner > --- Looks good. Reviewed-by: Mark Tinguely From tinguely@sgi.com Tue Sep 4 16:03:05 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q84L35jq161542 for ; Tue, 4 Sep 2012 16:03:05 -0500 Received: from [128.162.232.196] (eagdhcp-232-196.americas.sgi.com [128.162.232.196]) by relay2.corp.sgi.com (Postfix) with ESMTP id 046E4304048; Tue, 4 Sep 2012 14:04:01 -0700 (PDT) Message-ID: <50466CBE.9080207@sgi.com> Date: Tue, 04 Sep 2012 16:03:58 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 09/13] xfs: move xfs_quiesce_attr() into xfs_super.c References: <1346328017-2795-1-git-send-email-david@fromorbit.com> <1346328017-2795-10-git-send-email-david@fromorbit.com> In-Reply-To: <1346328017-2795-10-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 08/30/12 07:00, Dave Chinner wrote: > From: Dave Chinner > > Both callers of xfs_quiesce_attr() are in xfs_super.c, and there's > nothing really sync-specific about this functionality so it doesn't > really matter where it lives. Move it to benext to it's callers, so > all the remount/sync_fs code is in the one place. > > Signed-off-by: Dave Chinner > --- Looks good. Reviewed-by: Mark Tinguely From tinguely@sgi.com Tue Sep 4 16:03:38 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q84L3b5r161578 for ; Tue, 4 Sep 2012 16:03:38 -0500 Received: from [128.162.232.196] (eagdhcp-232-196.americas.sgi.com [128.162.232.196]) by relay2.corp.sgi.com (Postfix) with ESMTP id 787A0304048; Tue, 4 Sep 2012 14:04:36 -0700 (PDT) Message-ID: <50466CE2.5060705@sgi.com> Date: Tue, 04 Sep 2012 16:04:34 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 10/13] xfs: xfs_quiesce_attr() should quiesce the log like unmount References: <1346328017-2795-1-git-send-email-david@fromorbit.com> <1346328017-2795-11-git-send-email-david@fromorbit.com> In-Reply-To: <1346328017-2795-11-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 08/30/12 07:00, Dave Chinner wrote: > From: Dave Chinner > > xfs_quiesce_attr() is supposed to leave the log empty with an > unmount record written. Right now it does not wait for the AIL to be > emptied before writing the unmount record, not does it wait for > metadata IO completion, either. Fix it to use the same method and > code as xfs_log_unmount(). > > Signed-off-by: Dave Chinner > --- Looks good. Reviewed-by: Mark Tinguely From tinguely@sgi.com Tue Sep 4 16:05:23 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q84L5NYP161877 for ; Tue, 4 Sep 2012 16:05:23 -0500 Received: from [128.162.232.196] (eagdhcp-232-196.americas.sgi.com [128.162.232.196]) by relay2.corp.sgi.com (Postfix) with ESMTP id 375EE304059; Tue, 4 Sep 2012 14:06:22 -0700 (PDT) Message-ID: <50466D4C.3040506@sgi.com> Date: Tue, 04 Sep 2012 16:06:20 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 11/13] xfs: rename xfs_sync.[ch] to xfs_icache.[ch] References: <1346328017-2795-1-git-send-email-david@fromorbit.com> <1346328017-2795-12-git-send-email-david@fromorbit.com> In-Reply-To: <1346328017-2795-12-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 08/30/12 07:00, Dave Chinner wrote: > From: Dave Chinner > > xfs_sync.c now only contains inode reclaim functions and inode cache > iteration functions. It is not related to sync operations anymore. > Rename to xfs_icache.c to reflect it's contents and prepare for > consolidation with the other inode cache file that exists > (xfs_iget.c). > > Signed-off-by: Dave Chinner > --- Looks good. Reviewed-by: Mark Tinguely From tinguely@sgi.com Tue Sep 4 16:06:56 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q84L6uZa162201 for ; Tue, 4 Sep 2012 16:06:56 -0500 Received: from [128.162.232.196] (eagdhcp-232-196.americas.sgi.com [128.162.232.196]) by relay2.corp.sgi.com (Postfix) with ESMTP id D3092304059; Tue, 4 Sep 2012 14:07:54 -0700 (PDT) Message-ID: <50466DA8.2020802@sgi.com> Date: Tue, 04 Sep 2012 16:07:52 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 12/13] xfs: move inode locking functions to xfs_inode.c References: <1346328017-2795-1-git-send-email-david@fromorbit.com> <1346328017-2795-13-git-send-email-david@fromorbit.com> In-Reply-To: <1346328017-2795-13-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 08/30/12 07:00, Dave Chinner wrote: > From: Dave Chinner > > xfs_ilock() and friends really aren't related to the inode cache in > any way, so move them to xfs_inode.c with all the other inode > related functionality. > > While doing this move, move the xfs_ilock() tracepoints to *before* > the lock is taken so that when a hang on a lock occurs we have > events to indicate which process and what inode we were trying to > lock when the hang occurred. This is much better than the current > silence we get on a hang... > > Signed-off-by: Dave Chinner > --- Looks good. Reviewed-by: Mark Tinguely From tinguely@sgi.com Tue Sep 4 16:10:04 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q84LA4TJ162687 for ; Tue, 4 Sep 2012 16:10:04 -0500 Received: from [128.162.232.196] (eagdhcp-232-196.americas.sgi.com [128.162.232.196]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2CBD3304067; Tue, 4 Sep 2012 14:11:03 -0700 (PDT) Message-ID: <50466E65.3040500@sgi.com> Date: Tue, 04 Sep 2012 16:11:01 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 13/13] xfs: remove xfs_iget.c References: <1346328017-2795-1-git-send-email-david@fromorbit.com> <1346328017-2795-14-git-send-email-david@fromorbit.com> In-Reply-To: <1346328017-2795-14-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 08/30/12 07:00, Dave Chinner wrote: > From: Dave Chinner > > The inode cache functions remaining in xfs_iget.c can be moved to xfs_icache.c > along with the other inode cache functions. This removes all functionality from > xfs_iget.c, so the file can simply be removed. > > This move results in various functions now only having the scope of a single > file (e.g. xfs_inode_free()), so clean up all the definitions and exported > prototypes in xfs_icache.[ch] and xfs_inode.h appropriately. > > Signed-off-by: Dave Chinner > --- Looks good. Reviewed-by: Mark Tinguely From bpm@sgi.com Tue Sep 4 16:13:02 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q84LD29o163353 for ; Tue, 4 Sep 2012 16:13:02 -0500 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay3.corp.sgi.com (Postfix) with ESMTP id 842BBAC002; Tue, 4 Sep 2012 14:13:57 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 2E2CE4266DC; Tue, 4 Sep 2012 16:13:57 -0500 (CDT) Date: Tue, 4 Sep 2012 16:13:57 -0500 From: Ben Myers To: Dave Chinner Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [RFC, PATCH 0/102]: xfs: 3.0.x stable kernel update Message-ID: <20120904211357.GK3274@sgi.com> References: <1345698180-13612-1-git-send-email-david@fromorbit.com> <20120901231019.GC6896@infradead.org> <20120903060406.GA15292@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20120903060406.GA15292@dastard> User-Agent: Mutt/1.5.20 (2009-06-14) On Mon, Sep 03, 2012 at 04:04:06PM +1000, Dave Chinner wrote: > On Sat, Sep 01, 2012 at 07:10:19PM -0400, Christoph Hellwig wrote: > > I've done a brief look over the patches this week and while I can't spot > > anything wrong I'm defintively a bit concerned about the amount of churn > > for a long term stable series. A lot of this does not seem to fit the > > strict -stable criteria, and given that I've not really seen any major > > issues with the current 3.0-stable codebase I'm wondering what the > > guranteed gain vs the status quo is. > > You didn't troll the RH bugzilla ;) Hehe. ;) > The XFS code base in RHEL6 is sitting at 3.0, and several of the > problems that have workarounds in 3.0.x don't fix the problems > reported (e.g. the log space hangs), while the fixes in the more > recent mainline kernel do. > > I simply figured that I've got to do this much work to fix all the > bugs reported in RHEL6 and given the code bases are almost identical > I'd do a community service and push it to 3.0.x first. I'm quite > happy not to push it to 3.0.x if the consensus is that it is too > much churn. FWIW I think it's great that you've done the community this service. I'm just now (finally) getting this patchset onto a machine for some testing. Ok.. now that I've refreshed my memory of Documentation/stable_kernel_rules.txt, I can see Christoph's point. Some of these patches are hard to justify based upon those rules. For example: Patch 2, 'remove dead ENODEV handling in xfs_destroy_ioend' seems to just remove some dead code. However, if it were clear that it fixes some kind of problem by removing the dead code it could easily be justified. Patch 94, 'm_maxioffset is redundant' seems like a cleanup. But maybe it is required so that a subsequent patch will apply properly? Patch 95, 'make largest supported offset less shouty' just cleans up a macro. Again... maybe there is a good reason to pull that in besides the shouting. So there are three examples that would probably require some kind of justification to apply within the rules as stated. Maybe -stable just needs a link to the bug each one of them resolves. It looks like there are plenty in the patchset that are very clearly appropriate within the rules, no additional justification required. We certainly don't want to lose that. We can go through the set and reply to those which seem questionable... -Ben From email@administrator.com Tue Sep 4 18:29:07 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.0 required=5.0 tests=BAYES_99 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q84NT7IU178804 for ; Tue, 4 Sep 2012 18:29:07 -0500 X-ASG-Debug-ID: 1346801361-04cb6c23601083e0001-NocioJ Received: from winrelay1.ntwebc40.megawebservers.com (winmx1c40.carrierzone.com [64.29.144.214]) by cuda.sgi.com with ESMTP id tDQ35xmmrXl3UFmV for ; Tue, 04 Sep 2012 16:29:38 -0700 (PDT) X-Barracuda-Envelope-From: email@administrator.com X-Barracuda-Apparent-Source-IP: 64.29.144.214 Received: from c40-asp1.ntwebc40.megawebservers.com ([10.0.40.60]) by winrelay1.ntwebc40.megawebservers.com with Microsoft SMTPSVC(6.0.3790.4675); Tue, 4 Sep 2012 19:10:40 -0400 Received: from mail pickup service by c40-asp1.ntwebc40.megawebservers.com with Microsoft SMTPSVC; Tue, 4 Sep 2012 18:16:49 -0400 From: To: Subject: Validate your email Date: Tue, 4 Sep 2012 18:16:48 -0400 X-ASG-Orig-Subj: Validate your email X-Priority: 3 X-MSMail-Priority: Normal X-Real-Email-Sender-Header: \\10.0.40.33\ingbeon.com\public\img\stands.asp X-Real-Email-Senders-Header: ingbeon.com X-MimeOLE: Produced By Microsoft MimeOLE V6.0.6002.18463 Importance: Normal Message-ID: X-OriginalArrivalTime: 04 Sep 2012 22:16:49.0439 (UTC) FILETIME=[FA90DAF0:01CD8AEA] X-Barracuda-Connect: winmx1c40.carrierzone.com[64.29.144.214] X-Barracuda-Start-Time: 1346801361 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107624 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header Dear Account User, Your mailbox has exceeded the limit of 30 GB, which is as set by your manager, you are currently at 30.9GB, very soon you will not be able to create new e-mail or to send/receive again until you validate your mailbox.To re-validate your mailbox, click on the link below and follow the instruction for your upgrade. http://amicocorp.net/newupgrade/administrator_restore.htm Sincerely, Email Administrator. From david@fromorbit.com Tue Sep 4 23:23:34 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q854NYJs230878 for ; Tue, 4 Sep 2012 23:23:34 -0500 X-ASG-Debug-ID: 1346819071-04cbb0271b110c30001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id NazK5vfRbsvHCXq1 for ; Tue, 04 Sep 2012 21:24:31 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AjMLAMvSRlB5LbN8/2dsb2JhbABFhRy1AAKBBIEIgiABAQQBOhwWCgMFCwgDDgouFCUDIRMUh3MFuzQUin2BboQ0YAOVWJAbgnU Received: from ppp121-45-179-124.lns20.syd7.internode.on.net (HELO dastard) ([121.45.179.124]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2012 13:54:30 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1T97AD-0007F9-Rt; Wed, 05 Sep 2012 14:24:29 +1000 Date: Wed, 5 Sep 2012 14:24:29 +1000 From: Dave Chinner To: Ben Myers Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [RFC, PATCH 0/102]: xfs: 3.0.x stable kernel update Message-ID: <20120905042429.GD15292@dastard> X-ASG-Orig-Subj: Re: [RFC, PATCH 0/102]: xfs: 3.0.x stable kernel update References: <1345698180-13612-1-git-send-email-david@fromorbit.com> <20120901231019.GC6896@infradead.org> <20120903060406.GA15292@dastard> <20120904211357.GK3274@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20120904211357.GK3274@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1346819071 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=COMMA_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107645 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 COMMA_SUBJECT Subject is like 'Re: FDSDS, this is a subject' On Tue, Sep 04, 2012 at 04:13:57PM -0500, Ben Myers wrote: > On Mon, Sep 03, 2012 at 04:04:06PM +1000, Dave Chinner wrote: > > On Sat, Sep 01, 2012 at 07:10:19PM -0400, Christoph Hellwig wrote: > > > I've done a brief look over the patches this week and while I can't spot > > > anything wrong I'm defintively a bit concerned about the amount of churn > > > for a long term stable series. A lot of this does not seem to fit the > > > strict -stable criteria, and given that I've not really seen any major > > > issues with the current 3.0-stable codebase I'm wondering what the > > > guranteed gain vs the status quo is. > > > > You didn't troll the RH bugzilla ;) > > Hehe. ;) > > > The XFS code base in RHEL6 is sitting at 3.0, and several of the > > problems that have workarounds in 3.0.x don't fix the problems > > reported (e.g. the log space hangs), while the fixes in the more > > recent mainline kernel do. > > > > I simply figured that I've got to do this much work to fix all the > > bugs reported in RHEL6 and given the code bases are almost identical > > I'd do a community service and push it to 3.0.x first. I'm quite > > happy not to push it to 3.0.x if the consensus is that it is too > > much churn. > > FWIW I think it's great that you've done the community this service. > I'm just now (finally) getting this patchset onto a machine for some > testing. > > Ok.. now that I've refreshed my memory of > Documentation/stable_kernel_rules.txt, I can see Christoph's point. > Some of these patches are hard to justify based upon those rules. For > example: > > Patch 2, 'remove dead ENODEV handling in xfs_destroy_ioend' seems to > just remove some dead code. However, if it were clear that it fixes > some kind of problem by removing the dead code it could easily be > justified. The are several patches in the series touch xfs_destroy_ioend(). Having to resolve all the conflicts by hand instead of including the patch that removes the 5 lines of dead code means I didn't have to modify the patches when applying them, and the result is verifiably identical to the code in the current mainline tree... Indeed, the very next patch would not apply without patch 2.... > Patch 94, 'm_maxioffset is redundant' seems like a cleanup. But maybe > it is required so that a subsequent patch will apply properly? > > Patch 95, 'make largest supported offset less shouty' just cleans up a > macro. Again... maybe there is a good reason to pull that in besides > the shouting. Yeah, 94/95 can go. What probably happened there was that I was considering a later patch that was dependent on these changes and I ended up dropping that patch without realising I then didn't need the m_maxioffset changes. > So there are three examples that would probably require some kind of > justification to apply within the rules as stated. Maybe -stable just > needs a link to the bug each one of them resolves. > > It looks like there are plenty in the patchset that are very clearly > appropriate within the rules, no additional justification required. We > certainly don't want to lose that. We can go through the set and reply > to those which seem questionable... Sure, but remember that the dependent patches might be 50 patches later in the series as the patches are applied in upstream commit order.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Sep 4 23:29:05 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q854T5gp232123 for ; Tue, 4 Sep 2012 23:29:05 -0500 X-ASG-Debug-ID: 1346819402-04cb6c2361122690001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id gJMm2GKPnqhsZHgc for ; Tue, 04 Sep 2012 21:30:02 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AjILAP/TRlB5LbN8/2dsb2JhbABFhRy1AAKBBYEIgiABAQUnExwjEAgDGC4UJQMhE4gMuzQUin2BboQ0YAOVWIk0hmeCdYFGBA Received: from ppp121-45-179-124.lns20.syd7.internode.on.net (HELO dastard) ([121.45.179.124]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2012 14:00:01 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1T97FY-0007Fr-T6; Wed, 05 Sep 2012 14:30:00 +1000 Date: Wed, 5 Sep 2012 14:30:00 +1000 From: Dave Chinner To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: [PATCH 03/13] xfs: rationalise xfs_mount_wq users Message-ID: <20120905043000.GE15292@dastard> X-ASG-Orig-Subj: Re: [PATCH 03/13] xfs: rationalise xfs_mount_wq users References: <1346328017-2795-1-git-send-email-david@fromorbit.com> <1346328017-2795-4-git-send-email-david@fromorbit.com> <504622C1.20201@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <504622C1.20201@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1346819402 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107645 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Sep 04, 2012 at 10:48:17AM -0500, Mark Tinguely wrote: > On 08/30/12 07:00, Dave Chinner wrote: > >- /* > >- * We shouldn't write/force the log if we are in the mount/unmount > >- * process or on a read only filesystem. The workqueue still needs to be > >- * active in both cases, however, because it is used for inode reclaim > >- * during these times. Use the MS_ACTIVE flag to avoid doing anything > >- * during mount. Doing work during unmount is avoided by calling > >- * cancel_delayed_work_sync on this work queue before tearing down > >- * the ail and the log in xfs_log_unmount. > >- */ > >- if (!(mp->m_super->s_flags& MS_ACTIVE)&& > >- !(mp->m_flags& XFS_MOUNT_RDONLY)) { > >+ if (!(mp->m_flags& XFS_MOUNT_RDONLY)) { > > /* dgc: errors ignored here */ > > if (mp->m_super->s_writers.frozen == SB_UNFROZEN&& > > xfs_log_need_covered(mp)) > >@@ -408,8 +398,7 @@ xfs_sync_worker( > > else > > xfs_log_force(mp, 0); > > > >- /* start pushing all the metadata that is currently > >- * dirty */ > >+ /* start pushing all the metadata that is currently dirty */ > > xfs_ail_push_all(mp->m_ail); > > } > > > > It appears that the removal of the MS_ACTIVE flag is causing the > "atomic_read(&bp->b_hold)> 0," ASSERT. I must be being slow today - I don't see why that would cause any problems. The worker is not started at the end of the mount process after everything is set up (i.e. just before MS_ACTIVE is removed), and the worker is stopped before anything is torn down. That should effectively replicate what the MS_ACTIVE flag is providing in the old code. Can you explain in more detail what lead you to this conclusion? Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Sep 4 23:34:20 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q854YKLO232829 for ; Tue, 4 Sep 2012 23:34:20 -0500 X-ASG-Debug-ID: 1346819717-04cb6c2361122bb0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 2ONEihmrw5JHvvTx for ; Tue, 04 Sep 2012 21:35:17 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AjILAG3VRlB5LbN8/2dsb2JhbABFhRy1AAKBBYEIgiABAQUnExwjEAgDFQMuFCUDIROIDLsrFIp9gW6ENGADlViQG4J1 Received: from ppp121-45-179-124.lns20.syd7.internode.on.net (HELO dastard) ([121.45.179.124]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2012 14:05:16 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1T97Ke-0007GQ-5G; Wed, 05 Sep 2012 14:35:16 +1000 Date: Wed, 5 Sep 2012 14:35:16 +1000 From: Dave Chinner To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: [PATCH 05/13] xfs: sync work is now only periodic log work Message-ID: <20120905043516.GF15292@dastard> X-ASG-Orig-Subj: Re: [PATCH 05/13] xfs: sync work is now only periodic log work References: <1346328017-2795-1-git-send-email-david@fromorbit.com> <1346328017-2795-6-git-send-email-david@fromorbit.com> <50464F22.2030308@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50464F22.2030308@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1346819717 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107645 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Sep 04, 2012 at 01:57:38PM -0500, Mark Tinguely wrote: > On 08/30/12 07:00, Dave Chinner wrote: > >From: Dave Chinner > > > >The only thing the periodic sync work does now is flush the AIL and > >idle the log. These are really functions of the log code, so move > >the work to xfs_log.c and rename it appropriately. > > > >The only wart that this leaves behind is the xfssyncd_centisecs > >sysctl, otherwise the xfssyncd is dead. Clean up any comments that > >related to xfssyncd to reflect it's passing. > > > >Signed-off-by: Dave Chinner > >--- > > ... > > > > >diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c > >index 7f4f937..598f279 100644 > >--- a/fs/xfs/xfs_log.c > >+++ b/fs/xfs/xfs_log.c > >@@ -34,6 +34,7 @@ > > #include "xfs_dinode.h" > > #include "xfs_inode.h" > > #include "xfs_trace.h" > >+#include "xfs_fsops.h" > > > > kmem_zone_t *xfs_log_ticket_zone; > > > >@@ -698,6 +699,8 @@ xfs_log_mount_finish(xfs_mount_t *mp) > > ASSERT(mp->m_flags& XFS_MOUNT_RDONLY); > > } > > > > Looking at this closer, shouldn't there be a check for recovery > failure. If it did, the mount will stop: > > if (!error) > > >+ xfs_log_work_queue(mp); > >+ > > return error; Probably should, but the error handling for a xfs_log_mount_finish() failure calls xfs_log_unmount() and that shuts down the worker correctly even if this failure occurs. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Sep 5 01:41:08 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q856f8uk256318 for ; Wed, 5 Sep 2012 01:41:08 -0500 X-ASG-Debug-ID: 1346827324-04cb6c236012a500001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 282AOIydbbNdG6H7 for ; Tue, 04 Sep 2012 23:42:05 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AjILAJnzRlB5LbN8/2dsb2JhbABFhRy1AAKBBYEIgiABAQU6HCMQCAMOCi4UJQMhE4gMuxoUin2BboUUA5VYkBuCdQ Received: from ppp121-45-179-124.lns20.syd7.internode.on.net (HELO dastard) ([121.45.179.124]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2012 16:12:04 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1T99JK-0007Uf-9U; Wed, 05 Sep 2012 16:42:02 +1000 Date: Wed, 5 Sep 2012 16:42:02 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [RFC PATCH 2/4] xfs: create function to scan and clear EOFBLOCKS inodes Message-ID: <20120905064202.GG15292@dastard> X-ASG-Orig-Subj: Re: [RFC PATCH 2/4] xfs: create function to scan and clear EOFBLOCKS inodes References: <1346097111-4476-1-git-send-email-bfoster@redhat.com> <1346097111-4476-3-git-send-email-bfoster@redhat.com> <20120903050612.GR15292@dastard> <50460BB8.1060701@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50460BB8.1060701@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1346827324 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107653 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Sep 04, 2012 at 10:10:00AM -0400, Brian Foster wrote: > On 09/03/2012 01:06 AM, Dave Chinner wrote: > > On Mon, Aug 27, 2012 at 03:51:49PM -0400, Brian Foster wrote: > ... > >> +/* > >> + * Handle an EOFBLOCKS tagged inode. If this is a forced scan, we wait on the > >> + * iolock ourselves rather than rely on the trylock in xfs_free_eofblocks(). > >> + * > >> + * We rely on the output parameter from xfs_free_eofblocks() to determine > >> + * whether we should clear the tag because in the trylock case, it could have > >> + * skipped the inode due to lock contention. > >> + */ > >> +STATIC int > >> +xfs_inode_free_eofblocks( > >> + struct xfs_inode *ip, > >> + int flags) > >> +{ > >> + int ret = 0; > >> + bool freed = false; > >> + bool wait_iolock = (flags & EOFBLOCKS_WAIT) ? true : false; > >> + > >> + if (wait_iolock) > >> + xfs_ilock(ip, XFS_IOLOCK_EXCL); > > > > Why do we need the IO lock here? xfs_free_eofblocks() does all the > > necessary locking.... > > > > This was for the wait case (e.g., xfs_free_eofblocks() does a trylock > on the IO lock and we want to wait for the lock in this case). Does it really matter if we can't get the iolock and skip the inode? Note that xfs_inode_ag_walk() will keep a skipped count if you return EAGAIN, and re-run the walk on the AG if any inodes are skipped. This is done to prevent blocking on locks slowing down the scan - instead of blocking we move on to the next inode, and revist the blocked inodes again in a later pass. IOWs, if you convert the code to use the generic walk and make xfs_free_eofblocks() return EAGAIN when it can't get the io lock, you get the retry for free... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Sep 5 01:48:49 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q856mnnF258180 for ; Wed, 5 Sep 2012 01:48:49 -0500 X-ASG-Debug-ID: 1346827786-04cb6c236212aeb0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id K5UVu4YQDtCTaHvZ for ; Tue, 04 Sep 2012 23:49:46 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AjILABX1RlB5LbN8/2dsb2JhbABFhRy1AAKBBYEIgiABAQU6HCMQCAMOCi4UJQMhE4gMuxsUin0cBIFOhRQDlViJNIZngnWBRw Received: from ppp121-45-179-124.lns20.syd7.internode.on.net (HELO dastard) ([121.45.179.124]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2012 16:19:45 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1T99Qm-0007Vg-Uf; Wed, 05 Sep 2012 16:49:44 +1000 Date: Wed, 5 Sep 2012 16:49:44 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [RFC PATCH 3/4] xfs: add FREE_EOFBLOCKS ioctl Message-ID: <20120905064944.GH15292@dastard> X-ASG-Orig-Subj: Re: [RFC PATCH 3/4] xfs: add FREE_EOFBLOCKS ioctl References: <1346097111-4476-1-git-send-email-bfoster@redhat.com> <1346097111-4476-4-git-send-email-bfoster@redhat.com> <20120903051742.GS15292@dastard> <50460BDB.40806@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50460BDB.40806@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1346827786 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107655 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Sep 04, 2012 at 10:10:35AM -0400, Brian Foster wrote: > On 09/03/2012 01:17 AM, Dave Chinner wrote: > > On Mon, Aug 27, 2012 at 03:51:50PM -0400, Brian Foster wrote: > >> The XFS_IOC_FREE_EOFBLOCKS ioctl allows users to invoke an EOFBLOCKS > >> scan. The xfs_eofblocks structure is defined to support the command > >> parameters (quota type/id and minimum file size). > >> > >> Signed-off-by: Brian Foster > >> --- > >> fs/xfs/xfs_fs.h | 10 ++++++++++ > >> fs/xfs/xfs_ioctl.c | 25 +++++++++++++++++++++++++ > >> fs/xfs/xfs_quota.h | 1 + > >> fs/xfs/xfs_quotaops.c | 2 +- > >> 4 files changed, 37 insertions(+), 1 deletions(-) > >> > >> diff --git a/fs/xfs/xfs_fs.h b/fs/xfs/xfs_fs.h > >> index c13fed8..6f93db9 100644 > >> --- a/fs/xfs/xfs_fs.h > >> +++ b/fs/xfs/xfs_fs.h > >> @@ -339,6 +339,15 @@ typedef struct xfs_error_injection { > >> > >> > >> /* > >> + * Speculative preallocation trimming. > >> + */ > >> +typedef struct xfs_eofblocks { > >> + __u32 id; /* quota id */ > >> + __u32 qtype; /* quota type */ > >> + __u64 min_file_size; /* minimum file size */ > >> +} xfs_eofblocks_t; > > > > No typedefs. > > > > This is something I see throughout the code that I haven't quite > followed (i.e., using the _t typedefs vs. not). Is the general consensus > to move away from typedefs when possible? Yes. The Irix code that XFS came from was full of typedefs - part of it was to try to strictly type check things that were the same storage size or on-disk vs in-memory. We've got other ways of doing that better (e.g. the endian checking sparse does), and typedefs are generally frowned upon in the main kernel code because they often obfuscate the code rather than improve it, so we're removing them as we modify code or write new code. > >> + > >> + /* > >> + * TODO: The filtering code currently uses the id in the inode. > >> + * Therefore, I don't think it really matters whether the > >> + * particular quota type is enabled (and the dquot is attached). > >> + * > >> + * Alternatively, we could filter by dquot type. This would > >> + * mean we might have to make sure dquot's are attached during > >> + * the scan and that the particular quota type is enabled. I'm > >> + * not sure that this buys us anything. > >> + */ > > > > If quota is not enabled, then a request to free blocks determined by > > a quota ID is invalid and should be rejected. It's a user API - what > > is and isn't supported needs to be written down in black and white > > (i.e. in the xfsctl man page). > > > > Ok. I was thinking that we could support the ability to scan by uid/gid > regardless of whether quota is enabled, but perhaps there's no purpose > to that if a quota isn't enabled. I can't really think of a use case for doing this. Making the API more expansive in future if someone needs this can be done - it's removing stuff that is really hard to do. Hence, don't add it if it is not going to be used immediately. :) Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Sep 5 01:59:15 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q856xFrZ259846 for ; Wed, 5 Sep 2012 01:59:15 -0500 X-ASG-Debug-ID: 1346828412-04cbb02719119be0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id rCWWjbQwMd1tGeaD for ; Wed, 05 Sep 2012 00:00:13 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AjILAK/2RlB5LbN8/2dsb2JhbABFhRy1AAKBBYEIgiABAQU6HCMQCAMOCi4UJQMhE4gMuxsUin2BboUUA5VYkBuCdQ Received: from ppp121-45-179-124.lns20.syd7.internode.on.net (HELO dastard) ([121.45.179.124]) by ipmail05.adl6.internode.on.net with ESMTP; 05 Sep 2012 16:30:12 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1T99at-0007X4-SK; Wed, 05 Sep 2012 17:00:11 +1000 Date: Wed, 5 Sep 2012 17:00:11 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [RFC PATCH 4/4] xfs: add background scanning to clear EOFBLOCKS inodes Message-ID: <20120905070011.GI15292@dastard> X-ASG-Orig-Subj: Re: [RFC PATCH 4/4] xfs: add background scanning to clear EOFBLOCKS inodes References: <1346097111-4476-1-git-send-email-bfoster@redhat.com> <1346097111-4476-5-git-send-email-bfoster@redhat.com> <20120903052842.GT15292@dastard> <50460BF1.3070100@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50460BF1.3070100@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1346828412 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107655 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Sep 04, 2012 at 10:10:57AM -0400, Brian Foster wrote: > On 09/03/2012 01:28 AM, Dave Chinner wrote: > > On Mon, Aug 27, 2012 at 03:51:51PM -0400, Brian Foster wrote: > >> Create a delayed_work to enable background scanning and freeing > >> of EOFBLOCKS inodes. The scanner kicks in once speculative > >> preallocation occurs and stops requeueing itself when no EOFBLOCKS > >> inodes exist. > >> > >> Scans are queued on the existing syncd workqueue and the interval > >> is tied to the syncd interval, which is a default of 30s. The > >> minimum file size for a background scan is hardcoded to 100MB. > > > > I'd set it to be much longer than the xfs_syncd_centisecs period. > > The data may not be written back for a long while, and a file that > > is open, written and closed repeatedly (NFS write patterns for large > > and/or slowly written files) should not have it's preallocation > > truncated every 30s. > > > > I'd suggest that a 5 minute sweep is probably sufficiently frequent > > to avoid most fragmentation issues and long term buildup of speculative > > preallocation whilst not perturbing large/slow writers too much.... > > > > Any thoughts on having tunables for both values (time and min size?) on > the background scanning? Well, my suggestion for timing is as per above (xfs_syncd_centisecs * 100), but I don't really have any good rule of thumb for the minimum size. What threshold do people start to notice this? I'd SWAG that something like 32MB is a good size to start at because most IO subsystems will still be able to reach full bandwidth with extents of this size when reading files. Alternatively, if you can determine if the inode is still in use at the time of the scan (e.g. elevated reference count due to an open fd) and skip the truncation for those inodes, then a minimum size is not really needed, right? Cheers, Dave. -- Dave Chinner david@fromorbit.com From admin@npc-tonerchips.com Wed Sep 5 03:42:42 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.5 required=5.0 tests=BAYES_50,J_CHICKENPOX_102, J_CHICKENPOX_23,J_CHICKENPOX_25,J_CHICKENPOX_33,J_CHICKENPOX_47, J_CHICKENPOX_72,J_CHICKENPOX_73,TO_NO_BRKTS_PCNT autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q858geSA012878 for ; Wed, 5 Sep 2012 03:42:42 -0500 X-ASG-Debug-ID: 1346834612-04cb6c23601333d0001-NocioJ Received: from m14-110.vip.163.com (m14-110.vip.163.com [220.181.14.110]) by cuda.sgi.com with ESMTP id Rp6tTlwtE0GiLV9z for ; Wed, 05 Sep 2012 01:43:33 -0700 (PDT) X-Barracuda-Envelope-From: admin@npc-tonerchips.com X-Barracuda-Apparent-Source-IP: 220.181.14.110 Received: from CQ-201202232037 (unknown [115.152.66.51]) by smtp1 (Coremail) with SMTP id h+CowEB5RkKzEEdQXr0vAA--.2196S3; Wed, 05 Sep 2012 16:43:31 +0800 (CST) Subject: Re; new toner chips for Samsung with EXP,DOM,EUR,CHN version, Samsung MLT-101S,-ML-2165W/SF-760P/SCX-3405FW Content-Transfer-Encoding: Quoted-Printable X-ASG-Orig-Subj: Re; new toner chips for Samsung with EXP,DOM,EUR,CHN version, Samsung MLT-101S,-ML-2165W/SF-760P/SCX-3405FW Content-Type: text/plain; charset="UTF-8" Date: Wed, 5 Sep 2012 16:43:28 +0800 From: "NPC toner chips" To: xfs@oss.sgi.com Reply-To: "NPC toner chips" Disposition-Notification-To: "NPC toner chips" X-CM-TRANSID:h+CowEB5RkKzEEdQXr0vAA--.2196S3 X-Coremail-Antispam: 1Uf129KBjvJXoWxZFy3CF17ZF1DXr4rZw4Utwb_yoW5WF1UpF 42qw17Ars2vr15AFy8A3ZF9F15XryrKr45uryUX340yFWYgayIvry5Ka48XFWDWwnrJ3yY qanrX3s3Zas8uaDanT9S1TB71UUUUA7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDUYxBIdaVFxhVjvjDU0xZFpf9x071bO6JUUUUU= Message-Id: <504710B3.1BB25E.32546@m13-236.163.com> X-CM-SenderInfo: pdgpx046qsugpwrqv2xfkl12oofrz/ X-Barracuda-Connect: m14-110.vip.163.com[220.181.14.110] X-Barracuda-Start-Time: 1346834612 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107661 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Dear Manager , How are you? =20 =20 I have some new toner chips for Samsung with EXP,DOM,EUR,CHN version= for below: Samsung MLT-101S------ML-2165W/SF-760P/SCX-3405FW 1.5K Samsung MLT-103S-----ML-2950/2951/2955/2956/SCX-4728/47291.5K Samsung MLT-103L----ML-2950/2951/2955/2956/SCX-4728/47292.5K HP CF280A----HP Laserjet 400M/401DN 2.7K HP CF280X---HP Laserjet 400M/402DN 6.9K HP CE390A---HP Laserjet 4555/4555/4555dn 10K HP CE390X---HP Laserjet 4555/4555/4556dn 24K Kyocera TK-1100/TK-1102/TK-1103/TK-1104 Kyocera TK-1130/TK-1132/TK-1133/TK-1134 Kyocera TK-1140/TK-1142/TK-1143/TK-1144 Utax CD5130/5135 Utax CD5230/5235 OKI B411/B431 OKI C310/C330/C530 OKI C810/C820/C830 OKI C710/C711 OKI C910/C930 OKI C9650 OKI B930 OKI C9655 OKI ES3640 our quality warranty is 100% return and replacement. if there is any quality problem,we will do the replacement for you di= rectly in your next order without asking you to send back to save your= cost for small quantity if for big quantity of defectives,we will need you to send back with t= he shipping cost paid us,after checking the quality problem,we will do= the replacement or do the refund for you and our quality guarantee has been stated clearly on our website of ww= w.printercolorltd.com ,www.toner-cartridge-chip.com.cn as well as our = aliexpress store we are an second year golden manufacturer on www.alibaba.com .You can = check our certificate for export right ,export company Identity numbe= r,registered certificate with our government and customs on our websi= te of http://www.toner-cartridge-chip.com.cn/column/208392025/Certific= ates.html,.,you can trust us.our website is www.toner-cartridge-chip.c= om.cn and www.printercolorltd.com=20 if your quantity is 10,000PCS,we can give you free delivery.And if you= r quantity is 5000PCS,we can pay for 50% shipping cost for you! I am looking forward to your reply! Best wishes! yours, Sherry Sales Manager Company:NPC, Nanchang Printer Color Technology Co., LtD = =20 Address: Room 602,Unit 1,Building 3,Hongcheng Road No.589,Nanchang Cit= y,Jiangxi province ,China Tel:86-0791-86207670 Fax:86-0791-86207670 Mobile:0086-13576261899 Post code:330046 MSN: sherry@printercolorltd.com,admin@printercolorltd.com Skype:sherryhuang000001 Email: sherry@printercolorltd.com,admin@printercolorltd.com,=20 Web:http://printercolorltd.en.alibaba.com/ http://www.printercolorltd.com www.toner-cartridge-chip.com.cn online shop:http://www.aliexpress.com/store/401088 CERTIFICATE:http://www.toner-cartridge-chip.com.cn/column/208392025/Ce= rtificates.html=20 golden member:http://en.trade2cn.com/companyShop/11090211243708n.html;= jsessionid=3DD66F7EB010C669C88801D1AF46803D3B =20 From mgorman@suse.de Wed Sep 5 06:31:48 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q85BVmOu037264 for ; Wed, 5 Sep 2012 06:31:48 -0500 X-ASG-Debug-ID: 1346844765-04cb6c236313e6d0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id fcaD39MqOrnKr7zV (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 05 Sep 2012 04:32:46 -0700 (PDT) X-Barracuda-Envelope-From: mgorman@suse.de X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (unknown [195.135.220.254]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx2.suse.de (Postfix) with ESMTP id 6AE5FA0FED; Wed, 5 Sep 2012 13:32:45 +0200 (CEST) Date: Wed, 5 Sep 2012 12:32:42 +0100 From: Mel Gorman To: Christoph Hellwig Cc: Dave Chinner , xfs@oss.sgi.com Subject: Re: [PATCH 020/102] xfs: warn if direct reclaim tries to writeback pages Message-ID: <20120905113242.GL11266@suse.de> X-ASG-Orig-Subj: Re: [PATCH 020/102] xfs: warn if direct reclaim tries to writeback pages References: <1345698180-13612-1-git-send-email-david@fromorbit.com> <1345698180-13612-21-git-send-email-david@fromorbit.com> <20120827181742.GA13970@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-15 Content-Disposition: inline In-Reply-To: <20120827181742.GA13970@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1346844766 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107673 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Aug 27, 2012 at 02:17:42PM -0400, Christoph Hellwig wrote: > On Thu, Aug 23, 2012 at 03:01:38PM +1000, Dave Chinner wrote: > > From: Mel Gorman > > > > Upstream commit: 94054fa3fca1fd78db02cb3d68d5627120f0a1d4 > > > > Direct reclaim should never writeback pages. For now, handle the > > situation and warn about it. Ultimately, this will be a BUG_ON. > > Is this actually the case on 3.0-stable? > No, it is not. AFAIK, 3.0-stable does not contain [ee72886d: mm: vmscan: do not writeback filesystem pages in direct reclaim] which is the absolute minimum required for commit [94054fa3: xfs: warn if direct reclaim tries to writeback pages] to make sense. -- Mel Gorman SUSE Labs From branto@redhat.com Wed Sep 5 06:59:51 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.3 required=5.0 tests=BAYES_00,J_CHICKENPOX_13, J_CHICKENPOX_33,J_CHICKENPOX_43,J_CHICKENPOX_47,J_CHICKENPOX_54, J_CHICKENPOX_72,LOTS_OF_MONEY autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q85BxoEb041164 for ; Wed, 5 Sep 2012 06:59:51 -0500 X-ASG-Debug-ID: 1346846442-04bdf078ff1310d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id C8N0yxKMuBsbEWAW for ; Wed, 05 Sep 2012 05:00:42 -0700 (PDT) X-Barracuda-Envelope-From: branto@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q85C0eju004369 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 5 Sep 2012 08:00:40 -0400 Received: from [10.34.30.128] ([10.34.30.128]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q85C0ahA021887; Wed, 5 Sep 2012 08:00:37 -0400 Subject: Re: [PATCH 17/18] xfstests: convert tests to use new results directory From: Boris Ranto X-ASG-Orig-Subj: Re: [PATCH 17/18] xfstests: convert tests to use new results directory To: Dave Chinner Cc: xfs@oss.sgi.com In-Reply-To: <1343294892-20991-18-git-send-email-david@fromorbit.com> References: <1343294892-20991-1-git-send-email-david@fromorbit.com> <1343294892-20991-18-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset="UTF-8" Date: Wed, 05 Sep 2012 14:00:35 +0200 Message-ID: <1346846436.1129.20.camel@localhost> Mime-Version: 1.0 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1346846442 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com On Thu, 2012-07-26 at 19:28 +1000, Dave Chinner wrote: > From: Dave Chinner > > Essentially the change is simply this. Converting: > > ... >> $seq.???? > > to: > > .... >> $RESULT_DIR/$seq.???? > > so that output files are directed to the defined output directory. > > sed to the rescue: > > $ sed -i -e '/^seq=.*$/a seqres=$RESULT_DIR/$seq' -e 's/seq.full/seqres.full/' tests/*/* > > will do most of the work automatically. > > > Signed-off-by: Dave Chinner > --- > new | 3 ++- > tests/btrfs/254 | 1 + > tests/btrfs/264 | 1 + > tests/btrfs/265 | 1 + > tests/btrfs/276 | 31 ++++++++++++++++--------------- > tests/btrfs/284 | 1 + > tests/ext4/271 | 3 ++- > tests/generic/001 | 9 +++++---- > tests/generic/002 | 1 + > tests/generic/005 | 1 + > tests/generic/006 | 1 + > tests/generic/007 | 1 + > tests/generic/010 | 5 +++-- > tests/generic/011 | 7 ++++--- > tests/generic/013 | 21 +++++++++++---------- > tests/generic/014 | 1 + > tests/generic/015 | 9 +++++---- > tests/generic/020 | 9 +++++---- > tests/generic/053 | 1 + > tests/generic/062 | 15 ++++++++------- > tests/generic/069 | 13 +++++++------ > tests/generic/070 | 3 ++- > tests/generic/074 | 11 ++++++----- > tests/generic/075 | 7 ++++--- > tests/generic/076 | 13 +++++++------ > tests/generic/077 | 21 +++++++++++---------- > tests/generic/079 | 1 + > tests/generic/083 | 15 ++++++++------- > tests/generic/088 | 3 ++- > tests/generic/089 | 7 ++++--- > tests/generic/091 | 9 +++++---- > tests/generic/093 | 3 ++- > tests/generic/097 | 3 ++- > tests/generic/099 | 3 ++- > tests/generic/100 | 11 ++++++----- > tests/generic/105 | 11 ++++++----- > tests/generic/112 | 7 ++++--- > tests/generic/113 | 1 + > tests/generic/117 | 15 ++++++++------- > tests/generic/120 | 1 + > tests/generic/123 | 1 + > tests/generic/124 | 1 + > tests/generic/125 | 1 + > tests/generic/126 | 1 + > tests/generic/127 | 1 + > tests/generic/128 | 1 + > tests/generic/129 | 1 + > tests/generic/130 | 1 + > tests/generic/131 | 1 + > tests/generic/132 | 1 + > tests/generic/133 | 1 + > tests/generic/135 | 1 + > tests/generic/141 | 1 + > tests/generic/169 | 15 ++++++++------- > tests/generic/184 | 1 + > tests/generic/192 | 9 +++++---- > tests/generic/193 | 3 ++- > tests/generic/198 | 3 ++- > tests/generic/204 | 5 +++-- > tests/generic/207 | 1 + > tests/generic/208 | 1 + > tests/generic/209 | 1 + > tests/generic/210 | 1 + > tests/generic/211 | 1 + > tests/generic/212 | 1 + > tests/generic/213 | 3 ++- > tests/generic/214 | 3 ++- > tests/generic/215 | 3 ++- > tests/generic/219 | 15 ++++++++------- > tests/generic/221 | 1 + > tests/generic/223 | 13 +++++++------ > tests/generic/224 | 7 ++++--- > tests/generic/225 | 3 ++- > tests/generic/226 | 9 +++++---- > tests/generic/228 | 3 ++- > tests/generic/230 | 41 +++++++++++++++++++++-------------------- > tests/generic/231 | 9 +++++---- > tests/generic/232 | 11 ++++++----- > tests/generic/233 | 11 ++++++----- > tests/generic/234 | 7 ++++--- > tests/generic/235 | 13 +++++++------ > tests/generic/236 | 1 + > tests/generic/237 | 3 ++- > tests/generic/239 | 1 + > tests/generic/240 | 3 ++- > tests/generic/241 | 5 +++-- > tests/generic/245 | 1 + > tests/generic/246 | 1 + > tests/generic/247 | 1 + > tests/generic/248 | 1 + > tests/generic/249 | 7 ++++--- > tests/generic/251 | 1 + > tests/generic/255 | 1 + > tests/generic/256 | 1 + > tests/generic/257 | 3 ++- > tests/generic/258 | 1 + > tests/generic/260 | 1 + > tests/generic/263 | 9 +++++---- > tests/generic/269 | 7 ++++--- > tests/generic/270 | 7 ++++--- > tests/generic/273 | 7 ++++--- > tests/generic/274 | 41 +++++++++++++++++++++-------------------- > tests/generic/275 | 5 +++-- > tests/generic/277 | 1 + > tests/generic/280 | 3 ++- > tests/shared/051 | 3 ++- > tests/shared/068 | 29 +++++++++++++++-------------- > tests/shared/218 | 15 ++++++++------- > tests/shared/243 | 23 ++++++++++++----------- > tests/shared/272 | 11 ++++++----- > tests/udf/098 | 3 ++- > tests/udf/101 | 1 + > tests/udf/102 | 1 + > tests/xfs/003 | 1 + > tests/xfs/004 | 17 +++++++++-------- > tests/xfs/008 | 1 + > tests/xfs/009 | 1 + > tests/xfs/012 | 1 + > tests/xfs/016 | 35 ++++++++++++++++++----------------- > tests/xfs/017 | 31 ++++++++++++++++--------------- > tests/xfs/018 | 3 ++- > tests/xfs/019 | 3 ++- > tests/xfs/021 | 5 +++-- > tests/xfs/022 | 1 + > tests/xfs/023 | 1 + > tests/xfs/024 | 5 +++-- > tests/xfs/025 | 1 + > tests/xfs/026 | 1 + > tests/xfs/027 | 1 + > tests/xfs/028 | 3 ++- > tests/xfs/029 | 1 + > tests/xfs/030 | 1 + > tests/xfs/031 | 13 +++++++------ > tests/xfs/032 | 15 ++++++++------- > tests/xfs/033 | 1 + > tests/xfs/034 | 13 +++++++------ > tests/xfs/035 | 1 + > tests/xfs/036 | 1 + > tests/xfs/037 | 1 + > tests/xfs/038 | 1 + > tests/xfs/039 | 1 + > tests/xfs/040 | 7 ++++--- > tests/xfs/041 | 5 +++-- > tests/xfs/042 | 7 ++++--- > tests/xfs/043 | 1 + > tests/xfs/044 | 1 + > tests/xfs/045 | 1 + > tests/xfs/046 | 1 + > tests/xfs/047 | 3 ++- > tests/xfs/048 | 1 + > tests/xfs/049 | 53 +++++++++++++++++++++++++++-------------------------- > tests/xfs/050 | 31 ++++++++++++++++--------------- > tests/xfs/052 | 19 ++++++++++--------- > tests/xfs/054 | 7 ++++--- > tests/xfs/055 | 1 + > tests/xfs/056 | 1 + > tests/xfs/057 | 1 + > tests/xfs/058 | 1 + > tests/xfs/059 | 1 + > tests/xfs/060 | 1 + > tests/xfs/061 | 1 + > tests/xfs/063 | 1 + > tests/xfs/064 | 9 +++++---- > tests/xfs/065 | 1 + > tests/xfs/066 | 1 + > tests/xfs/067 | 9 +++++---- > tests/xfs/071 | 17 +++++++++-------- > tests/xfs/072 | 3 ++- > tests/xfs/073 | 1 + > tests/xfs/078 | 1 + > tests/xfs/080 | 1 + > tests/xfs/081 | 3 ++- > tests/xfs/082 | 3 ++- > tests/xfs/084 | 1 + > tests/xfs/085 | 11 ++++++----- > tests/xfs/086 | 13 +++++++------ > tests/xfs/087 | 17 +++++++++-------- > tests/xfs/090 | 1 + > tests/xfs/092 | 1 + > tests/xfs/094 | 1 + > tests/xfs/095 | 1 + > tests/xfs/096 | 5 +++-- > tests/xfs/103 | 1 + > tests/xfs/104 | 15 ++++++++------- > tests/xfs/106 | 5 +++-- > tests/xfs/107 | 5 +++-- > tests/xfs/108 | 15 ++++++++------- > tests/xfs/109 | 3 ++- > tests/xfs/110 | 1 + > tests/xfs/111 | 1 + > tests/xfs/114 | 31 ++++++++++++++++--------------- > tests/xfs/115 | 11 ++++++----- > tests/xfs/116 | 1 + > tests/xfs/118 | 3 ++- > tests/xfs/119 | 1 + > tests/xfs/121 | 17 +++++++++-------- > tests/xfs/122 | 7 ++++--- > tests/xfs/134 | 5 +++-- > tests/xfs/136 | 1 + > tests/xfs/137 | 1 + > tests/xfs/138 | 1 + > tests/xfs/139 | 1 + > tests/xfs/140 | 1 + > tests/xfs/142 | 1 + > tests/xfs/143 | 1 + > tests/xfs/144 | 1 + > tests/xfs/145 | 1 + > tests/xfs/146 | 1 + > tests/xfs/147 | 1 + > tests/xfs/148 | 1 + > tests/xfs/149 | 13 +++++++------ > tests/xfs/150 | 1 + > tests/xfs/151 | 3 ++- > tests/xfs/152 | 1 + > tests/xfs/153 | 1 + > tests/xfs/154 | 1 + > tests/xfs/155 | 1 + > tests/xfs/156 | 5 +++-- > tests/xfs/157 | 1 + > tests/xfs/158 | 1 + > tests/xfs/159 | 1 + > tests/xfs/160 | 1 + > tests/xfs/161 | 1 + > tests/xfs/162 | 1 + > tests/xfs/163 | 1 + > tests/xfs/164 | 5 +++-- > tests/xfs/165 | 7 ++++--- > tests/xfs/166 | 5 +++-- > tests/xfs/167 | 5 +++-- > tests/xfs/168 | 5 +++-- > tests/xfs/170 | 3 ++- > tests/xfs/171 | 3 ++- > tests/xfs/172 | 3 ++- > tests/xfs/173 | 3 ++- > tests/xfs/174 | 3 ++- > tests/xfs/175 | 3 ++- > tests/xfs/176 | 3 ++- > tests/xfs/177 | 1 + > tests/xfs/178 | 1 + > tests/xfs/179 | 1 + > tests/xfs/180 | 1 + > tests/xfs/181 | 17 +++++++++-------- > tests/xfs/182 | 1 + > tests/xfs/183 | 1 + > tests/xfs/185 | 1 + > tests/xfs/186 | 7 ++++--- > tests/xfs/187 | 5 +++-- > tests/xfs/188 | 3 ++- > tests/xfs/189 | 3 ++- > tests/xfs/190 | 13 +++++++------ > tests/xfs/191 | 5 +++-- > tests/xfs/194 | 19 ++++++++++--------- > tests/xfs/195 | 3 ++- > tests/xfs/196 | 3 ++- > tests/xfs/197 | 3 ++- > tests/xfs/199 | 3 ++- > tests/xfs/200 | 3 ++- > tests/xfs/201 | 3 ++- > tests/xfs/202 | 3 ++- > tests/xfs/203 | 3 ++- > tests/xfs/205 | 7 ++++--- > tests/xfs/206 | 3 ++- > tests/xfs/216 | 1 + > tests/xfs/217 | 1 + > tests/xfs/220 | 1 + > tests/xfs/222 | 3 ++- > tests/xfs/227 | 25 +++++++++++++------------ > tests/xfs/229 | 1 + > tests/xfs/238 | 1 + > tests/xfs/242 | 1 + > tests/xfs/244 | 17 +++++++++-------- > tests/xfs/250 | 1 + > tests/xfs/252 | 1 + > tests/xfs/253 | 1 + > tests/xfs/259 | 1 + > tests/xfs/261 | 1 + > tests/xfs/262 | 1 + > tests/xfs/266 | 1 + > tests/xfs/267 | 1 + > tests/xfs/268 | 1 + > tests/xfs/278 | 25 +++++++++++++------------ > tests/xfs/279 | 11 ++++++----- > tests/xfs/281 | 1 + > tests/xfs/282 | 5 +++-- > tests/xfs/283 | 5 +++-- > 285 files changed, 905 insertions(+), 620 deletions(-) > > diff --git a/new b/new > index 8dde6c5..94638f6 100755 > --- a/new > +++ b/new > @@ -106,6 +106,7 @@ cat <$id > # > # creator > seq=\`basename \$0\` > +seqres=$RESULT_DIR/$seq > echo "QA output created by \$seq" > > here=\`pwd\` > @@ -134,7 +135,7 @@ exit > > # optional stuff if your test has verbose output to help resolve problems > #echo > -#echo "If failure, check \$seq.full (this) and \$seq.full.ok (reference)" > +#echo "If failure, check \$seqres.full (this) and \$seqres.full.ok (reference)" > > # success, all done > status=0 > diff --git a/tests/btrfs/254 b/tests/btrfs/254 > index 73089d1..ec3d2c5 100755 > --- a/tests/btrfs/254 > +++ b/tests/btrfs/254 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/btrfs/264 b/tests/btrfs/264 > index a589c7c..46a4926 100755 > --- a/tests/btrfs/264 > +++ b/tests/btrfs/264 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/btrfs/265 b/tests/btrfs/265 > index f28d4e5..760f383 100755 > --- a/tests/btrfs/265 > +++ b/tests/btrfs/265 > @@ -22,6 +22,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/btrfs/276 b/tests/btrfs/276 > index fc87c28..63dec4d 100755 > --- a/tests/btrfs/276 > +++ b/tests/btrfs/276 > @@ -26,6 +26,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -54,7 +55,7 @@ _require_nobigloopfs > _require_btrfs inspect-internal > _require_command "/usr/sbin/filefrag" > > -rm -f $seq.full > +rm -f $seqres.full > > FILEFRAG_FILTER='if (/, blocksize (\d+)/) {$blocksize = $1; next} ($ext, '\ > '$logical, $physical, $expected, $length, $flags) = (/^\s*(\d+)\s+(\d+)'\ > @@ -68,18 +69,18 @@ FILEFRAG_FILTER='if (/, blocksize (\d+)/) {$blocksize = $1; next} ($ext, '\ > # sample output: "1234#10#5678" -> physical 1234, length 10, logical 5678 > _filter_extents() > { > - tee -a $seq.full | $PERL_PROG -ne "$FILEFRAG_FILTER" > + tee -a $seqres.full | $PERL_PROG -ne "$FILEFRAG_FILTER" > } > > _check_file_extents() > { > cmd="filefrag -vx $1" > - echo "# $cmd" >> $seq.full > + echo "# $cmd" >> $seqres.full > out=`$cmd | _filter_extents` > if [ -z "$out" ]; then > return 1 > fi > - echo "after filter: $out" >> $seq.full > + echo "after filter: $out" >> $seqres.full > echo $out > return 0 > } > @@ -95,9 +96,9 @@ _btrfs_inspect_addr() > expect_inum=$4 > file=$5 > cmd="$BTRFS_UTIL_PROG inspect-internal logical-resolve -P $addr $mp" > - echo "# $cmd" >> $seq.full > + echo "# $cmd" >> $seqres.full > out=`$cmd` > - echo "$out" >> $seq.full > + echo "$out" >> $seqres.full > grep_expr="inode $expect_inum offset $expect_addr root" > echo "$out" | grep "^$grep_expr 5$" >/dev/null > ret=$? > @@ -128,9 +129,9 @@ _btrfs_inspect_inum() > snap_name=$3 > mp="$SCRATCH_MNT/$snap_name" > cmd="$BTRFS_UTIL_PROG inspect-internal inode-resolve $inum $mp" > - echo "# $cmd" >> $seq.full > + echo "# $cmd" >> $seqres.full > out=`$cmd` > - echo "$out" >> $seq.full > + echo "$out" >> $seqres.full > grep_expr="^$file$" > cnt=`echo "$out" | grep "$grep_expr" | wc -l` > if [ $cnt -ge "1" ]; then > @@ -151,9 +152,9 @@ _btrfs_inspect_check() > logical=$4 > snap_name=$5 > cmd="stat -c %i $file" > - echo "# $cmd" >> $seq.full > + echo "# $cmd" >> $seqres.full > inum=`$cmd` > - echo "$inum" >> $seq.full > + echo "$inum" >> $seqres.full > _btrfs_inspect_addr $SCRATCH_MNT $physical $logical $inum $file > ret=$? > if [ $ret -eq 0 ]; then > @@ -165,8 +166,8 @@ _btrfs_inspect_check() > > run_check() > { > - echo "# $@" >> $seq.full 2>&1 > - "$@" >> $seq.full 2>&1 || _fail "failed: '$@'" > + echo "# $@" >> $seqres.full 2>&1 > + "$@" >> $seqres.full 2>&1 || _fail "failed: '$@'" > } > > workout() > @@ -177,9 +178,9 @@ workout() > snap_name=$4 > > umount $SCRATCH_DEV >/dev/null 2>&1 > - echo "*** mkfs -dsize=$fsz" >>$seq.full > - echo "" >>$seq.full > - _scratch_mkfs_sized $fsz >>$seq.full 2>&1 \ > + echo "*** mkfs -dsize=$fsz" >>$seqres.full > + echo "" >>$seqres.full > + _scratch_mkfs_sized $fsz >>$seqres.full 2>&1 \ > || _fail "size=$fsz mkfs failed" > run_check _scratch_mount > # -w ensures that the only ops are ones which cause write I/O > diff --git a/tests/btrfs/284 b/tests/btrfs/284 > index f8d0340..41688d3 100644 > --- a/tests/btrfs/284 > +++ b/tests/btrfs/284 > @@ -22,6 +22,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > here="`pwd`" > tmp=/tmp/$$ > diff --git a/tests/ext4/271 b/tests/ext4/271 > index 50b4c0b..6a0e7b1 100755 > --- a/tests/ext4/271 > +++ b/tests/ext4/271 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -40,7 +41,7 @@ _supported_os Linux > _need_to_be_root > _require_scratch > > -_scratch_mkfs_sized $((128 * 1024 * 1024)) >> $seq.full 2>&1 > +_scratch_mkfs_sized $((128 * 1024 * 1024)) >> $seqres.full 2>&1 > > # -onoload and EXT4_SYNC_FL on file is important becase result in > # metadata sync writes inside ext4_handle_dirty_metadata() > diff --git a/tests/generic/001 b/tests/generic/001 > index b9997f3..a6659ab 100755 > --- a/tests/generic/001 > +++ b/tests/generic/001 > @@ -32,6 +32,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > # get standard environment, filters and checks > @@ -189,7 +190,7 @@ _mark_iteration() > # > _chain() > { > - $AWK_PROG -v full_file=$here/$seq.full -v verify=$verify <$tmp.config ' > + $AWK_PROG -v full_file=$here/$seqres.full -v verify=$verify <$tmp.config ' > BEGIN { nfile = 0 } > /^\#/ { next } > { file[nfile] = $1 > @@ -237,7 +238,7 @@ END { srand('$iter') > } > } > }' \ > - | tee -a $here/$seq.full | sh > + | tee -a $here/$seqres.full | sh > } > > _check() > @@ -291,7 +292,7 @@ _cleanup() > fi > } > > -rm -f $here/$seq.full > +rm -f $here/$seqres.full > status=0 > _cleanup > status=1 > @@ -305,7 +306,7 @@ _setup > for iter in 1 2 3 4 5 > do > echo -n "iter $iter chain ... " > - echo "iter $iter" >> $here/$seq.full > + echo "iter $iter" >> $here/$seqres.full > _chain > _check > if [ -f $tmp.bad ] > diff --git a/tests/generic/002 b/tests/generic/002 > index db63fa0..ba1a5cf 100755 > --- a/tests/generic/002 > +++ b/tests/generic/002 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > # get standard environment, filters and checks > diff --git a/tests/generic/005 b/tests/generic/005 > index 27da3d3..ba28502 100755 > --- a/tests/generic/005 > +++ b/tests/generic/005 > @@ -33,6 +33,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/generic/006 b/tests/generic/006 > index 1437b46..9949d84 100755 > --- a/tests/generic/006 > +++ b/tests/generic/006 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/generic/007 b/tests/generic/007 > index 2bb981f..2d026a3 100755 > --- a/tests/generic/007 > +++ b/tests/generic/007 > @@ -26,6 +26,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/generic/010 b/tests/generic/010 > index 245f407..3587f21 100755 > --- a/tests/generic/010 > +++ b/tests/generic/010 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -59,11 +60,11 @@ _supported_os IRIX Linux > > _setup_testdir > > -rm -f $seq.full > +rm -f $seqres.full > > cd $testdir > > -$here/src/dbtest -l 5 -n 1000 2>&1 | tee -a $here/$seq.full | _filter_dbtest > +$here/src/dbtest -l 5 -n 1000 2>&1 | tee -a $here/$seqres.full | _filter_dbtest > > # success, all done > exit > diff --git a/tests/generic/011 b/tests/generic/011 > index 4ede2d8..e5c6bbf 100755 > --- a/tests/generic/011 > +++ b/tests/generic/011 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > out="" > @@ -51,7 +52,7 @@ _setup_testdir > > out=$testdir/dirstress.$$ > > -rm -f $seq.full > +rm -f $seqres.full > > _test() > { > @@ -63,8 +64,8 @@ _test() > if ! $here/src/dirstress -d $out -f $count $args >$tmp.out 2>&1 > then > echo " dirstress failed" > - echo "*** TEST $test -d $out -f $count $args" >>$seq.full > - cat $tmp.out >>$seq.full > + echo "*** TEST $test -d $out -f $count $args" >>$seqres.full > + cat $tmp.out >>$seqres.full > status=1 > fi > } > diff --git a/tests/generic/013 b/tests/generic/013 > index 0879a2a..984ed09 100755 > --- a/tests/generic/013 > +++ b/tests/generic/013 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -73,15 +74,15 @@ _do_test() > echo "fsstress.$_n : $_param" > echo "-----------------------------------------------" > # -m limits number of users/groups so check doesn't fail (malloc) later > - dbgoutfile=$seq.full > + dbgoutfile=$seqres.full > if ! $FSSTRESS_PROG $_param $FSSTRESS_AVOID -v -m 8 -n $_count -d $out >>$dbgoutfile 2>&1 > then > - echo " fsstress (count=$_count) returned $? - see $seq.full" > - echo "--------------------------------------" >>$here/$seq.full > - echo "$_n - output from fsstress:" >>$here/$seq.full > - echo "--------------------------------------" >>$here/$seq.full > - echo "" >>$here/$seq.full > - #cat $tmp.out >>$here/$seq.full > + echo " fsstress (count=$_count) returned $? - see $seqres.full" > + echo "--------------------------------------" >>$here/$seqres.full > + echo "$_n - output from fsstress:" >>$here/$seqres.full > + echo "--------------------------------------" >>$here/$seqres.full > + echo "" >>$here/$seqres.full > + #cat $tmp.out >>$here/$seqres.full > status=1 > fi > > @@ -95,7 +96,7 @@ _supported_os IRIX Linux > > _setup_testdir > > -rm -f $here/$seq.full > +rm -f $here/$seqres.full > echo "brevity is wit..." > > count=1000 > @@ -115,8 +116,8 @@ _do_test 2 "-p $procs -r" $count > > _do_test 3 "-p 4 -z -f rmdir=10 -f link=10 -f creat=10 -f mkdir=10 -f rename=30 -f stat=30 -f unlink=30 -f truncate=20" $count > > -# if all ok by here then probably don't need $seq.full > -rm -f $seq.full > +# if all ok by here then probably don't need $seqres.full > +rm -f $seqres.full > > exit > > diff --git a/tests/generic/014 b/tests/generic/014 > index 93caaa6..096e4e5 100755 > --- a/tests/generic/014 > +++ b/tests/generic/014 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/generic/015 b/tests/generic/015 > index 52ab251..a77d2f7 100755 > --- a/tests/generic/015 > +++ b/tests/generic/015 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -56,7 +57,7 @@ _scratch_mkfs_sized `expr 50 \* 1024 \* 1024` >/dev/null 2>&1 \ > || _fail "mkfs failed" > _scratch_mount || _fail "mount failed" > out=$SCRATCH_MNT/fillup.$$ > -rm -f $seq.full > +rm -f $seqres.full > > free0=`_free` > if [ -z "$free0" ] > @@ -64,7 +65,7 @@ then > echo " *** failed to get free space (0)" > exit 1 > fi > -echo "free space at start $free0" >> $seq.full > +echo "free space at start $free0" >> $seqres.full > > echo "fill disk:" # well, filesystem really - not disk > > @@ -78,7 +79,7 @@ then > echo " *** failed to get free space (1)" > exit 1 > fi > -echo "free space after fill $free1" >> $seq.full > +echo "free space after fill $free1" >> $seqres.full > > if [ ! -e $out ] > then > @@ -116,7 +117,7 @@ then > echo " *** failed to get free space (2)" > exit 1 > fi > -echo "free space after delete $free2" >> $seq.full > +echo "free space after delete $free2" >> $seqres.full > > echo -n " !!! " > _within_tolerance "free space" $free2 $free0 1% -v > diff --git a/tests/generic/020 b/tests/generic/020 > index 2bd1d9f..42465d8 100755 > --- a/tests/generic/020 > +++ b/tests/generic/020 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -85,7 +86,7 @@ _require_attrs > > _setup_testdir > > -rm -f $seq.full > +rm -f $seqres.full > > testfile=$testdir/attribute_$$ > > @@ -120,7 +121,7 @@ v=0 > > while [ $v -lt $MAX_ATTRS ] > do > - echo -n "value_$v" | attr -s "attribute_$v" $testfile >>$seq.full > + echo -n "value_$v" | attr -s "attribute_$v" $testfile >>$seqres.full > if [ $? -ne 0 ] > then > echo "!!! failed to add \"attribute_$v\"" > @@ -133,7 +134,7 @@ done > echo "*** check" > # don't print it all out... > getfattr --absolute-names $testfile \ > - | tee -a $seq.full \ > + | tee -a $seqres.full \ > | $AWK_PROG ' > /^#/ { next } > /^[ ]*$/ { next } > @@ -145,7 +146,7 @@ echo "*** remove lots of attributes" > v=0 > while [ $v -lt $MAX_ATTRS ] > do > - if ! $ATTR_PROG -r "attribute_$v" $testfile >>$seq.full > + if ! $ATTR_PROG -r "attribute_$v" $testfile >>$seqres.full > then > echo "!!! failed to remove \"attribute_$v\"" > exit 1 > diff --git a/tests/generic/053 b/tests/generic/053 > index 388c9b4..99dd1b0 100755 > --- a/tests/generic/053 > +++ b/tests/generic/053 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/generic/062 b/tests/generic/062 > index 5a6081e..27907a9 100755 > --- a/tests/generic/062 > +++ b/tests/generic/062 > @@ -24,6 +24,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -75,7 +76,7 @@ _supported_os Linux > _require_scratch > _require_attrs > > -rm -f $tmp.backup1 $tmp.backup2 $seq.full > +rm -f $tmp.backup1 $tmp.backup2 $seqres.full > > # real QA test starts here > _scratch_mkfs > /dev/null 2>&1 || _fail "mkfs failed" > @@ -181,8 +182,8 @@ _backup() > { > # NB: no filtering of scratch here... (need to restore too) > $GETFATTR_PROG --absolute-names -dh -R -m '.' $SCRATCH_MNT >$1 > - echo BACKUP $1 >>$seq.full > - cat $1 >> $seq.full > + echo BACKUP $1 >>$seqres.full > + cat $1 >> $seqres.full > [ ! -s $1 ] && echo "warning: $1 (backup file) is empty" > } > > @@ -191,8 +192,8 @@ _backup $tmp.backup1 > > echo "*** clear out the scratch device" > rm -fr $SCRATCH_MNT/* > -echo "AFTER REMOVE" >>$seq.full > -getfattr -L -R -m '.' $SCRATCH_MNT >>$seq.full > +echo "AFTER REMOVE" >>$seqres.full > +getfattr -L -R -m '.' $SCRATCH_MNT >>$seqres.full > > echo "*** reset test bed with no extended attributes" > _create_test_bed > @@ -202,8 +203,8 @@ echo "*** restore everything" > setfattr -h --restore=$tmp.backup1 > _backup $tmp.backup2 > > -echo "AFTER RESTORE" >>$seq.full > -getfattr -L -R -m '.' $SCRATCH_MNT >>$seq.full > +echo "AFTER RESTORE" >>$seqres.full > +getfattr -L -R -m '.' $SCRATCH_MNT >>$seqres.full > > echo "*** compare before and after backups" > diff $tmp.backup1 $tmp.backup2 > diff --git a/tests/generic/069 b/tests/generic/069 > index 3451715..b2b18a9 100755 > --- a/tests/generic/069 > +++ b/tests/generic/069 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -39,7 +40,7 @@ _supported_fs generic > _supported_os IRIX Linux > > _require_scratch > -rm -f $seq.full > +rm -f $seqres.full > > umount $SCRATCH_DEV >/dev/null 2>&1 > > @@ -60,19 +61,19 @@ done > cd $here > > wait > -ls -lh $SCRATCH_MNT >> $seq.full > -echo "*** PIDs file" >> $seq.full > -cat $SCRATCH_MNT/pids >> $seq.full > +ls -lh $SCRATCH_MNT >> $seqres.full > +echo "*** PIDs file" >> $seqres.full > +cat $SCRATCH_MNT/pids >> $seqres.full > > cat $SCRATCH_MNT/pids | while read pid size > do > echo "*** checking file with $size integers" > - echo checking pid=$pid size=$size >> $seq.full > + echo checking pid=$pid size=$size >> $seqres.full > $here/src/append_reader $SCRATCH_MNT/testfile.$pid > status=$? > [ $status -ne 0 ] && \ > echo "maybe corrupt O_APPEND to $SCRATCH_MOUNT/testfile.$pid!" > - echo status: $status >> $seq.full > + echo status: $status >> $seqres.full > done > > # success, all done > diff --git a/tests/generic/070 b/tests/generic/070 > index 1d978cd..4e86de8 100755 > --- a/tests/generic/070 > +++ b/tests/generic/070 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -60,7 +61,7 @@ $FSSTRESS_PROG \ > -f unresvsp=0 \ > -f attr_set=100 \ > -f attr_remove=100 \ > - -p 1 -n 10000 -S c >$seq.full 2>&1 > + -p 1 -n 10000 -S c >$seqres.full 2>&1 > > status=$? > exit > diff --git a/tests/generic/074 b/tests/generic/074 > index 0e5e820..c795dc7 100755 > --- a/tests/generic/074 > +++ b/tests/generic/074 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -64,9 +65,9 @@ _do_test() > echo "-----------------------------------------------" > echo "fstest.$_n : $_filter_param" > echo "-----------------------------------------------" > - if ! $here/src/fstest $_param -p $out >>$seq.full > + if ! $here/src/fstest $_param -p $out >>$seqres.full > then > - echo " fstest ($_param) returned $? - see $seq.full" > + echo " fstest ($_param) returned $? - see $seqres.full" > status=1 > exit > fi > @@ -107,7 +108,7 @@ _process_args() > > > # real QA test starts here > -rm -f $here/$seq.full > +rm -f $here/$seqres.full > > _supported_fs generic > _supported_os IRIX Linux > @@ -153,8 +154,8 @@ fi > # can override the params here > _process_args "$@" > > -echo "Params are for $param_type" >>$seq.full > -echo "Params: n = $numchildren l = $numloops f = $numfiles" >>$seq.full > +echo "Params are for $param_type" >>$seqres.full > +echo "Params: n = $numchildren l = $numloops f = $numfiles" >>$seqres.full > > _setup_testdir > > diff --git a/tests/generic/075 b/tests/generic/075 > index de581b6..8012cc1 100755 > --- a/tests/generic/075 > +++ b/tests/generic/075 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -133,12 +134,12 @@ numops2=10000 > # can override the params here > _process_args "$@" > > -echo "Params are for $param_type" >>$seq.full > -echo "Params: n = $numops1 N = $numops2 l = $filelen" >>$seq.full > +echo "Params are for $param_type" >>$seqres.full > +echo "Params: n = $numops1 N = $numops2 l = $filelen" >>$seqres.full > > _setup_testdir > > -rm -f $here/$seq.full > +rm -f $here/$seqres.full > echo "brevity is wit..." > > _check_test_fs > diff --git a/tests/generic/076 b/tests/generic/076 > index a8b5d4a..b8db582 100755 > --- a/tests/generic/076 > +++ b/tests/generic/076 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -58,13 +59,13 @@ _require_scratch > > echo "*** init fs" > > -rm -f $seq.full > +rm -f $seqres.full > umount $SCRATCH_DEV >/dev/null 2>&1 > -echo "*** MKFS ***" >>$seq.full > -echo "" >>$seq.full > -_scratch_mkfs >>$seq.full 2>&1 \ > +echo "*** MKFS ***" >>$seqres.full > +echo "" >>$seqres.full > +_scratch_mkfs >>$seqres.full 2>&1 \ > || _fail "mkfs failed" > -_scratch_mount >>$seq.full 2>&1 \ > +_scratch_mount >>$seqres.full 2>&1 \ > || _fail "mount failed" > > echo "*** test concurrent block/fs access" > @@ -72,7 +73,7 @@ echo "*** test concurrent block/fs access" > cat $SCRATCH_DEV >/dev/null & > pid=$! > > -$FSSTRESS_PROG -d $SCRATCH_MNT -p 2 -n 2000 $FSSTRESS_AVOID >>$seq.full > +$FSSTRESS_PROG -d $SCRATCH_MNT -p 2 -n 2000 $FSSTRESS_AVOID >>$seqres.full > > _lets_get_pidst > _check_scratch_fs > diff --git a/tests/generic/077 b/tests/generic/077 > index 2b86a37..3113119 100755 > --- a/tests/generic/077 > +++ b/tests/generic/077 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -56,29 +57,29 @@ _require_user > > echo "*** create filesystem" > > -rm -f $seq.full > +rm -f $seqres.full > umount $SCRATCH_DEV >/dev/null 2>&1 > -echo "*** MKFS ***" >>$seq.full > -echo "" >>$seq.full > +echo "*** MKFS ***" >>$seqres.full > +echo "" >>$seqres.full > SIZE=`expr 50 \* 1024 \* 1024` > -_scratch_mkfs_sized $SIZE >>$seq.full 2>&1 \ > +_scratch_mkfs_sized $SIZE >>$seqres.full 2>&1 \ > || _fail "mkfs failed" > -_scratch_mount >>$seq.full 2>&1 \ > +_scratch_mount >>$seqres.full 2>&1 \ > || _fail "mount failed" > mkdir $SCRATCH_MNT/subdir > > echo "*** set default ACL" > setfacl -R -dm u:fsgqa:rwx,g::rwx,o::r-x,m::rwx $SCRATCH_MNT/subdir > > -echo "*** populate filesystem, pass #1" | tee -a $seq.full > -cp -rf $filler $SCRATCH_MNT/subdir >$seq.full 2>&1 > +echo "*** populate filesystem, pass #1" | tee -a $seqres.full > +cp -rf $filler $SCRATCH_MNT/subdir >$seqres.full 2>&1 > > -echo "*** populate filesystem, pass #2" | tee -a $seq.full > -cp -rf $filler $SCRATCH_MNT/subdir >$seq.full 2>&1 > +echo "*** populate filesystem, pass #2" | tee -a $seqres.full > +cp -rf $filler $SCRATCH_MNT/subdir >$seqres.full 2>&1 > > _check_scratch_fs > > echo "*** all done" > -rm -f $seq.full > +rm -f $seqres.full > status=0 > exit > diff --git a/tests/generic/079 b/tests/generic/079 > index 048b220..3faf106 100755 > --- a/tests/generic/079 > +++ b/tests/generic/079 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/generic/083 b/tests/generic/083 > index dd60118..f0aab4d 100755 > --- a/tests/generic/083 > +++ b/tests/generic/083 > @@ -33,6 +33,7 @@ > > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -58,7 +59,7 @@ _supported_os IRIX Linux > _require_scratch > _require_no_large_scratch_dev > > -rm -f $seq.full > +rm -f $seqres.full > > workout() > { > @@ -68,22 +69,22 @@ workout() > nops=$4 > > umount $SCRATCH_DEV >/dev/null 2>&1 > - echo "*** mkfs -dsize=$fsz,agcount=$ags" >>$seq.full > - echo "" >>$seq.full > + echo "*** mkfs -dsize=$fsz,agcount=$ags" >>$seqres.full > + echo "" >>$seqres.full > if [ $FSTYP = xfs ] > then > - _scratch_mkfs_xfs -dsize=$fsz,agcount=$ags >>$seq.full 2>&1 \ > + _scratch_mkfs_xfs -dsize=$fsz,agcount=$ags >>$seqres.full 2>&1 \ > || _fail "size=$fsz,agcount=$ags mkfs failed" > else > - _scratch_mkfs_sized $fsz >>$seq.full 2>&1 \ > + _scratch_mkfs_sized $fsz >>$seqres.full 2>&1 \ > || _fail "size=$fsz mkfs failed" > fi > - _scratch_mount >>$seq.full 2>&1 \ > + _scratch_mount >>$seqres.full 2>&1 \ > || _fail "mount failed" > > # -w ensures that the only ops are ones which cause write I/O > $FSSTRESS_PROG -d $SCRATCH_MNT -w -p $procs -n $nops $FSSTRESS_AVOID \ > - >>$seq.full > + >>$seqres.full > _check_scratch_fs > } > > diff --git a/tests/generic/088 b/tests/generic/088 > index b6266ef..1386322 100755 > --- a/tests/generic/088 > +++ b/tests/generic/088 > @@ -24,6 +24,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -48,7 +49,7 @@ _supported_fs generic > _supported_os IRIX Linux > > path=$TEST_DIR/t_access > -src/t_access_root $path | tee $seq.full | _filter > +src/t_access_root $path | tee $seqres.full | _filter > > # success, all done > status=0 > diff --git a/tests/generic/089 b/tests/generic/089 > index 2653183..5e8210d 100755 > --- a/tests/generic/089 > +++ b/tests/generic/089 > @@ -24,6 +24,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > mtab_output=$TEST_DIR/mtab_output > @@ -51,7 +52,7 @@ addentries() > _supported_fs generic > _supported_os Linux > > -rm -f $seq.full > +rm -f $seqres.full > [ "X$TEST_DIR" = "X" ] && exit 1 > cd $TEST_DIR > rm -fr test > @@ -72,8 +73,8 @@ mtab() > > echo directory entries: > ls | grep mtab > - echo directory entries >> $here/$seq.full > - ls -li >> $here/$seq.full > + echo directory entries >> $here/$seqres.full > + ls -li >> $here/$seqres.full > } > > # directory with only a few entries > diff --git a/tests/generic/091 b/tests/generic/091 > index ad82b8e..755281e 100755 > --- a/tests/generic/091 > +++ b/tests/generic/091 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -38,16 +39,16 @@ trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15 > _supported_fs generic > _supported_os Linux > > -rm -f $seq.full > +rm -f $seqres.full > > run_fsx() > { > - echo fsx $@ | tee -a $seq.full > + echo fsx $@ | tee -a $seqres.full > args=`echo $@ | sed -e "s/ BSIZE / $bsize /g" -e "s/ PSIZE / $psize /g"` > rm -f $TEST_DIR/junk > - $here/ltp/fsx $args $TEST_DIR/junk >>$seq.full 2>&1 > + $here/ltp/fsx $args $TEST_DIR/junk >>$seqres.full 2>&1 > if [ $? -ne 0 ]; then > - cat $seq.full > + cat $seqres.full > exit 1 > fi > } > diff --git a/tests/generic/093 b/tests/generic/093 > index 881a833..12ef580 100755 > --- a/tests/generic/093 > +++ b/tests/generic/093 > @@ -26,6 +26,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > > here=`pwd` > tmp=/tmp/$$ > @@ -62,7 +63,7 @@ _require_attrs > > [ -x $runas ] || _notrun "$runas executable not found" > > -rm -f $seq.full > +rm -f $seqres.full > > _setup_testdir > _need_to_be_root > diff --git a/tests/generic/097 b/tests/generic/097 > index d3174e4..60f7e4d 100755 > --- a/tests/generic/097 > +++ b/tests/generic/097 > @@ -28,6 +28,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -250,7 +251,7 @@ _check_scratch_fs > > # optional stuff if your test has verbose output to help resolve problems > #echo > -#echo "If failure, check $seq.full (this) and $seq.full.ok (reference)" > +#echo "If failure, check $seqres.full (this) and $seqres.full.ok (reference)" > > # success, all done > status=0 > diff --git a/tests/generic/099 b/tests/generic/099 > index edd88a9..6efa7a7 100755 > --- a/tests/generic/099 > +++ b/tests/generic/099 > @@ -24,6 +24,7 @@ > # modifier > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -72,7 +73,7 @@ _cleanup() > # -> this would be done by simultaneously matching on ACEs > # -> interesting if it allows user to specify ACEs in any order > # > -rm -f $seq.full > +rm -f $seqres.full > > #------------------------------------------------------- > # real QA test starts here > diff --git a/tests/generic/100 b/tests/generic/100 > index 1ba5eb7..34cfde7 100755 > --- a/tests/generic/100 > +++ b/tests/generic/100 > @@ -24,6 +24,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -54,17 +55,17 @@ DEPTH=5 > POPULATED_DIR=$TEMP_DIR/populate_root > SIZE=10 > > -rm -f $seq.full > +rm -f $seqres.full > > # Clean up if file exist from prevous run > rm -rf $POPULATED_DIR > rm -f $TEMP_DIR/$TAR_FILE > > # Create the new directory structure > -_populate_fs -n $NDIRS -f $NFILES -d $DEPTH -r $POPULATED_DIR -s $SIZE >>$here/$seq.full 2>&1 > +_populate_fs -n $NDIRS -f $NFILES -d $DEPTH -r $POPULATED_DIR -s $SIZE >>$here/$seqres.full 2>&1 > > # Then tar up the directory structure > -tar -cvf $TEMP_DIR/$TAR_FILE $POPULATED_DIR >>$here/$seq.full 2>&1 > +tar -cvf $TEMP_DIR/$TAR_FILE $POPULATED_DIR >>$here/$seqres.full 2>&1 > > # create f/s > _require_scratch > @@ -72,12 +73,12 @@ _setup_testdir > > # untar on f/s > cd $testdir > -tar -xRvf $TEMP_DIR/$TAR_FILE >>$here/$seq.full 2>&1 > +tar -xRvf $TEMP_DIR/$TAR_FILE >>$here/$seqres.full 2>&1 > cd $here > > > # use diff -qr to compare > -ls -R -l ${testdir}${POPULATED_DIR} >>$here/$seq.full 2>&1 > +ls -R -l ${testdir}${POPULATED_DIR} >>$here/$seqres.full 2>&1 > diff -qr $POPULATED_DIR ${testdir}${POPULATED_DIR} > > cd / > diff --git a/tests/generic/105 b/tests/generic/105 > index 01bae98..d5b2cb2 100755 > --- a/tests/generic/105 > +++ b/tests/generic/105 > @@ -26,6 +26,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -49,7 +50,7 @@ _supported_os IRIX Linux > > # real QA test starts here > > -rm -f $seq.full > +rm -f $seqres.full > > _require_scratch > _require_acls > @@ -57,11 +58,11 @@ _require_acls > _acl_setup_ids > > umount $SCRATCH_DEV >/dev/null 2>&1 > -echo "*** MKFS ***" >>$seq.full > -echo "" >>$seq.full > -_scratch_mkfs >>$seq.full 2>&1 \ > +echo "*** MKFS ***" >>$seqres.full > +echo "" >>$seqres.full > +_scratch_mkfs >>$seqres.full 2>&1 \ > || _fail "mkfs failed" > -_scratch_mount >>$seq.full 2>&1 \ > +_scratch_mount >>$seqres.full 2>&1 \ > || _fail "mount failed" > > cd $SCRATCH_MNT > diff --git a/tests/generic/112 b/tests/generic/112 > index bcdcfec..8959c8b 100755 > --- a/tests/generic/112 > +++ b/tests/generic/112 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -134,12 +135,12 @@ numops2=10000 > # can override the params here > _process_args "$@" > > -echo "Params are for $param_type" >>$seq.full > -echo "Params: n = $numops1 N = $numops2 l = $filelen" >>$seq.full > +echo "Params are for $param_type" >>$seqres.full > +echo "Params: n = $numops1 N = $numops2 l = $filelen" >>$seqres.full > > _setup_testdir > > -rm -f $here/$seq.full > +rm -f $here/$seqres.full > echo "brevity is wit..." > > _check_test_fs > diff --git a/tests/generic/113 b/tests/generic/113 > index fd301cd..b2a7317 100755 > --- a/tests/generic/113 > +++ b/tests/generic/113 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/generic/117 b/tests/generic/117 > index 8afc962..624bfd8 100755 > --- a/tests/generic/117 > +++ b/tests/generic/117 > @@ -24,6 +24,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -82,13 +83,13 @@ _setup_testdir > _require_scratch > _require_attrs > > -rm -f $seq.full > +rm -f $seqres.full > umount $SCRATCH_DEV >/dev/null 2>&1 > -echo "*** MKFS ***" >>$seq.full > -echo "" >>$seq.full > -_scratch_mkfs >>$seq.full 2>&1 \ > +echo "*** MKFS ***" >>$seqres.full > +echo "" >>$seqres.full > +_scratch_mkfs >>$seqres.full 2>&1 \ > || _fail "mkfs failed" > -_scratch_mount >>$seq.full 2>&1 \ > +_scratch_mount >>$seqres.full 2>&1 \ > || _fail "mount failed" > > mkdir -p $SCRATCH_MNT/fsstress > @@ -97,10 +98,10 @@ echo > echo Running fsstress in serial: > i=0 > while [ $i -lt $ITERATIONS ]; do > - echo fsstress iteration: $i | tee -a $seq.full > + echo fsstress iteration: $i | tee -a $seqres.full > $FSSTRESS_PROG \ > -d $SCRATCH_MNT/fsstress \ > - $fss_ops -S c >>$seq.full 2>&1 > + $fss_ops -S c >>$seqres.full 2>&1 > > let i=$i+1 > done > diff --git a/tests/generic/120 b/tests/generic/120 > index 8389925..c3069f1 100755 > --- a/tests/generic/120 > +++ b/tests/generic/120 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/generic/123 b/tests/generic/123 > index d45c516..2387676 100755 > --- a/tests/generic/123 > +++ b/tests/generic/123 > @@ -24,6 +24,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/generic/124 b/tests/generic/124 > index 6fbb028..65c94b4 100755 > --- a/tests/generic/124 > +++ b/tests/generic/124 > @@ -27,6 +27,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/generic/125 b/tests/generic/125 > index c7215a3..f489e96 100755 > --- a/tests/generic/125 > +++ b/tests/generic/125 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/generic/126 b/tests/generic/126 > index a95c1e4..83671df 100755 > --- a/tests/generic/126 > +++ b/tests/generic/126 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/generic/127 b/tests/generic/127 > index d1101df..021a571 100755 > --- a/tests/generic/127 > +++ b/tests/generic/127 > @@ -27,6 +27,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/generic/128 b/tests/generic/128 > index 85d0f45..165aa00 100755 > --- a/tests/generic/128 > +++ b/tests/generic/128 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/generic/129 b/tests/generic/129 > index 18d891b..e74098f 100755 > --- a/tests/generic/129 > +++ b/tests/generic/129 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/generic/130 b/tests/generic/130 > index 943df72..96491f7 100755 > --- a/tests/generic/130 > +++ b/tests/generic/130 > @@ -32,6 +32,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/generic/131 b/tests/generic/131 > index 176c8b4..02835ab 100755 > --- a/tests/generic/131 > +++ b/tests/generic/131 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/generic/132 b/tests/generic/132 > index 98229a9..2abfccf 100755 > --- a/tests/generic/132 > +++ b/tests/generic/132 > @@ -24,6 +24,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/generic/133 b/tests/generic/133 > index ec225f3..478419c 100755 > --- a/tests/generic/133 > +++ b/tests/generic/133 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/generic/135 b/tests/generic/135 > index f0bf9b9..b5854f4 100755 > --- a/tests/generic/135 > +++ b/tests/generic/135 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/generic/141 b/tests/generic/141 > index 45c1b5e..cb7aae2 100755 > --- a/tests/generic/141 > +++ b/tests/generic/141 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/generic/169 b/tests/generic/169 > index 413a86b..6293654 100755 > --- a/tests/generic/169 > +++ b/tests/generic/169 > @@ -23,11 +23,12 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > tmp=/tmp/$$ > -rm -f $seq.full > +rm -f $seqres.full > status=1 # failure is the default! > trap "_cleanup; exit \$status" 0 1 2 3 15 > > @@ -56,10 +57,10 @@ _supported_os Linux > > _require_scratch > > -_scratch_mkfs >>$seq.full 2>&1 \ > +_scratch_mkfs >>$seqres.full 2>&1 \ > || _fail "mkfs scratch failed" > > -_scratch_mount >>$seq.full 2>&1 \ > +_scratch_mount >>$seqres.full 2>&1 \ > || _fail "mount failed: $MOUNT_OPTIONS" > > echo "# creating new file for io" > @@ -73,11 +74,11 @@ xfs_io -F -a -c "pwrite 0 5k" -c "fsync" \ > | _show_wrote_and_stat_only > > echo "# unmounting scratch" > -umount $SCRATCH_MNT>>$seq.full 2>&1 \ > +umount $SCRATCH_MNT>>$seqres.full 2>&1 \ > || _fail "unmount failed" > > echo "# mounting scratch" > -_scratch_mount >>$seq.full 2>&1 \ > +_scratch_mount >>$seqres.full 2>&1 \ > || _fail "mount failed: $MOUNT_OPTIONS" > > echo "# stating file to confirm correct size" > @@ -90,11 +91,11 @@ xfs_io -F -f -c "pwrite 0 5" -c s -c "pwrite 5 5" \ > | _show_wrote_and_stat_only > > echo "# unmounting scratch" > -umount $SCRATCH_MNT>>$seq.full 2>&1 \ > +umount $SCRATCH_MNT>>$seqres.full 2>&1 \ > || _fail "unmount failed" > > echo "# mounting scratch" > -_scratch_mount >>$seq.full 2>&1 \ > +_scratch_mount >>$seqres.full 2>&1 \ > || _fail "mount failed: $MOUNT_OPTIONS" > > echo "# stating file to confirm correct size" > diff --git a/tests/generic/184 b/tests/generic/184 > index a37f700..929e0eb 100755 > --- a/tests/generic/184 > +++ b/tests/generic/184 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq - silence is golden" > > here=`pwd` > diff --git a/tests/generic/192 b/tests/generic/192 > index 691ab7d..4b9d0bb 100755 > --- a/tests/generic/192 > +++ b/tests/generic/192 > @@ -25,6 +25,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -53,20 +54,20 @@ delay=40 > > testfile=$TEST_DIR/testfile > rm -f $testfile > -rm -f $seq.full > +rm -f $seqres.full > > echo test >$testfile > -time1=`_access_time $testfile | tee -a $seq.full` > +time1=`_access_time $testfile | tee -a $seqres.full` > > echo "sleep for $delay" > sleep $delay # sleep to allow time to move on for access > cat $testfile > -time2=`_access_time $testfile | tee -a $seq.full` > +time2=`_access_time $testfile | tee -a $seqres.full` > > cd / > umount $TEST_DIR > _test_mount > -time3=`_access_time $testfile | tee -a $here/$seq.full` > +time3=`_access_time $testfile | tee -a $here/$seqres.full` > > delta1=`expr $time2 - $time1` > delta2=`expr $time3 - $time1` > diff --git a/tests/generic/193 b/tests/generic/193 > index 88ab971..8b3b9db 100755 > --- a/tests/generic/193 > +++ b/tests/generic/193 > @@ -22,6 +22,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -247,5 +248,5 @@ _cleanup_files > > # success, all done > echo "*** done" > -rm -f $seq.full > +rm -f $seqres.full > status=0 > diff --git a/tests/generic/198 b/tests/generic/198 > index 31de96c..5aac37f 100755 > --- a/tests/generic/198 > +++ b/tests/generic/198 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -47,7 +48,7 @@ _require_aiodio aiodio_sparse2 > echo "Silence is golden." > > # real QA test starts here > -rm -f $seq.full > +rm -f $seqres.full > > rm -f "$TEST_DIR/aiodio_sparse*" > $AIO_TEST "$TEST_DIR/aiodio_sparse" > diff --git a/tests/generic/204 b/tests/generic/204 > index 6c4a3f0..ae87930 100755 > --- a/tests/generic/204 > +++ b/tests/generic/204 > @@ -22,6 +22,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -44,7 +45,7 @@ _scratch_mount > > # fix the reserve block pool to a known size so that the enospc calculations > # work out correctly. > -_scratch_resvblks 1024 > $seq.full 2>&1 > +_scratch_resvblks 1024 > $seqres.full 2>&1 > > for i in `seq 1 22500`; do > echo -n > $SCRATCH_MNT/$i > @@ -53,5 +54,5 @@ done > > # success, all done > echo "*** done" > -rm -f $seq.full > +rm -f $seqres.full > status=0 > diff --git a/tests/generic/207 b/tests/generic/207 > index 6eaf50c..b520bee 100755 > --- a/tests/generic/207 > +++ b/tests/generic/207 > @@ -22,6 +22,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/generic/208 b/tests/generic/208 > index 7ea7514..4c34e7b 100755 > --- a/tests/generic/208 > +++ b/tests/generic/208 > @@ -22,6 +22,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/generic/209 b/tests/generic/209 > index 8b2a4e1..82d5e6a 100755 > --- a/tests/generic/209 > +++ b/tests/generic/209 > @@ -22,6 +22,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/generic/210 b/tests/generic/210 > index 56ac8ad..16908cc 100755 > --- a/tests/generic/210 > +++ b/tests/generic/210 > @@ -22,6 +22,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/generic/211 b/tests/generic/211 > index 5667d20..6d7b996 100755 > --- a/tests/generic/211 > +++ b/tests/generic/211 > @@ -22,6 +22,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/generic/212 b/tests/generic/212 > index e211cc4..6e86e94 100755 > --- a/tests/generic/212 > +++ b/tests/generic/212 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/generic/213 b/tests/generic/213 > index e297fdf..1fa573c 100755 > --- a/tests/generic/213 > +++ b/tests/generic/213 > @@ -26,6 +26,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > _cleanup() > @@ -51,7 +52,7 @@ _supported_os Linux > > [ -n "$XFS_IO_PROG" ] || _notrun "xfs_io executable not found" > > -rm -f $seq.full > +rm -f $seqres.full > > _require_xfs_io_falloc > > diff --git a/tests/generic/214 b/tests/generic/214 > index 0a27fc5..20acca1 100755 > --- a/tests/generic/214 > +++ b/tests/generic/214 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > _cleanup() > @@ -49,7 +50,7 @@ _supported_os Linux > > [ -n "$XFS_IO_PROG" ] || _notrun "xfs_io executable not found" > > -rm -f $seq.full > +rm -f $seqres.full > rm -f $TEST_DIR/ouch* > > _require_xfs_io_falloc > diff --git a/tests/generic/215 b/tests/generic/215 > index 749b27b..73cdd14 100755 > --- a/tests/generic/215 > +++ b/tests/generic/215 > @@ -24,6 +24,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > _cleanup() > @@ -79,5 +80,5 @@ fi > > # success, all done > echo "*** done" > -rm -f $seq.full > +rm -f $seqres.full > status=0 > diff --git a/tests/generic/219 b/tests/generic/219 > index 047e285..3a8deb6 100755 > --- a/tests/generic/219 > +++ b/tests/generic/219 > @@ -26,6 +26,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -76,17 +77,17 @@ check_usage() > test_accounting() > { > echo "### some controlled buffered, direct and mmapd IO (type=$type)" > - echo "--- initiating parallel IO..." >>$seq.full > + echo "--- initiating parallel IO..." >>$seqres.full > # Small ios here because ext3 will account for indirect blocks too ... > # 48k will fit w/o indirect for 4k blocks (default blocksize) > $XFS_IO_PROG -F -c 'pwrite 0 48k' -c 'fsync' \ > - $SCRATCH_MNT/buffer >>$seq.full 2>&1 & > + $SCRATCH_MNT/buffer >>$seqres.full 2>&1 & > $XFS_IO_PROG -F -c 'pwrite 0 48k' -d \ > - $SCRATCH_MNT/direct >>$seq.full 2>&1 & > + $SCRATCH_MNT/direct >>$seqres.full 2>&1 & > $XFS_IO_PROG -F -c 't 48k' -c 'mm -rw 0 48k' -c 'mw 0 48k' -c 'ms -s' \ > - $SCRATCH_MNT/mmap >>$seq.full 2>&1 & > + $SCRATCH_MNT/mmap >>$seqres.full 2>&1 & > wait > - echo "--- completed parallel IO ($type)" >>$seq.full > + echo "--- completed parallel IO ($type)" >>$seqres.full > > for file in $SCRATCH_MNT/{buffer,direct,mmap}; do > $here/src/lstat64 $file | head -3 | _filter_scratch > @@ -101,13 +102,13 @@ test_accounting() > } > > # real QA test starts here > -rm -f $seq.full > +rm -f $seqres.full > > uid=1 > gid=2 > > umount $SCRATCH_DEV 2>/dev/null > -_scratch_mkfs >> $seq.full 2>&1 > +_scratch_mkfs >> $seqres.full 2>&1 > _scratch_mount "-o usrquota,grpquota" > quotacheck -u -g $SCRATCH_MNT 2>/dev/null > quotaon $SCRATCH_MNT 2>/dev/null > diff --git a/tests/generic/221 b/tests/generic/221 > index 9cab3c4..7fca5bb 100755 > --- a/tests/generic/221 > +++ b/tests/generic/221 > @@ -26,6 +26,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/generic/223 b/tests/generic/223 > index 8eba2d7..a6932da 100755 > --- a/tests/generic/223 > +++ b/tests/generic/223 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -47,7 +48,7 @@ _supported_os Linux > _require_scratch > _require_xfs_io_falloc > > -rm -f $seq.full > +rm -f $seqres.full > > BLOCKSIZE=4096 > > @@ -57,7 +58,7 @@ for SUNIT_K in 8 16 32 64 128; do > > echo "=== mkfs with su $SUNIT_BLOCKS blocks x 4 ===" > export MKFS_OPTIONS="" > - _scratch_mkfs_geom $SUNIT_BYTES 4 $BLOCKSIZE >> $seq.full 2>&1 > + _scratch_mkfs_geom $SUNIT_BYTES 4 $BLOCKSIZE >> $seqres.full 2>&1 > _scratch_mount > > for SIZE_MULT in 1 2 8 64 256; do > @@ -67,10 +68,10 @@ for SUNIT_K in 8 16 32 64 128; do > for FILE in 1 2 3 4; do > xfs_io -F -f -c "falloc 0 $SIZE" \ > $SCRATCH_MNT/file-$FILE-$SIZE-falloc \ > - >> $seq.full 2>&1 > + >> $seqres.full 2>&1 > xfs_io -F -f -c "pwrite 0 $SIZE" \ > $SCRATCH_MNT/file-$FILE-$SIZE-write \ > - >> $seq.full 2>&1 > + >> $seqres.full 2>&1 > src/t_stripealign $SCRATCH_MNT/file-$FILE-$SIZE-falloc \ > $SUNIT_BLOCKS | _filter_scratch > src/t_stripealign $SCRATCH_MNT/file-$FILE-$SIZE-write \ > @@ -80,7 +81,7 @@ for SUNIT_K in 8 16 32 64 128; do > > echo "=== Testing size 1g falloc on ${SUNIT_K}k stripe ===" > xfs_io -F -f -c "falloc 0 1g" \ > - $SCRATCH_MNT/file-1g-falloc >> $seq.full 2>&1 > + $SCRATCH_MNT/file-1g-falloc >> $seqres.full 2>&1 > src/t_stripealign $SCRATCH_MNT/file-1g-falloc $SUNIT_BLOCKS \ > | _filter_scratch > > @@ -88,7 +89,7 @@ for SUNIT_K in 8 16 32 64 128; do > > echo "=== Testing size 1073745920 falloc on ${SUNIT_K}k stripe ===" > xfs_io -F -f -c "falloc 0 1073745920" \ > - $SCRATCH_MNT/file-1073745920-falloc >> $seq.full 2>&1 > + $SCRATCH_MNT/file-1073745920-falloc >> $seqres.full 2>&1 > src/t_stripealign $SCRATCH_MNT/file-1073745920-falloc \ > $SUNIT_BLOCKS | _filter_scratch > > diff --git a/tests/generic/224 b/tests/generic/224 > index 23ee7c2..313d9c2 100755 > --- a/tests/generic/224 > +++ b/tests/generic/224 > @@ -28,6 +28,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -53,12 +54,12 @@ _supported_os Linux > _require_scratch > > # make a 1GB filesystem > -_scratch_mkfs_sized `expr 1024 \* 1024 \* 1024` > $seq.full 2>&1 > -_scratch_mount >> $seq.full 2>&1 > +_scratch_mkfs_sized `expr 1024 \* 1024 \* 1024` > $seqres.full 2>&1 > +_scratch_mount >> $seqres.full 2>&1 > > # set the reserved block pool to almost empty for XFS > if [ "$FSTYP" = "xfs" ]; then > - xfs_io -x -c "resblks 4" $SCRATCH_MNT >> $seq.full 2>&1 > + xfs_io -x -c "resblks 4" $SCRATCH_MNT >> $seqres.full 2>&1 > fi > > FILES=1000 > diff --git a/tests/generic/225 b/tests/generic/225 > index c09bd2a..ea44f2e 100755 > --- a/tests/generic/225 > +++ b/tests/generic/225 > @@ -22,6 +22,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -48,7 +49,7 @@ _require_scratch > _scratch_mkfs > /dev/null 2>&1 > _scratch_mount > /dev/null 2>&1 > > -rm -f $seq.full > +rm -f $seqres.full > fiemapfile=$SCRATCH_MNT/$seq.fiemap > fiemaplog=$SCRATCH_MNT/$seq.log > > diff --git a/tests/generic/226 b/tests/generic/226 > index 2179f2a..da45c9e 100755 > --- a/tests/generic/226 > +++ b/tests/generic/226 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -38,11 +39,11 @@ _supported_os Linux IRIX > _require_scratch > > # real QA test starts here > -rm -f $seq.full > +rm -f $seqres.full > > umount $SCRATCH_DEV 2>/dev/null > echo "--> mkfs 256m filesystem" > -_scratch_mkfs_sized `expr 256 \* 1024 \* 1024` >> $seq.full 2>&1 > +_scratch_mkfs_sized `expr 256 \* 1024 \* 1024` >> $seqres.full 2>&1 > _scratch_mount > > loops=16 > @@ -54,7 +55,7 @@ echo "--> $loops buffered 64m writes in a loop" > for I in `seq 1 $loops`; do > echo -n "$I " > xfs_io -F -f \ > - -c "pwrite ${buffer} 0 64m" $SCRATCH_MNT/test >> $seq.full > + -c "pwrite ${buffer} 0 64m" $SCRATCH_MNT/test >> $seqres.full > rm -f $SCRATCH_MNT/test > done > > @@ -66,7 +67,7 @@ echo "--> $loops direct 64m writes in a loop" > for I in `seq 1 $loops`; do > echo -n "$I " > xfs_io -F -f -d \ > - -c "pwrite ${buffer} 0 64m" $SCRATCH_MNT/test >> $seq.full > + -c "pwrite ${buffer} 0 64m" $SCRATCH_MNT/test >> $seqres.full > rm -f $SCRATCH_MNT/test > done > > diff --git a/tests/generic/228 b/tests/generic/228 > index 2704934..c8af133 100755 > --- a/tests/generic/228 > +++ b/tests/generic/228 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > _cleanup() > @@ -49,7 +50,7 @@ _supported_os Linux > > [ -n "$XFS_IO_PROG" ] || _notrun "xfs_io executable not found" > > -rm -f $seq.full > +rm -f $seqres.full > > # Sanity check to see if fallocate works > _require_xfs_io_falloc > diff --git a/tests/generic/230 b/tests/generic/230 > index a442857..c3db20b 100755 > --- a/tests/generic/230 > +++ b/tests/generic/230 > @@ -26,6 +26,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -58,49 +59,49 @@ test_files() > test_enforcement() > { > echo "### some buffered IO (type=$type)" > - echo "--- initiating IO..." >>$seq.full > + echo "--- initiating IO..." >>$seqres.full > # Firstly fit below block soft limit > echo "Write 900k..." > su $qa_user -c "$XFS_IO_PROG -F -c 'pwrite 0 900k' -c fsync \ > - $SCRATCH_MNT/file1" 2>&1 >>$seq.full | tee -a $seq.full > - repquota -$type $SCRATCH_MNT | grep -v "^root" >>$seq.full 2>&1 > + $SCRATCH_MNT/file1" 2>&1 >>$seqres.full | tee -a $seqres.full > + repquota -$type $SCRATCH_MNT | grep -v "^root" >>$seqres.full 2>&1 > # Secondly overcome block soft limit > echo "Rewrite 1001k..." > su $qa_user -c "$XFS_IO_PROG -F -c 'pwrite 0 1001k' -c fsync \ > - $SCRATCH_MNT/file1" 2>&1 >>$seq.full | tee -a $seq.full > - repquota -$type $SCRATCH_MNT | grep -v "^root" >>$seq.full 2>&1 > + $SCRATCH_MNT/file1" 2>&1 >>$seqres.full | tee -a $seqres.full > + repquota -$type $SCRATCH_MNT | grep -v "^root" >>$seqres.full 2>&1 > # Now try to overcome block hardlimit > echo "Write 1000k..." > su $qa_user -c "$XFS_IO_PROG -F -c 'pwrite 0 1000k' -c fsync \ > - $SCRATCH_MNT/file2" 2>&1 >>$seq.full | tee -a $seq.full > - repquota -$type $SCRATCH_MNT | grep -v "^root" >>$seq.full 2>&1 > + $SCRATCH_MNT/file2" 2>&1 >>$seqres.full | tee -a $seqres.full > + repquota -$type $SCRATCH_MNT | grep -v "^root" >>$seqres.full 2>&1 > # Now sleep for grace time and check that softlimit got enforced > sleep $((grace+1)) > echo "Write 4096..." > su $qa_user -c "$XFS_IO_PROG -F -c 'truncate 0' -c 'pwrite 0 4096' \ > - $SCRATCH_MNT/file2" 2>&1 >>$seq.full | tee -a $seq.full > - repquota -$type $SCRATCH_MNT | grep -v "^root" >>$seq.full 2>&1 > + $SCRATCH_MNT/file2" 2>&1 >>$seqres.full | tee -a $seqres.full > + repquota -$type $SCRATCH_MNT | grep -v "^root" >>$seqres.full 2>&1 > # And now the softlimit test for inodes > # First reset space limits so that we don't have problems with > # space reservations on XFS > setquota -$type $qa_user 0 0 3 5 $SCRATCH_MNT > echo "Touch 3+4" > su $qa_user -c "touch $SCRATCH_MNT/file3 $SCRATCH_MNT/file4" \ > - 2>&1 >>$seq.full | _filter_scratch | tee -a $seq.full > - repquota -$type $SCRATCH_MNT | grep -v "^root" >>$seq.full 2>&1 > + 2>&1 >>$seqres.full | _filter_scratch | tee -a $seqres.full > + repquota -$type $SCRATCH_MNT | grep -v "^root" >>$seqres.full 2>&1 > # Try to exceed inode hardlimit > echo "Touch 5+6" > su $qa_user -c "touch $SCRATCH_MNT/file5 $SCRATCH_MNT/file6" \ > - 2>&1 >>$seq.full | _filter_scratch | tee -a $seq.full > - repquota -$type $SCRATCH_MNT | grep -v "^root" >>$seq.full 2>&1 > + 2>&1 >>$seqres.full | _filter_scratch | tee -a $seqres.full > + repquota -$type $SCRATCH_MNT | grep -v "^root" >>$seqres.full 2>&1 > # Wait and check grace time enforcement > - rm -f $SCRATCH_MNT/file5 >>$seq.full 2>&1 > + rm -f $SCRATCH_MNT/file5 >>$seqres.full 2>&1 > sleep $((grace+1)) > echo "Touch 5" > - su $qa_user -c "touch $SCRATCH_MNT/file5" 2>&1 >>$seq.full | > - _filter_scratch | tee -a $seq.full > - repquota -$type $SCRATCH_MNT | grep -v "^root" >>$seq.full 2>&1 > - echo "--- completed IO ($type)" >>$seq.full > + su $qa_user -c "touch $SCRATCH_MNT/file5" 2>&1 >>$seqres.full | > + _filter_scratch | tee -a $seqres.full > + repquota -$type $SCRATCH_MNT | grep -v "^root" >>$seqres.full 2>&1 > + echo "--- completed IO ($type)" >>$seqres.full > } > > cleanup_files() > @@ -109,11 +110,11 @@ cleanup_files() > } > > # real QA test starts here > -rm -f $seq.full > +rm -f $seqres.full > > grace=2 > > -_scratch_mkfs >> $seq.full 2>&1 > +_scratch_mkfs >> $seqres.full 2>&1 > _scratch_mount "-o usrquota,grpquota" > quotacheck -u -g $SCRATCH_MNT 2>/dev/null > quotaon $SCRATCH_MNT 2>/dev/null > diff --git a/tests/generic/231 b/tests/generic/231 > index 6d8bda7..1a434d4 100755 > --- a/tests/generic/231 > +++ b/tests/generic/231 > @@ -24,6 +24,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -45,19 +46,19 @@ _fsx() > echo "=== FSX Standard Mode, Memory Mapping, $tasks Tasks ===" > for (( i = 1; i <= $tasks; i++ )); do > SEED=$RANDOM > - echo "ltp/fsx $FSX_ARGS -S $SEED $SCRATCH_MNT/fsx_file$i" >>$seq.full > + echo "ltp/fsx $FSX_ARGS -S $SEED $SCRATCH_MNT/fsx_file$i" >>$seqres.full > su $qa_user -c "ltp/fsx $FSX_ARGS -S $SEED \ > $SCRATCH_MNT/fsx_file$i" >$tmp.output$i 2>&1 & > done > > for (( i = 1; i <= $tasks; i++ )); do > if ! wait %$i; then > - cat $tmp.output$i | tee -a $seq.full > + cat $tmp.output$i | tee -a $seqres.full > wait > return 1 > fi > $XFS_IO_PROG -F -c 'fsync' $SCRATCH_MNT/fsx_file$i > - cat $tmp.output$i | tee -a $seq.full > + cat $tmp.output$i | tee -a $seqres.full > done > return 0 > } > @@ -70,7 +71,7 @@ _require_quota > _require_user > _need_to_be_root > > -_scratch_mkfs >> $seq.full 2>&1 > +_scratch_mkfs >> $seqres.full 2>&1 > _scratch_mount "-o usrquota,grpquota" > chmod 777 $SCRATCH_MNT > quotacheck -u -g $SCRATCH_MNT 2>/dev/null > diff --git a/tests/generic/232 b/tests/generic/232 > index 81cd3ca..f716ede 100755 > --- a/tests/generic/232 > +++ b/tests/generic/232 > @@ -24,6 +24,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -38,7 +39,7 @@ trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15 > > _filter_num() > { > - tee -a $here/$seq.full |\ > + tee -a $here/$seqres.full |\ > sed -e 's/[0-9][0-9]* inodes/I inodes/g' \ > -e 's/[0-9][0-9]* paths/P paths/g' \ > -e 's/seed = [0-9][0-9]*/seed = S/' > @@ -54,11 +55,11 @@ _fsstress() > count=2000 > args="-n $count -d $out -p 7" > > - echo "fsstress $args" | tee -a $here/$seq.full | sed -e "s#$out#outdir#" > - if ! $FSSTRESS_PROG $args | tee -a $here/$seq.full | _filter_num > + echo "fsstress $args" | tee -a $here/$seqres.full | sed -e "s#$out#outdir#" > + if ! $FSSTRESS_PROG $args | tee -a $here/$seqres.full | _filter_num > then > echo " fsstress $args returned $?" > - cat $tmp.out | tee -a $here/$seq.full > + cat $tmp.out | tee -a $here/$seqres.full > status=1 > fi > } > @@ -70,7 +71,7 @@ _require_scratch > _require_quota > _need_to_be_root > > -_scratch_mkfs >> $seq.full 2>&1 > +_scratch_mkfs >> $seqres.full 2>&1 > _scratch_mount "-o usrquota,grpquota" > chmod 777 $SCRATCH_MNT > quotacheck -u -g $SCRATCH_MNT 2>/dev/null > diff --git a/tests/generic/233 b/tests/generic/233 > index 52d2259..f0fde22 100755 > --- a/tests/generic/233 > +++ b/tests/generic/233 > @@ -25,6 +25,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -42,7 +43,7 @@ FSX_ARGS="-q -l $FSX_FILE_SIZE -o 65536 -S 191110531 -N 100000" > > _filter_num() > { > - tee -a $here/$seq.full |\ > + tee -a $here/$seqres.full |\ > sed -e 's/[0-9][0-9]* inodes/I inodes/g' \ > -e 's/[0-9][0-9]* paths/P paths/g' \ > -e 's/seed = [0-9][0-9]*/seed = S/' > @@ -61,11 +62,11 @@ _fsstress() > -f rename=10 -f fsync=2 -f write=15 -f dwrite=15 \ > -n $count -d $out -p 7" > > - echo "fsstress $args" | tee -a $here/$seq.full | sed -e "s#$out#outdir#" > - if ! su $qa_user -c "$FSSTRESS_PROG $args" | tee -a $here/$seq.full | _filter_num > + echo "fsstress $args" | tee -a $here/$seqres.full | sed -e "s#$out#outdir#" > + if ! su $qa_user -c "$FSSTRESS_PROG $args" | tee -a $here/$seqres.full | _filter_num > then > echo " fsstress $args returned $?" > - cat $tmp.out | tee -a $here/$seq.full > + cat $tmp.out | tee -a $here/$seqres.full > status=1 > fi > } > @@ -78,7 +79,7 @@ _require_quota > _require_user > _need_to_be_root > > -_scratch_mkfs >> $seq.full 2>&1 > +_scratch_mkfs >> $seqres.full 2>&1 > _scratch_mount "-o usrquota,grpquota" > chmod 777 $SCRATCH_MNT > quotacheck -u -g $SCRATCH_MNT 2>/dev/null > diff --git a/tests/generic/234 b/tests/generic/234 > index dbb13f6..e5c94e9 100755 > --- a/tests/generic/234 > +++ b/tests/generic/234 > @@ -26,6 +26,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -46,7 +47,7 @@ test_setting() > idmod=200000 > seed=$RANDOM > RANDOM=$seed > - echo "Starting test with procs=$procs, idmod=$idmod, and seed=$seed" >>$seq.full > + echo "Starting test with procs=$procs, idmod=$idmod, and seed=$seed" >>$seqres.full > > for (( i = 0; i < $procs; i++ )); do > ( SETUCOUNT=1; SETGCOUNT=1; SETUIDS[0]=0; SETGIDS[0]=0 > @@ -93,9 +94,9 @@ _require_quota > _need_to_be_root > > # real QA test starts here > -rm -f $seq.full > +rm -f $seqres.full > > -_scratch_mkfs >> $seq.full 2>&1 > +_scratch_mkfs >> $seqres.full 2>&1 > _scratch_mount "-o usrquota,grpquota" > quotacheck -u -g $SCRATCH_MNT 2>/dev/null > quotaon -u -g $SCRATCH_MNT 2>/dev/null > diff --git a/tests/generic/235 b/tests/generic/235 > index f4a1fce..85ed782 100755 > --- a/tests/generic/235 > +++ b/tests/generic/235 > @@ -26,6 +26,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -47,9 +48,9 @@ _require_user > _need_to_be_root > > # real QA test starts here > -rm -f $seq.full > +rm -f $seqres.full > > -_scratch_mkfs >> $seq.full 2>&1 > +_scratch_mkfs >> $seqres.full 2>&1 > _scratch_mount "-o usrquota,grpquota" > quotacheck -u -g $SCRATCH_MNT 2>/dev/null > quotaon $SCRATCH_MNT 2>/dev/null > @@ -64,12 +65,12 @@ repquota -u -g $SCRATCH_MNT | grep -v "^root" | _filter_scratch > # > # We work around it by editing the context out of mtab. Sigh. > sed -i "s#^$SCRATCH_DEV\(.*\),context=\"system_u:object_r:nfs_t:s0\"#$SCRATCH_DEV\1#" /etc/mtab > -mount -o remount,ro $SCRATCH_DEV 2>&1 | tee -a $seq.full | _filter_scratch > -touch $SCRATCH_MNT/failed 2>&1 | tee -a $seq.full | _filter_scratch > -mount -o remount,rw $SCRATCH_DEV 2>&1 | tee -a $seq.full | _filter_scratch > +mount -o remount,ro $SCRATCH_DEV 2>&1 | tee -a $seqres.full | _filter_scratch > +touch $SCRATCH_MNT/failed 2>&1 | tee -a $seqres.full | _filter_scratch > +mount -o remount,rw $SCRATCH_DEV 2>&1 | tee -a $seqres.full | _filter_scratch > > $XFS_IO_PROG -F -c 'pwrite 0 8k' -c 'fsync' \ > - $SCRATCH_MNT/testfile >>$seq.full 2>&1 > + $SCRATCH_MNT/testfile >>$seqres.full 2>&1 > repquota -u -g $SCRATCH_MNT | grep -v "^root" | _filter_scratch > > umount $SCRATCH_DEV 2>/dev/null > diff --git a/tests/generic/236 b/tests/generic/236 > index ec70cdb..016afae 100755 > --- a/tests/generic/236 > +++ b/tests/generic/236 > @@ -24,6 +24,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > _cleanup() > diff --git a/tests/generic/237 b/tests/generic/237 > index 7ebb88e..7e54aed 100755 > --- a/tests/generic/237 > +++ b/tests/generic/237 > @@ -24,6 +24,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -52,7 +53,7 @@ _supported_os Linux > > [ -x $runas ] || _notrun "$runas executable not found" > > -rm -f $seq.full > +rm -f $seqres.full > > _setup_testdir > > diff --git a/tests/generic/239 b/tests/generic/239 > index 8aa4ed0..e25a6a0 100755 > --- a/tests/generic/239 > +++ b/tests/generic/239 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/generic/240 b/tests/generic/240 > index d5f8940..77fffe8 100755 > --- a/tests/generic/240 > +++ b/tests/generic/240 > @@ -29,6 +29,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -55,7 +56,7 @@ _require_aiodio aiodio_sparse2 > echo "Silence is golden." > > # real QA test starts here > -rm -f $seq.full > +rm -f $seqres.full > > rm -f $TEST_DIR/aiodio_sparse > > diff --git a/tests/generic/241 b/tests/generic/241 > index ee572a7..b55344b 100755 > --- a/tests/generic/241 > +++ b/tests/generic/241 > @@ -22,6 +22,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -47,12 +48,12 @@ _supported_os Linux > echo "Silence is golden." > > # real QA test starts here > -rm -f $seq.full > +rm -f $seqres.full > > rm -rf $TEST_DIR/dbench > mkdir $TEST_DIR/dbench > > -dbench -t 60 -D $TEST_DIR/dbench 4 >> $seq.full > +dbench -t 60 -D $TEST_DIR/dbench 4 >> $seqres.full > > status=$? > exit > diff --git a/tests/generic/245 b/tests/generic/245 > index fb81d39..9832e92 100755 > --- a/tests/generic/245 > +++ b/tests/generic/245 > @@ -25,6 +25,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/generic/246 b/tests/generic/246 > index d82e27d..872e513 100755 > --- a/tests/generic/246 > +++ b/tests/generic/246 > @@ -26,6 +26,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/generic/247 b/tests/generic/247 > index 3a2f735..8a7e2c6 100755 > --- a/tests/generic/247 > +++ b/tests/generic/247 > @@ -22,6 +22,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/generic/248 b/tests/generic/248 > index f245c1c..7bb42a1 100755 > --- a/tests/generic/248 > +++ b/tests/generic/248 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/generic/249 b/tests/generic/249 > index e72092d..288328c 100755 > --- a/tests/generic/249 > +++ b/tests/generic/249 > @@ -22,6 +22,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -50,11 +51,11 @@ echo "Feel the serenity." > > SRC=$TEST_DIR/$seq.src > DST=$TEST_DIR/$seq.dst > -rm -f $seq.full > +rm -f $seqres.full > > -$XFS_IO_PROG -F -f -c "pwrite -S 0xa5a55a5a 0 32768k" -c fsync $SRC >> $seq.full 2>&1 > +$XFS_IO_PROG -F -f -c "pwrite -S 0xa5a55a5a 0 32768k" -c fsync $SRC >> $seqres.full 2>&1 > [ $? -ne 0 ] && _fail "xfs_io pwrite failed" > -$XFS_IO_PROG -F -f -c "sendfile -i $SRC 0 32768k" -c fsync $DST >> $seq.full 2>&1 > +$XFS_IO_PROG -F -f -c "sendfile -i $SRC 0 32768k" -c fsync $DST >> $seqres.full 2>&1 > [ $? -ne 0 ] && _fail "xfs_io sendfile failed" > > diff -q $SRC $DST > diff --git a/tests/generic/251 b/tests/generic/251 > index c5fc79e..f49f1e9 100755 > --- a/tests/generic/251 > +++ b/tests/generic/251 > @@ -25,6 +25,7 @@ > > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/generic/255 b/tests/generic/255 > index e08c726..8db0978 100755 > --- a/tests/generic/255 > +++ b/tests/generic/255 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/generic/256 b/tests/generic/256 > index 0d72795..d60584b 100755 > --- a/tests/generic/256 > +++ b/tests/generic/256 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/generic/257 b/tests/generic/257 > index b58bd56..09a8fd8 100755 > --- a/tests/generic/257 > +++ b/tests/generic/257 > @@ -22,6 +22,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -50,5 +51,5 @@ src/t_dir_offset2 $TEST_DIR/ttt > > # success, all done > echo "*** done" > -rm -f $seq.full > +rm -f $seqres.full > status=0 > diff --git a/tests/generic/258 b/tests/generic/258 > index 87817bc..ac03bb5 100755 > --- a/tests/generic/258 > +++ b/tests/generic/258 > @@ -25,6 +25,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/generic/260 b/tests/generic/260 > index 5bd3b39..032baa5 100755 > --- a/tests/generic/260 > +++ b/tests/generic/260 > @@ -23,6 +23,7 @@ > > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/generic/263 b/tests/generic/263 > index 18cd5de..3e86efc 100755 > --- a/tests/generic/263 > +++ b/tests/generic/263 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -38,16 +39,16 @@ trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15 > _supported_fs generic > _supported_os Linux > > -rm -f $seq.full > +rm -f $seqres.full > > run_fsx() > { > - echo fsx $@ | tee -a $seq.full > + echo fsx $@ | tee -a $seqres.full > args=`echo $@ | sed -e "s/ BSIZE / $bsize /g" -e "s/ PSIZE / $psize /g"` > rm -f $TEST_DIR/junk > - $here/ltp/fsx $args $TEST_DIR/junk >>$seq.full 2>&1 > + $here/ltp/fsx $args $TEST_DIR/junk >>$seqres.full 2>&1 > if [ $? -ne 0 ]; then > - cat $seq.full > + cat $seqres.full > exit 1 > fi > } > diff --git a/tests/generic/269 b/tests/generic/269 > index 5bf24af..3c5f68a 100755 > --- a/tests/generic/269 > +++ b/tests/generic/269 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -44,7 +45,7 @@ _workout() > enospc_time=2 > out=$SCRATCH_MNT/fsstress.$$ > args="-p128 -n999999999 -f setattr=1 $FSSTRESS_AVOID -d $out" > - echo "fsstress $args" >> $here/$seq.full > + echo "fsstress $args" >> $here/$seqres.full > $FSSTRESS_PROG $args > /dev/null 2>&1 & > pid=$! > echo "Run dd writers in parallel" > @@ -52,7 +53,7 @@ _workout() > do > # File will be opened with O_TRUNC each time > dd if=/dev/zero of=$SCRATCH_MNT/SPACE_CONSUMER bs=1M \ > - >> $here/$seq.full 2>&1 > + >> $here/$seqres.full 2>&1 > sleep $enospc_time > done > kill $pid > @@ -65,7 +66,7 @@ _supported_os Linux > _need_to_be_root > _require_scratch > > -_scratch_mkfs_sized $((512 * 1024 * 1024)) >> $seq.full 2>&1 > +_scratch_mkfs_sized $((512 * 1024 * 1024)) >> $seqres.full 2>&1 > _scratch_mount > > if ! _workout; then > diff --git a/tests/generic/270 b/tests/generic/270 > index c095606..8d6555b 100755 > --- a/tests/generic/270 > +++ b/tests/generic/270 > @@ -24,6 +24,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -47,7 +48,7 @@ _workout() > enospc_time=2 > out=$SCRATCH_MNT/fsstress.$$ > args="-p128 -n999999999 -f setattr=1 $FSSTRESS_AVOID -d $out" > - echo "fsstress $args" >> $here/$seq.full > + echo "fsstress $args" >> $here/$seqres.full > # Grant chown capability > cp $FSSTRESS_PROG $tmp.fsstress.bin > if [ "`whereis setcap`" == "setcap:" ]; then > @@ -64,7 +65,7 @@ _workout() > # File will be opened with O_TRUNC each time > su $qa_user -c "dd if=/dev/zero \ > of=$SCRATCH_MNT/SPACE_CONSUMER bs=1M " \ > - >> $here/$seq.full 2>&1 > + >> $here/$seqres.full 2>&1 > sleep $enospc_time > done > > @@ -80,7 +81,7 @@ _require_user > _need_to_be_root > _require_scratch > > -_scratch_mkfs_sized $((512 * 1024 * 1024)) >> $seq.full 2>&1 > +_scratch_mkfs_sized $((512 * 1024 * 1024)) >> $seqres.full 2>&1 > _scratch_mount "-o usrquota,grpquota" > chmod 777 $SCRATCH_MNT > quotacheck -u -g $SCRATCH_MNT 2>/dev/null > diff --git a/tests/generic/273 b/tests/generic/273 > index 9a40394..5a8d593 100755 > --- a/tests/generic/273 > +++ b/tests/generic/273 > @@ -24,6 +24,7 @@ > #creator > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -91,7 +92,7 @@ _porter() > exit > fi > > - cp -r $SCRATCH_MNT/origin $SCRATCH_MNT/sub_$_suffix >$seq.full 2>&1 > + cp -r $SCRATCH_MNT/origin $SCRATCH_MNT/sub_$_suffix >$seqres.full 2>&1 > if [ $? -ne 0 ] > then > echo "_porter $_suffix not complete" > @@ -129,10 +130,10 @@ echo "------------------------------" > echo "start the workload" > echo "------------------------------" > > -rm -f $seq.full > +rm -f $seqres.full > > _scratch_unmount 2>/dev/null > -_scratch_mkfs_sized $((2 * 1024 * 1024 * 1024)) >>$seq.full 2>&1 > +_scratch_mkfs_sized $((2 * 1024 * 1024 * 1024)) >>$seqres.full 2>&1 > _scratch_mount > > _do_workload > diff --git a/tests/generic/274 b/tests/generic/274 > index 9b0fb71..d5f09a4 100755 > --- a/tests/generic/274 > +++ b/tests/generic/274 > @@ -26,6 +26,7 @@ > #creator > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -53,48 +54,48 @@ echo "------------------------------" > echo "preallocation test" > echo "------------------------------" > > -rm -f $seq.full > +rm -f $seqres.full > > umount $SCRATCH_DEV 2>/dev/null > -_scratch_mkfs_sized $((1 * 1024 * 1024 * 1024)) >>$seq.full 2>&1 > +_scratch_mkfs_sized $((1 * 1024 * 1024 * 1024)) >>$seqres.full 2>&1 > _scratch_mount > > # Create a 4k file and Allocate 4M past EOF on that file > xfs_io -F -f -c "pwrite 0 4k" -c "falloc -k 4k 4m" $SCRATCH_MNT/test \ > - >>$seq.full 2>&1 || _fail "failed to create test file" > + >>$seqres.full 2>&1 || _fail "failed to create test file" > > # Fill the rest of the fs completely > -# Note, this will show ENOSPC errors in $seq.full, that's ok. > -echo "Fill fs with 1M IOs; ENOSPC expected" >> $seq.full > -dd if=/dev/zero of=$SCRATCH_MNT/tmp1 bs=1M >>$seq.full 2>&1 > -echo "Fill fs with 4K IOs; ENOSPC expected" >> $seq.full > -dd if=/dev/zero of=$SCRATCH_MNT/tmp2 bs=4K >>$seq.full 2>&1 > +# Note, this will show ENOSPC errors in $seqres.full, that's ok. > +echo "Fill fs with 1M IOs; ENOSPC expected" >> $seqres.full > +dd if=/dev/zero of=$SCRATCH_MNT/tmp1 bs=1M >>$seqres.full 2>&1 > +echo "Fill fs with 4K IOs; ENOSPC expected" >> $seqres.full > +dd if=/dev/zero of=$SCRATCH_MNT/tmp2 bs=4K >>$seqres.full 2>&1 > sync > # Last effort, use O_SYNC > -echo "Fill fs with 4K DIOs; ENOSPC expected" >> $seq.full > -dd if=/dev/zero of=$SCRATCH_MNT/tmp3 bs=4K oflag=sync >>$seq.full 2>&1 > +echo "Fill fs with 4K DIOs; ENOSPC expected" >> $seqres.full > +dd if=/dev/zero of=$SCRATCH_MNT/tmp3 bs=4K oflag=sync >>$seqres.full 2>&1 > # Save space usage info > -echo "Post-fill space:" >> $seq.full > -df $SCRATCH_MNT >>$seq.full 2>&1 > +echo "Post-fill space:" >> $seqres.full > +df $SCRATCH_MNT >>$seqres.full 2>&1 > > # Now attempt a write into all of the preallocated space - > # in a very nasty way, badly fragmenting it and then filling it in. > -echo "Fill in prealloc space; fragment at offsets:" >> $seq.full > +echo "Fill in prealloc space; fragment at offsets:" >> $seqres.full > for i in `seq 1 2 1023`; do > - echo -n "$i " >> $seq.full > + echo -n "$i " >> $seqres.full > dd if=/dev/zero of=$SCRATCH_MNT/test seek=$i bs=4K count=1 conv=notrunc \ > - >>$seq.full 2>/dev/null || _fail "failed to write to test file" > + >>$seqres.full 2>/dev/null || _fail "failed to write to test file" > done > sync > -echo >> $seq.full > -echo "Fill in prealloc space; fill holes at offsets:" >> $seq.full > +echo >> $seqres.full > +echo "Fill in prealloc space; fill holes at offsets:" >> $seqres.full > for i in `seq 2 2 1023`; do > - echo -n "$i " >> $seq.full > + echo -n "$i " >> $seqres.full > dd if=/dev/zero of=$SCRATCH_MNT/test seek=$i bs=4K count=1 conv=notrunc \ > - >>$seq.full 2>/dev/null || _fail "failed to fill test file" > + >>$seqres.full 2>/dev/null || _fail "failed to fill test file" > done > sync > -echo >> $seq.full > +echo >> $seqres.full > > echo "done" > exit > diff --git a/tests/generic/275 b/tests/generic/275 > index 5bf06e4..949ffdb 100755 > --- a/tests/generic/275 > +++ b/tests/generic/275 > @@ -25,6 +25,7 @@ > #creator > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -51,10 +52,10 @@ echo "------------------------------" > echo "write lack test" > echo "------------------------------" > > -rm -f $seq.full > +rm -f $seqres.full > > umount $SCRATCH_DEV 2>/dev/null > -_scratch_mkfs_sized $((1 * 1024 * 1024 * 1024)) >>$seq.full 2>&1 > +_scratch_mkfs_sized $((1 * 1024 * 1024 * 1024)) >>$seqres.full 2>&1 > _scratch_mount > > rm -rf $SCRATCH_MNT/* > diff --git a/tests/generic/277 b/tests/generic/277 > index 8ef809c..b85e429 100755 > --- a/tests/generic/277 > +++ b/tests/generic/277 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > status=1 # failure is the default! > diff --git a/tests/generic/280 b/tests/generic/280 > index 69c9afd..a43c211 100755 > --- a/tests/generic/280 > +++ b/tests/generic/280 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -52,7 +53,7 @@ _supported_os Linux > _supported_fs ext3 ext4 xfs > > umount $SCRATCH_DEV 2>/dev/null > -_scratch_mkfs >> $seq.full 2>&1 > +_scratch_mkfs >> $seqres.full 2>&1 > _scratch_mount "-o usrquota,grpquota" > quotacheck -u -g $SCRATCH_MNT 2>/dev/null > quotaon $SCRATCH_MNT 2>/dev/null > diff --git a/tests/shared/051 b/tests/shared/051 > index 07d5a9b..0671f83 100755 > --- a/tests/shared/051 > +++ b/tests/shared/051 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > > here=`pwd` > tmp=/tmp/$$ > @@ -73,7 +74,7 @@ _supported_os Linux > > [ -x $runas ] || _notrun "$runas executable not found" > > -rm -f $seq.full > +rm -f $seqres.full > > _setup_testdir > > diff --git a/tests/shared/068 b/tests/shared/068 > index fe4684c..c8128c5 100755 > --- a/tests/shared/068 > +++ b/tests/shared/068 > @@ -24,6 +24,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -56,13 +57,13 @@ _require_scratch > > echo "*** init FS" > > -rm -f $seq.full > +rm -f $seqres.full > umount $SCRATCH_DEV >/dev/null 2>&1 > -echo "*** MKFS ***" >>$seq.full > -echo "" >>$seq.full > -_scratch_mkfs >>$seq.full 2>&1 \ > +echo "*** MKFS ***" >>$seqres.full > +echo "" >>$seqres.full > +_scratch_mkfs >>$seqres.full 2>&1 \ > || _fail "mkfs failed" > -_scratch_mount >>$seq.full 2>&1 \ > +_scratch_mount >>$seqres.full 2>&1 \ > || _fail "mount failed" > > touch $tmp.running > @@ -90,23 +91,23 @@ touch $tmp.running > i=0 > let ITERATIONS=$ITERATIONS-1 > > -echo | tee -a $seq.full > +echo | tee -a $seqres.full > while [ $i -le $ITERATIONS ] > do > - echo "*** iteration: $i" | tee -a $seq.full > - echo "*** freezing \$SCRATCH_MNT" | tee -a $seq.full > - xfs_freeze -f "$SCRATCH_MNT" | tee -a $seq.full > + echo "*** iteration: $i" | tee -a $seqres.full > + echo "*** freezing \$SCRATCH_MNT" | tee -a $seqres.full > + xfs_freeze -f "$SCRATCH_MNT" | tee -a $seqres.full > [ $? != 0 ] && echo xfs_freeze -f "$SCRATCH_MNT" failed | \ > - tee -a $seq.full > + tee -a $seqres.full > sleep 2 > > - echo "*** thawing \$SCRATCH_MNT" | tee -a $seq.full > - xfs_freeze -u "$SCRATCH_MNT" | tee -a $seq.full > + echo "*** thawing \$SCRATCH_MNT" | tee -a $seqres.full > + xfs_freeze -u "$SCRATCH_MNT" | tee -a $seqres.full > [ $? != 0 ] && echo xfs_freeze -u "$SCRATCH_MNT" failed | \ > - tee -a $seq.full > + tee -a $seqres.full > sleep 2 > > - echo | tee -a $seq.full > + echo | tee -a $seqres.full > let i=$i+1 > done > > diff --git a/tests/shared/218 b/tests/shared/218 > index 4b46452..7c2bd53 100755 > --- a/tests/shared/218 > +++ b/tests/shared/218 > @@ -22,6 +22,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -59,36 +60,36 @@ rm -f $fragfile > > # Craft some fragmented files, defrag them, check the result. > > -echo "zero-length file:" | tee -a $seq.full > +echo "zero-length file:" | tee -a $seqres.full > touch $fragfile > _defrag $fragfile > > -echo "Sparse file (no blocks):" | tee -a $seq.full > +echo "Sparse file (no blocks):" | tee -a $seqres.full > xfs_io -F -f -c "truncate 1m" $fragfile > _defrag $fragfile > > -echo "Contiguous file:" | tee -a $seq.full > +echo "Contiguous file:" | tee -a $seqres.full > dd if=/dev/zero of=$fragfile bs=4k count=4 &>/dev/null > _defrag $fragfile > > -echo "Write backwards sync, but contiguous - should defrag to 1 extent" | tee -a $seq.full > +echo "Write backwards sync, but contiguous - should defrag to 1 extent" | tee -a $seqres.full > for I in `seq 9 -1 0`; do > dd if=/dev/zero of=$fragfile bs=4k count=1 conv=notrunc seek=$I oflag=sync &>/dev/null > done > _defrag $fragfile > > -echo "Write backwards sync leaving holes - defrag should do nothing" | tee -a $seq.full > +echo "Write backwards sync leaving holes - defrag should do nothing" | tee -a $seqres.full > for I in `seq 31 -2 0`; do > dd if=/dev/zero of=$fragfile bs=4k count=1 conv=notrunc seek=$I oflag=sync &>/dev/null > done > _defrag $fragfile > > -echo "Write forwards sync leaving holes - defrag should do nothing" | tee -a $seq.full > +echo "Write forwards sync leaving holes - defrag should do nothing" | tee -a $seqres.full > for I in `seq 0 2 31`; do > dd if=/dev/zero of=$fragfile bs=4k count=1 conv=notrunc seek=$I oflag=sync &>/dev/null > done > _defrag $fragfile > > -rm -f $seq.full > +rm -f $seqres.full > status=0 > exit > diff --git a/tests/shared/243 b/tests/shared/243 > index 6a1b6d7..4884e29 100755 > --- a/tests/shared/243 > +++ b/tests/shared/243 > @@ -42,6 +42,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -85,23 +86,23 @@ _check_ext4_eof_flag() > > # Ensure that the iflags value was parsed correctly. > if [ -z ${iflags} ]; then > - echo "iFlags value was not parsed successfully." >> $seq.full > + echo "iFlags value was not parsed successfully." >> $seqres.full > status=1 > exit ${status} > fi > > # Check if EOFBLOCKS_FL is set. > if ((${iflags} & 0x400000)); then > - echo "EOFBLOCK_FL bit is set." >> $seq.full > + echo "EOFBLOCK_FL bit is set." >> $seqres.full > bit_set=1 > else > - echo "EOFBLOCK_FL bit is not set." >> $seq.full > + echo "EOFBLOCK_FL bit is not set." >> $seqres.full > bit_set=0 > fi > > # Check current bit state to expected value. > if [ ${bit_set} -ne ${2} ]; then > - echo "Error: Current bit state incorrect." >> $seq.full > + echo "Error: Current bit state incorrect." >> $seqres.full > status=1 > exit ${status} > fi > @@ -121,14 +122,14 @@ _supported_os Linux > _require_xfs_io_falloc > > # Real QA test starts here. > -rm -f $seq.full > +rm -f $seqres.full > > # Remove any leftover files from last run. > rm -f ${TEST_DIR}/test_? > > # Begin test cases. > echo "Test 1: Fallocate 40960 bytes and write 4096 bytes (buffered io)." \ > - >> $seq.full > + >> $seqres.full > ${XFS_IO_PROG} -F -f \ > -c 'falloc -k 0 40960' \ > -c 'pwrite 0 4096' \ > @@ -136,7 +137,7 @@ ${XFS_IO_PROG} -F -f \ > _check_ext4_eof_flag test_1 ${BIT_SET} > > echo "Test 2: Fallocate 40960 bytes and write 4096 bytes (direct io)." \ > - >> $seq.full > + >> $seqres.full > ${XFS_IO_PROG} -F -f -d \ > -c 'falloc -k 0 40960' \ > -c 'pwrite 0 4096' \ > @@ -144,7 +145,7 @@ ${XFS_IO_PROG} -F -f -d \ > _check_ext4_eof_flag test_2 ${BIT_SET} > > echo "Test 3: Fallocate 40960 bytes and write 40960 bytes (buffered io)." \ > - >> $seq.full > + >> $seqres.full > ${XFS_IO_PROG} -F -f \ > -c 'falloc -k 0 40960' \ > -c 'pwrite 0 40960' \ > @@ -152,7 +153,7 @@ ${XFS_IO_PROG} -F -f \ > _check_ext4_eof_flag test_3 ${BIT_NOT_SET} > > echo "Test 4: Fallocate 40960 bytes and write 40960 bytes (direct io)." \ > - >> $seq.full > + >> $seqres.full > ${XFS_IO_PROG} -F -f -d \ > -c 'falloc -k 0 40960' \ > -c 'pwrite 0 40960' \ > @@ -160,7 +161,7 @@ ${XFS_IO_PROG} -F -f -d \ > _check_ext4_eof_flag test_4 ${BIT_NOT_SET} > > echo "Test 5: Fallocate 128k, seek 256k and write 4k block (buffered io)." \ > - >> $seq.full > + >> $seqres.full > ${XFS_IO_PROG} -F -f \ > -c 'falloc -k 0 128k' \ > -c 'pwrite 256k 4k' \ > @@ -168,7 +169,7 @@ ${XFS_IO_PROG} -F -f \ > _check_ext4_eof_flag test_5 ${BIT_NOT_SET} > > echo "Test 6: Fallocate 128k, seek to 256k and write a 4k block (direct io)." \ > - >> $seq.full > + >> $seqres.full > ${XFS_IO_PROG} -F -f -d \ > -c 'falloc -k 0 128k' \ > -c 'pwrite 256k 4k' \ > diff --git a/tests/shared/272 b/tests/shared/272 > index ed85216..f5b826f 100755 > --- a/tests/shared/272 > +++ b/tests/shared/272 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -52,8 +53,8 @@ _workout() > chattr_opt: $chattr_opt" > dd if=/dev/zero of=$SCRATCH_MNT/file.$idx \ > bs=1M count=4 $write_opt \ > - >> $seq.full 2>&1 || exit > - chattr $chattr_opt $SCRATCH_MNT/file.$idx >> $seq.full \ > + >> $seqres.full 2>&1 || exit > + chattr $chattr_opt $SCRATCH_MNT/file.$idx >> $seqres.full \ > || exit > done > done > @@ -69,9 +70,9 @@ chattr_opt: $chattr_opt" > echo "OP write_opt: $write_opt ENOSPC, \ > chattr_opt: $chattr_opt" > dd if=/dev/zero of=$SCRATCH_MNT/file.$idx \ > - bs=1M $write_opt >> $seq.full 2>&1 > + bs=1M $write_opt >> $seqres.full 2>&1 > chattr $chattr_opt $SCRATCH_MNT/file.$idx \ > - >> $seq.full || exit > + >> $seqres.full || exit > done > sync > unlink $SCRATCH_MNT/file.$idx > @@ -84,7 +85,7 @@ _supported_os Linux > _need_to_be_root > _require_scratch > > -_scratch_mkfs_sized $((64 * 1024 * 1024)) >> $seq.full 2>&1 > +_scratch_mkfs_sized $((64 * 1024 * 1024)) >> $seqres.full 2>&1 > _scratch_mount > > if ! _workout; then > diff --git a/tests/udf/098 b/tests/udf/098 > index 58d2a95..dd1e9ad 100755 > --- a/tests/udf/098 > +++ b/tests/udf/098 > @@ -30,6 +30,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -268,7 +269,7 @@ _check_udf_filesystem $SCRATCH_DEV > > # optional stuff if your test has verbose output to help resolve problems > #echo > -#echo "If failure, check $seq.full (this) and $seq.full.ok (reference)" > +#echo "If failure, check $seqres.full (this) and $seqres.full.ok (reference)" > > # success, all done > status=0 > diff --git a/tests/udf/101 b/tests/udf/101 > index 0d274e5..89507a9 100755 > --- a/tests/udf/101 > +++ b/tests/udf/101 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/udf/102 b/tests/udf/102 > index 68407a7..bf3edd2 100755 > --- a/tests/udf/102 > +++ b/tests/udf/102 > @@ -24,6 +24,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/003 b/tests/xfs/003 > index 79b6bc5..56dd852 100755 > --- a/tests/xfs/003 > +++ b/tests/xfs/003 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > # get standard environment, filters and checks > diff --git a/tests/xfs/004 b/tests/xfs/004 > index d75c3c0..fb02b95 100755 > --- a/tests/xfs/004 > +++ b/tests/xfs/004 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -39,8 +40,8 @@ trap "_cleanup" 0 1 2 3 15 > > _populate_scratch() > { > - echo "=== mkfs output ===" >>$seq.full > - _scratch_mkfs_xfs | tee -a $seq.full | _filter_mkfs 2>$tmp.mkfs > + echo "=== mkfs output ===" >>$seqres.full > + _scratch_mkfs_xfs | tee -a $seqres.full | _filter_mkfs 2>$tmp.mkfs > . $tmp.mkfs > _scratch_mount > dd if=/dev/zero of=$SCRATCH_MNT/foo count=200 bs=4096 >/dev/null 2>&1 & > @@ -64,7 +65,7 @@ _need_to_be_root > _require_scratch > _require_no_large_scratch_dev > > -rm -f $seq.full > +rm -f $seqres.full > > _populate_scratch > > @@ -72,16 +73,16 @@ _populate_scratch > > eval `$DF_PROG $SCRATCH_MNT 2>&1 \ > | tail -1 | $AWK_PROG '{ printf "blocks=%u used=%u avail=%u\n", $3, $4, $5 }'` > -echo "df gave: blocks=$blocks used=$used avail=$avail" >>$seq.full > -echo "blocksize from mkfs is '$dbsize'" >>$seq.full > +echo "df gave: blocks=$blocks used=$used avail=$avail" >>$seqres.full > +echo "blocksize from mkfs is '$dbsize'" >>$seqres.full > > xfs_db -r -c "freesp -s" $SCRATCH_DEV >$tmp.xfs_db > -echo "xfs_db for $SCRATCH_DEV" >>$seq.full > -cat $tmp.xfs_db >>$seq.full > +echo "xfs_db for $SCRATCH_DEV" >>$seqres.full > +cat $tmp.xfs_db >>$seqres.full > > eval `$XFS_IO_PROG -x -c resblks $SCRATCH_MNT 2>&1 \ > | $AWK_PROG '/available/ { printf "resblks=%u\n", $5 }'` > -echo "resblks gave: resblks=$resblks" >>$seq.full > +echo "resblks gave: resblks=$resblks" >>$seqres.full > > # check the 'blocks' field from freesp command is OK > # since 2.6.18, df does not report the 4 blocks per AG that cannot > diff --git a/tests/xfs/008 b/tests/xfs/008 > index 0dee9f5..1f66779 100755 > --- a/tests/xfs/008 > +++ b/tests/xfs/008 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/009 b/tests/xfs/009 > index 1883f15..3e74160 100755 > --- a/tests/xfs/009 > +++ b/tests/xfs/009 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/012 b/tests/xfs/012 > index 10498d5..4bd2afc 100755 > --- a/tests/xfs/012 > +++ b/tests/xfs/012 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/016 b/tests/xfs/016 > index 538ba14..fcb0637 100755 > --- a/tests/xfs/016 > +++ b/tests/xfs/016 > @@ -36,6 +36,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -72,7 +73,7 @@ _init() > if _scratch_mkfs_xfs -N -K $force_opts >/dev/null 2>&1; then > force_opts="-K $force_opts" > fi > - echo mkfs_xfs $force_opts $SCRATCH_DEV >>$seq.full > + echo mkfs_xfs $force_opts $SCRATCH_DEV >>$seqres.full > _scratch_mkfs_xfs $force_opts >$tmp.mkfs0 2>&1 > [ $? -ne 0 ] && \ > _notrun "Cannot mkfs for this test using MKFS_OPTIONS specified" > @@ -163,8 +164,8 @@ _check_corrupt() > { > f="c6c6c6c6" > echo "*** check for corruption" > - echo "expect $f..." >>$seq.full > - xfs_db -r -c "fsblock $2" -c "print" $1 | head | tee -a $seq.full | \ > + echo "expect $f..." >>$seqres.full > + xfs_db -r -c "fsblock $2" -c "print" $1 | head | tee -a $seqres.full | \ > grep -q -v "$f $f $f $f $f $f $f $f" && \ > _fail "!!! block $2 corrupted!" > } > @@ -177,7 +178,7 @@ _check_corrupt() > _supported_fs xfs > _supported_os Linux > > -rm -f $seq.full > +rm -f $seqres.full > > # mkfs sizes > log_size=2097152 > @@ -187,15 +188,15 @@ _require_scratch > _init > > block=`_after_log $SCRATCH_DEV` > -echo "fsblock after log = $block" >>$seq.full > +echo "fsblock after log = $block" >>$seqres.full > _check_corrupt $SCRATCH_DEV $block > > actual_log_size=`_log_size` > -echo "log size = $actual_log_size BB" >>$seq.full > +echo "log size = $actual_log_size BB" >>$seqres.full > head=`_log_head` > -echo "log position = $head" >>$seq.full > +echo "log position = $head" >>$seqres.full > lsunit=`_log_sunit` > -echo "log sunit = $lsunit" >>$seq.full > +echo "log sunit = $lsunit" >>$seqres.full > > # sanity checks > [ $actual_log_size -eq $log_size_bb ] || \ > @@ -206,36 +207,36 @@ echo "log sunit = $lsunit" >>$seq.full > # find how how many blocks per op for 100 ops > # ignore the fact that it will also include an unmount record etc... > # this should be small overall > -echo " lots of traffic for sampling" >>$seq.full > +echo " lots of traffic for sampling" >>$seqres.full > sample_size_ops=100 > _log_traffic $sample_size_ops > head1=`_log_head` > num_blocks=`expr $head1 - $head` > blocks_per_op=`echo "scale=3; $num_blocks / $sample_size_ops" | bc` > -echo "blocks_per_op = $blocks_per_op" >>$seq.full > +echo "blocks_per_op = $blocks_per_op" >>$seqres.full > num_expected_ops=`echo "$log_size_bb / $blocks_per_op" | bc` > -echo "num_expected_ops = $num_expected_ops" >>$seq.full > +echo "num_expected_ops = $num_expected_ops" >>$seqres.full > num_expected_to_go=`echo "$num_expected_ops - $sample_size_ops" | bc` > -echo "num_expected_to_go = $num_expected_to_go" >>$seq.full > +echo "num_expected_to_go = $num_expected_to_go" >>$seqres.full > > -echo " lots more traffic" >>$seq.full > +echo " lots more traffic" >>$seqres.full > _log_traffic $num_expected_to_go > head=`_log_head` > -echo "log position = $head" >>$seq.full > +echo "log position = $head" >>$seqres.full > > # e.g. 3891 > near_end_min=`echo "0.95 * $log_size_bb" | bc | sed 's/\..*//'` > -echo "near_end_min = $near_end_min" >>$seq.full > +echo "near_end_min = $near_end_min" >>$seqres.full > > [ $head -gt $near_end_min -a $head -lt $log_size_bb ] || \ > _fail "!!! unexpected near end log position $head" > > for c in `seq 0 20` > do > - echo " little traffic" >>$seq.full > + echo " little traffic" >>$seqres.full > _log_traffic 2 > head=`_log_head` > - echo "log position = $head" >>$seq.full > + echo "log position = $head" >>$seqres.full > _check_corrupt $SCRATCH_DEV $block > done > > diff --git a/tests/xfs/017 b/tests/xfs/017 > index 59d092d..7c29d21 100755 > --- a/tests/xfs/017 > +++ b/tests/xfs/017 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -52,13 +53,13 @@ _require_no_large_scratch_dev > > echo "*** init FS" > > -rm -f $seq.full > +rm -f $seqres.full > umount $SCRATCH_DEV >/dev/null 2>&1 > -echo "*** MKFS ***" >>$seq.full > -echo "" >>$seq.full > -_scratch_mkfs_xfs >>$seq.full 2>&1 \ > +echo "*** MKFS ***" >>$seqres.full > +echo "" >>$seqres.full > +_scratch_mkfs_xfs >>$seqres.full 2>&1 \ > || _fail "mkfs failed" > -_scratch_mount >>$seq.full 2>&1 \ > +_scratch_mount >>$seqres.full 2>&1 \ > || _fail "mount failed" > > echo "*** test" > @@ -66,21 +67,21 @@ echo "*** test" > for l in 0 1 2 3 4 > do > echo " *** test $l" > - $FSSTRESS_PROG -d $SCRATCH_MNT -n 1000 $FSSTRESS_AVOID >>$seq.full > + $FSSTRESS_PROG -d $SCRATCH_MNT -n 1000 $FSSTRESS_AVOID >>$seqres.full > > _scratch_mount -o remount,ro \ > || _fail "remount ro failed" > > - echo "" >>$seq.full > - echo "*** xfs_logprint ***" >>$seq.full > - echo "" >>$seq.full > - _scratch_xfs_logprint -tb | tee -a $seq.full \ > + echo "" >>$seqres.full > + echo "*** xfs_logprint ***" >>$seqres.full > + echo "" >>$seqres.full > + _scratch_xfs_logprint -tb | tee -a $seqres.full \ > | head | grep -q "" || _fail "DIRTY LOG" > > - echo "" >>$seq.full > - echo "*** XFS_CHECK ***" >>$seq.full > - echo "" >>$seq.full > - _scratch_xfs_check >>$seq.full 2>&1 \ > + echo "" >>$seqres.full > + echo "*** XFS_CHECK ***" >>$seqres.full > + echo "" >>$seqres.full > + _scratch_xfs_check >>$seqres.full 2>&1 \ > || _fail "xfs_check failed" > _scratch_mount -o remount,rw \ > || _fail "remount rw failed" > @@ -88,6 +89,6 @@ done > > echo "*** done" > # happy exit > -rm -f $seq.full > +rm -f $seqres.full > status=0 > exit 0 > diff --git a/tests/xfs/018 b/tests/xfs/018 > index 156cc1d..ed99f20 100755 > --- a/tests/xfs/018 > +++ b/tests/xfs/018 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -47,7 +48,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 > _supported_fs xfs > _supported_os IRIX Linux > # prelim > -rm -f $seq.full $tmp.* > +rm -f $seqres.full $tmp.* > _require_scratch > _require_v2log > > diff --git a/tests/xfs/019 b/tests/xfs/019 > index 1fb0d83..c4bb681 100755 > --- a/tests/xfs/019 > +++ b/tests/xfs/019 > @@ -23,11 +23,12 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > tmp=/tmp/$$ > -seqfull="$seq.full" > +seqfull="$seqres.full" > status=1 # failure is the default! > # get standard environment, filters and checks > . ./common.rc > diff --git a/tests/xfs/021 b/tests/xfs/021 > index 18fe40e..3cbf088 100755 > --- a/tests/xfs/021 > +++ b/tests/xfs/021 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -78,7 +79,7 @@ _supported_os Linux > _require_scratch > _require_attrs > > -rm -f $seq.full > +rm -f $seqres.full > umount $SCRATCH_DEV >/dev/null 2>&1 > > echo "*** mkfs" > @@ -124,7 +125,7 @@ echo "" > inum_2=`ls -li $testfile.2 | $AWK_PROG '{ print $1 }'` > > echo "*** unmount FS" > -umount $SCRATCH_DEV >>$seq.full 2>&1 \ > +umount $SCRATCH_DEV >>$seqres.full 2>&1 \ > || _fail "umount failed" > > echo "*** dump attributes (1)" > diff --git a/tests/xfs/022 b/tests/xfs/022 > index 962316f..0251936 100755 > --- a/tests/xfs/022 > +++ b/tests/xfs/022 > @@ -26,6 +26,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/023 b/tests/xfs/023 > index 3e7fdd2..7bb77da 100755 > --- a/tests/xfs/023 > +++ b/tests/xfs/023 > @@ -24,6 +24,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/024 b/tests/xfs/024 > index b7f1c10..ec5edc5 100755 > --- a/tests/xfs/024 > +++ b/tests/xfs/024 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -42,11 +43,11 @@ _require_tape $TAPE_DEV > _create_dumpdir_fill > # ensure file/dir timestamps precede dump timestamp > sleep 2 > -src/bstat $SCRATCH_MNT >>$here/$seq.full > +src/bstat $SCRATCH_MNT >>$here/$seqres.full > _erase_hard > _do_dump > _append_dumpdir_fill > -src/bstat $SCRATCH_MNT >>$here/$seq.full > +src/bstat $SCRATCH_MNT >>$here/$seqres.full > _erase_hard > _do_dump -l 1 > _do_restore > diff --git a/tests/xfs/025 b/tests/xfs/025 > index 4ccb5de..1e44732 100755 > --- a/tests/xfs/025 > +++ b/tests/xfs/025 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/026 b/tests/xfs/026 > index 37a23cc..04bda76 100755 > --- a/tests/xfs/026 > +++ b/tests/xfs/026 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/027 b/tests/xfs/027 > index 772705d..712378d 100755 > --- a/tests/xfs/027 > +++ b/tests/xfs/027 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/028 b/tests/xfs/028 > index 0bf042f..e70bc57 100755 > --- a/tests/xfs/028 > +++ b/tests/xfs/028 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -59,7 +60,7 @@ while [ $i -lt 5 ]; do > let i=$i+1 > done > > -echo "middate = $middate" >>$seq.full > +echo "middate = $middate" >>$seqres.full > > # > # Now do the xfsinvutil and > diff --git a/tests/xfs/029 b/tests/xfs/029 > index 70c0d10..4916c33 100755 > --- a/tests/xfs/029 > +++ b/tests/xfs/029 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/030 b/tests/xfs/030 > index 080d3fe..f9c1dfb 100755 > --- a/tests/xfs/030 > +++ b/tests/xfs/030 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/031 b/tests/xfs/031 > index 422a271..3dec089 100755 > --- a/tests/xfs/031 > +++ b/tests/xfs/031 > @@ -23,13 +23,14 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > tmp=/tmp/$$ > status=1 # failure is the default! > trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15 > -rm -f $seq.full > +rm -f $seqres.full > > # get standard environment, filters and checks > . ./common.rc > @@ -41,15 +42,15 @@ _link_out_file $seq.out > > _check_repair() > { > - echo "Repairing, round 0" >> $seq.full > - _scratch_xfs_repair 2>&1 | _filter_repair | tee -a $seq.full >$tmp.0 > + echo "Repairing, round 0" >> $seqres.full > + _scratch_xfs_repair 2>&1 | _filter_repair | tee -a $seqres.full >$tmp.0 > for i in 1 2 3 4 > do > - echo "Repairing, iteration $i" | tee -a $seq.full > + echo "Repairing, iteration $i" | tee -a $seqres.full > _scratch_xfs_repair 2>&1 | _filter_repair >$tmp.$i > - diff $tmp.0 $tmp.$i >> $seq.full > + diff $tmp.0 $tmp.$i >> $seqres.full > if [ $? -ne 0 ]; then > - echo "ERROR: repair round $i differs to round 0 (see $seq.full)" | tee -a $seq.full > + echo "ERROR: repair round $i differs to round 0 (see $seqres.full)" | tee -a $seqres.full > break > fi > # echo all interesting stuff... > diff --git a/tests/xfs/032 b/tests/xfs/032 > index ad1909d..9836bcc 100755 > --- a/tests/xfs/032 > +++ b/tests/xfs/032 > @@ -23,13 +23,14 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > tmp=/tmp/$$ > status=1 # failure is the default! > trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15 > -rm -f $seq.full > +rm -f $seqres.full > > # get standard environment, filters and checks > . ./common.rc > @@ -69,18 +70,18 @@ do > src/devzero -n 20 $SCRATCH_DEV >/dev/null > > # create a filesystem of this type > - echo "=== Creating $fs filesystem..." >>$seq.full > - echo " ( $preop mkfs -t $fs $preargs $SCRATCH_DEV $postargs )" >>$seq.full > - eval $preop mkfs -t $fs $preargs $SCRATCH_DEV $postargs >>$seq.full 2>&1 > + echo "=== Creating $fs filesystem..." >>$seqres.full > + echo " ( $preop mkfs -t $fs $preargs $SCRATCH_DEV $postargs )" >>$seqres.full > + eval $preop mkfs -t $fs $preargs $SCRATCH_DEV $postargs >>$seqres.full 2>&1 > > if [ $? -eq 0 ] ; then > # next, ensure we don't overwrite it > - echo "=== Attempting XFS overwrite of $fs..." >>$seq.full > - /sbin/mkfs.xfs $SCRATCH_DEV >>$seq.full 2>&1 > + echo "=== Attempting XFS overwrite of $fs..." >>$seqres.full > + /sbin/mkfs.xfs $SCRATCH_DEV >>$seqres.full 2>&1 > > [ $? -eq 0 ] && echo "Failed - overwrote fs type ${fs}!" > else > - echo "mkfs of type ${fs} failed" >>$seq.full > + echo "mkfs of type ${fs} failed" >>$seqres.full > fi > done > > diff --git a/tests/xfs/033 b/tests/xfs/033 > index dc5a32d..1540a1c 100755 > --- a/tests/xfs/033 > +++ b/tests/xfs/033 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/034 b/tests/xfs/034 > index 27f3f22..372dead 100755 > --- a/tests/xfs/034 > +++ b/tests/xfs/034 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -50,13 +51,13 @@ _require_scratch > > echo "*** init FS" > > -rm -f $seq.full > +rm -f $seqres.full > umount $SCRATCH_DEV >/dev/null 2>&1 > -echo "*** MKFS ***" >>$seq.full > -echo "" >>$seq.full > -_scratch_mkfs_xfs >>$seq.full 2>&1 \ > +echo "*** MKFS ***" >>$seqres.full > +echo "" >>$seqres.full > +_scratch_mkfs_xfs >>$seqres.full 2>&1 \ > || _fail "mkfs failed" > -_scratch_mount >>$seq.full 2>&1 \ > +_scratch_mount >>$seqres.full 2>&1 \ > || _fail "mount failed" > > echo "*** test" > @@ -69,7 +70,7 @@ then > exit > fi > > -if ! src/xfsctl $SCRATCH_MNT $SCRATCH_MNT/fish >>$seq.full 2>&1 > +if ! src/xfsctl $SCRATCH_MNT $SCRATCH_MNT/fish >>$seqres.full 2>&1 > then > echo "!!! failed to run xfsctl test program" > exit > diff --git a/tests/xfs/035 b/tests/xfs/035 > index b2fc417..cd743f6 100755 > --- a/tests/xfs/035 > +++ b/tests/xfs/035 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/036 b/tests/xfs/036 > index e9bb411..5a7ee01 100755 > --- a/tests/xfs/036 > +++ b/tests/xfs/036 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/037 b/tests/xfs/037 > index e2e71c5..ca10429 100755 > --- a/tests/xfs/037 > +++ b/tests/xfs/037 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/038 b/tests/xfs/038 > index b62a4c9..64d2428 100755 > --- a/tests/xfs/038 > +++ b/tests/xfs/038 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/039 b/tests/xfs/039 > index 428e8bb..21574d6 100755 > --- a/tests/xfs/039 > +++ b/tests/xfs/039 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/040 b/tests/xfs/040 > index 0021c22..119a770 100755 > --- a/tests/xfs/040 > +++ b/tests/xfs/040 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -49,9 +50,9 @@ trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15 > # real QA test starts here > cd "$WORKAREA/xfstests" > echo Silence is golden. > -perl tools/srcdiff -q >$seq.full > -if ! diff $seq.full $seq.good >/dev/null; then > - echo "FAILED: srcdiff output $seq.full differs to $seq.good" > +perl tools/srcdiff -q >$seqres.full > +if ! diff $seqres.full $seq.good >/dev/null; then > + echo "FAILED: srcdiff output $seqres.full differs to $seq.good" > exit 1 > fi > > diff --git a/tests/xfs/041 b/tests/xfs/041 > index a9a9a23..dd50301 100755 > --- a/tests/xfs/041 > +++ b/tests/xfs/041 > @@ -25,6 +25,7 @@ > set +x > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -59,7 +60,7 @@ _fill() > } > > _do_die_on_error=message_only > -rm -f $seq.full > +rm -f $seqres.full > agsize=32 > echo -n "Make $agsize megabyte filesystem on SCRATCH_DEV and mount... " > _scratch_mkfs_xfs -dsize=${agsize}m,agcount=1 2>&1 >/dev/null || _fail "mkfs failed" > @@ -84,7 +85,7 @@ do > echo "done" > echo -n "Check files... " > if ! _do "src/fill2fs_check $tmp.manifest"; then > - echo "fail (see $seq.full)" > + echo "fail (see $seqres.full)" > _do "cat $tmp.manifest" > _do "ls -altrR $SCRATCH_MNT" > _do "dd if=$SCRATCH_DEV bs=4096 count=$grow_size | gzip -9 > $seq.fsimage.gz" > diff --git a/tests/xfs/042 b/tests/xfs/042 > index 15fa5dc..1127b46 100755 > --- a/tests/xfs/042 > +++ b/tests/xfs/042 > @@ -26,6 +26,7 @@ > set +x > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -86,7 +87,7 @@ _cull_files() > # create 3 minimum sized (16Mb) allocation groups > # xfs_repair is going to need three to verify the superblock > > -rm -f $seq.full > +rm -f $seqres.full > _do_die_on_error=message_only > > echo -n "Make a 48 megabyte filesystem on SCRATCH_DEV and mount... " > @@ -147,7 +148,7 @@ echo -n "Check fill file... " > _do "sum $SCRATCH_MNT/fill >$tmp.fillsum2" > if ! _do "diff $tmp.fillsum1 $tmp.fillsum2"; then > echo "fail" > - echo "Fill file is corrupt/missing after fsr. Test failed see $seq.full" > + echo "Fill file is corrupt/missing after fsr. Test failed see $seqres.full" > status=1; exit > fi > echo "done" > @@ -157,7 +158,7 @@ echo -n "Check large file... " > _do "sum $SCRATCH_MNT/fragmented >$tmp.sum2" > if ! _do "diff $tmp.sum1 $tmp.sum2"; then > echo "fail" > - echo "File is corrupt/missing after fsr. Test failed see $seq.full" > + echo "File is corrupt/missing after fsr. Test failed see $seqres.full" > status=1; exit > fi > echo "done" > diff --git a/tests/xfs/043 b/tests/xfs/043 > index ef92c0a..75c2d38 100755 > --- a/tests/xfs/043 > +++ b/tests/xfs/043 > @@ -25,6 +25,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/044 b/tests/xfs/044 > index d0d8bd8..3b330b9 100755 > --- a/tests/xfs/044 > +++ b/tests/xfs/044 > @@ -27,6 +27,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/045 b/tests/xfs/045 > index c20e3a8..9d07570 100755 > --- a/tests/xfs/045 > +++ b/tests/xfs/045 > @@ -24,6 +24,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/046 b/tests/xfs/046 > index fb83b7a..d5f4fca 100755 > --- a/tests/xfs/046 > +++ b/tests/xfs/046 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/047 b/tests/xfs/047 > index 7c5e896..18960ea 100755 > --- a/tests/xfs/047 > +++ b/tests/xfs/047 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -59,7 +60,7 @@ while [ $i -lt 5 ]; do > let i=$i+1 > done > > -echo "middate = $middate" >>$seq.full > +echo "middate = $middate" >>$seqres.full > > # Only say No to 1st question to prune > cat >$tmp.input < diff --git a/tests/xfs/048 b/tests/xfs/048 > index 6139361..a39ec66 100755 > --- a/tests/xfs/048 > +++ b/tests/xfs/048 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/049 b/tests/xfs/049 > index 0a6e69c..e2d1293 100755 > --- a/tests/xfs/049 > +++ b/tests/xfs/049 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > _cleanup() > @@ -32,10 +33,10 @@ _cleanup() > umount -d $SCRATCH_MNT/test > /dev/null 2>&1 > rm -f $tmp.* > > - if [ -w $seq.full ] > + if [ -w $seqres.full ] > then > - echo "--- mounts at end (after cleanup)" >> $seq.full > - mount >> $seq.full > + echo "--- mounts at end (after cleanup)" >> $seqres.full > + mount >> $seqres.full > fi > } > > @@ -55,7 +56,7 @@ _supported_os Linux > _log() > { > echo "--- $*" > - echo "--- $*" >> $seq.full > + echo "--- $*" >> $seqres.full > } > > _require_nonexternal > @@ -64,75 +65,75 @@ _require_no_large_scratch_dev > _require_loop > _require_ext2 > > -rm -f $seq.full > +rm -f $seqres.full > > -echo "(dev=$SCRATCH_DEV, mount=$SCRATCH_MNT)" >> $seq.full > -echo "" >> $seq.full > +echo "(dev=$SCRATCH_DEV, mount=$SCRATCH_MNT)" >> $seqres.full > +echo "" >> $seqres.full > > -echo "--- mounts" >> $seq.full > -mount >> $seq.full > +echo "--- mounts" >> $seqres.full > +mount >> $seqres.full > > _log "Create ext2 fs on scratch" > -mkfs -t ext2 -F $SCRATCH_DEV >> $seq.full 2>&1 \ > +mkfs -t ext2 -F $SCRATCH_DEV >> $seqres.full 2>&1 \ > || _fail "!!! failed to mkfs ext2" > > _log "Mount ext2 fs on scratch" > -mount -t ext2 $SCRATCH_DEV $SCRATCH_MNT >> $seq.full 2>&1 \ > +mount -t ext2 $SCRATCH_DEV $SCRATCH_MNT >> $seqres.full 2>&1 \ > || _fail "!!! failed to mount" > > _log "Create xfs fs in file on scratch" > /sbin/mkfs.xfs -f -dfile,name=$SCRATCH_MNT/test.xfs,size=40m \ > - >> $seq.full 2>&1 \ > + >> $seqres.full 2>&1 \ > || _fail "!!! failed to mkfs xfs" > > _log "Make mount points" > -mkdir $SCRATCH_MNT/test $SCRATCH_MNT/test2 >> $seq.full 2>&1 \ > +mkdir $SCRATCH_MNT/test $SCRATCH_MNT/test2 >> $seqres.full 2>&1 \ > || _fail "!!! failed to make mount points" > > _log "Mount xfs via loop" > -mount -t xfs -o loop $SCRATCH_MNT/test.xfs $SCRATCH_MNT/test >> $seq.full 2>&1 \ > +mount -t xfs -o loop $SCRATCH_MNT/test.xfs $SCRATCH_MNT/test >> $seqres.full 2>&1 \ > || _fail "!!! failed to loop mount xfs" > > _log "stress" > -$FSSTRESS_PROG -d $SCRATCH_MNT/test -n 1000 $FSSTRESS_AVOID >> $seq.full 2>&1 \ > +$FSSTRESS_PROG -d $SCRATCH_MNT/test -n 1000 $FSSTRESS_AVOID >> $seqres.full 2>&1 \ > || _fail "!!! stress failed" > > _log "clean" > -rm -rf $SCRATCH_MNT/test/* >> $seq.full 2>&1 \ > +rm -rf $SCRATCH_MNT/test/* >> $seqres.full 2>&1 \ > || _fail "!!! clean failed" > > _log "create file for ext2 fs" > -dd if=/dev/zero of=$SCRATCH_MNT/test/test.ext2 bs=1024 count=10240 >> $seq.full 2>&1 \ > +dd if=/dev/zero of=$SCRATCH_MNT/test/test.ext2 bs=1024 count=10240 >> $seqres.full 2>&1 \ > || _fail "!!! create file failed" > > _log "Create ext2 fs in file on looped xfs" > -echo y | mkfs -t ext2 $SCRATCH_MNT/test/test.ext2 >> $seq.full 2>&1 \ > +echo y | mkfs -t ext2 $SCRATCH_MNT/test/test.ext2 >> $seqres.full 2>&1 \ > || _fail "!!! failed to mkfs ext2 on xfs" > > _log "Mount ext2 on xfs via loop" > -mount -t ext2 -o loop $SCRATCH_MNT/test/test.ext2 $SCRATCH_MNT/test2 >> $seq.full 2>&1 \ > +mount -t ext2 -o loop $SCRATCH_MNT/test/test.ext2 $SCRATCH_MNT/test2 >> $seqres.full 2>&1 \ > || _fail "!!! failed to loop mount xfs" > > _log "stress ext2 on xfs via loop" > -$FSSTRESS_PROG -d $SCRATCH_MNT/test2 -n 1000 $FSSTRESS_AVOID >> $seq.full 2>&1 \ > +$FSSTRESS_PROG -d $SCRATCH_MNT/test2 -n 1000 $FSSTRESS_AVOID >> $seqres.full 2>&1 \ > || _fail "!!! stress ext2 failed" > > _log "clean" > -rm -rf $SCRATCH_MNT/test/* >> $seq.full 2>&1 \ > +rm -rf $SCRATCH_MNT/test/* >> $seqres.full 2>&1 \ > || _fail "!!! clean failed" > > _log "umount ext2 on xfs" > -umount -d $SCRATCH_MNT/test2 >> $seq.full 2>&1 \ > +umount -d $SCRATCH_MNT/test2 >> $seqres.full 2>&1 \ > || _fail "!!! umount ext2 failed" > > _log "umount xfs" > -umount -d $SCRATCH_MNT/test >> $seq.full 2>&1 \ > +umount -d $SCRATCH_MNT/test >> $seqres.full 2>&1 \ > || _fail "!!! umount xfs failed" > > -echo "--- mounts at end (before cleanup)" >> $seq.full > -mount >> $seq.full > +echo "--- mounts at end (before cleanup)" >> $seqres.full > +mount >> $seqres.full > > -rm -f $seq.full > +rm -f $seqres.full > # success, all done > status=0 > exit > diff --git a/tests/xfs/050 b/tests/xfs/050 > index 6a66032..d402cbf 100755 > --- a/tests/xfs/050 > +++ b/tests/xfs/050 > @@ -24,6 +24,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -49,8 +50,8 @@ _supported_fs xfs > _supported_os Linux IRIX > > > -cp /dev/null $seq.full > -chmod a+rwx $seq.full # arbitrary users will write here > +cp /dev/null $seqres.full > +chmod a+rwx $seqres.full # arbitrary users will write here > > _require_scratch > _require_xfs_quota > @@ -94,7 +95,7 @@ _filter_and_check_blks() > _exercise() > { > _scratch_mkfs_xfs | _filter_mkfs 2>$tmp.mkfs > - cat $tmp.mkfs >>$seq.full > + cat $tmp.mkfs >>$seqres.full > > # keep the blocksize and data size for dd later > . $tmp.mkfs > @@ -111,20 +112,20 @@ _exercise() > > _qsetup > > - echo "Using output from '" `ls -l $seq.out` "'" >>$seq.full > - echo "and using type=$type id=$id" >>$seq.full > + echo "Using output from '" `ls -l $seq.out` "'" >>$seqres.full > + echo "and using type=$type id=$id" >>$seqres.full > > echo > - echo "*** report no quota settings" | tee -a $seq.full > + echo "*** report no quota settings" | tee -a $seqres.full > xfs_quota -D $tmp.projects -P $tmp.projid -x \ > -c "repquota -birnN -$type" $SCRATCH_DEV | > _filter_report | LC_COLLATE=POSIX sort -ru > > echo > - echo "*** report initial settings" | tee -a $seq.full > + echo "*** report initial settings" | tee -a $seqres.full > _file_as_id $SCRATCH_MNT/initme $id $type 1024 0 > - echo "ls -l $SCRATCH_MNT" >>$seq.full > - ls -l $SCRATCH_MNT >>$seq.full > + echo "ls -l $SCRATCH_MNT" >>$seqres.full > + ls -l $SCRATCH_MNT >>$seqres.full > xfs_quota -D $tmp.projects -P $temp.projid -x \ > -c "limit -$type bsoft=${bsoft}k bhard=${bhard}k $id" \ > -c "limit -$type isoft=$isoft ihard=$ihard $id" \ > @@ -134,7 +135,7 @@ _exercise() > _filter_report | LC_COLLATE=POSIX sort -ru > > echo > - echo "*** push past the soft inode limit" | tee -a $seq.full > + echo "*** push past the soft inode limit" | tee -a $seqres.full > _file_as_id $SCRATCH_MNT/softie1 $id $type 1024 0 > _file_as_id $SCRATCH_MNT/softie2 $id $type 1024 0 > _qmount > @@ -143,7 +144,7 @@ _exercise() > _filter_report | LC_COLLATE=POSIX sort -ru > > echo > - echo "*** push past the soft block limit" | tee -a $seq.full > + echo "*** push past the soft block limit" | tee -a $seqres.full > _file_as_id $SCRATCH_MNT/softie $id $type 1024 140 > _qmount > xfs_quota -D $tmp.projects -P $tmp.projid -x \ > @@ -152,7 +153,7 @@ _exercise() > > echo > # Note: for quota accounting (not enforcement), EDQUOT is not expected > - echo "*** push past the hard inode limit (expect EDQUOT)" | tee -a $seq.full > + echo "*** push past the hard inode limit (expect EDQUOT)" | tee -a $seqres.full > for i in 1 2 3 4 5 6 7 8 9 10 11 12 > do > _file_as_id $SCRATCH_MNT/hard$i $id $type 1024 0 > @@ -164,10 +165,10 @@ _exercise() > > echo > # Note: for quota accounting (not enforcement), EDQUOT is not expected > - echo "*** push past the hard block limit (expect EDQUOT)" | tee -a $seq.full > + echo "*** push past the hard block limit (expect EDQUOT)" | tee -a $seqres.full > _file_as_id $SCRATCH_MNT/softie $id $type 1024 540 > - echo "ls -l $SCRATCH_MNT" >>$seq.full > - ls -l $SCRATCH_MNT >>$seq.full > + echo "ls -l $SCRATCH_MNT" >>$seqres.full > + ls -l $SCRATCH_MNT >>$seqres.full > _qmount > xfs_quota -D $tmp.projects -P $tmp.projid -x \ > -c "repquota -birnN -$type" $SCRATCH_DEV | > diff --git a/tests/xfs/052 b/tests/xfs/052 > index 01d5469..2abd78d 100755 > --- a/tests/xfs/052 > +++ b/tests/xfs/052 > @@ -26,6 +26,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -49,7 +50,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 > _supported_fs xfs > _supported_os IRIX Linux > > -rm -f $seq.full > +rm -f $seqres.full > > _require_scratch > _require_xfs_quota > @@ -59,8 +60,8 @@ _require_nobody > _qmount_option uquota > > _scratch_mkfs_xfs | _filter_mkfs 2>$tmp.mkfs > -cat $tmp.mkfs >>$seq.full > -chmod a+w $seq.full # arbitrary users will write here > +cat $tmp.mkfs >>$seqres.full > +chmod a+w $seqres.full # arbitrary users will write here > > # keep the blocksize from mkfs ($dbsize) > . $tmp.mkfs > @@ -94,7 +95,7 @@ xfs_quota -x \ > > # cross check blks, softblks, hardblks <-> quota, xfs_db > xfs_quota -c "quota -$type -birnN $id" $SCRATCH_DEV | > - tr -d '\n' | tr -s '[:space:]' | tee -a $seq.full | > + tr -d '\n' | tr -s '[:space:]' | tee -a $seqres.full | > perl -ne 'if (m[^\s*'$SCRATCH_DEV'\s+(\d+)\s+(\d+)\s+(\d+)]) { > print "used_blocks=", $1, "\n"; > print "soft_blocks=", $2, "\n"; > @@ -102,14 +103,14 @@ xfs_quota -c "quota -$type -birnN $id" $SCRATCH_DEV | > $next = 0; > }' | LC_COLLATE=POSIX sort >$tmp.quota > > -echo ===quota output >> $seq.full > -cat $tmp.quota >> $seq.full > +echo ===quota output >> $seqres.full > +cat $tmp.quota >> $seqres.full > [ ! -s $tmp.quota ] && echo "warning: quota output file is empty" > > umount $SCRATCH_MNT > > # note - does (insitu) conversion from fs blocks to 1K blocks > -xfs_db -rc "dquot -$type $id" -c p $SCRATCH_DEV | tee -a $seq.full | perl -ne ' > +xfs_db -rc "dquot -$type $id" -c p $SCRATCH_DEV | tee -a $seqres.full | perl -ne ' > if (/^diskdq.bcount = (\d+)$/) { > print "used_blocks=", $1 * '$dbsize' / 1024, "\n"; > } > @@ -120,8 +121,8 @@ xfs_db -rc "dquot -$type $id" -c p $SCRATCH_DEV | tee -a $seq.full | perl -ne ' > print "soft_blocks=", $1 * '$dbsize' / 1024, "\n"; > }' | LC_COLLATE=POSIX sort >$tmp.xfs_db > > -echo ===xfs_db output >> $seq.full > -cat $tmp.xfs_db >> $seq.full > +echo ===xfs_db output >> $seqres.full > +cat $tmp.xfs_db >> $seqres.full > [ ! -s $tmp.xfs_db ] && echo "warning: xfs_db output file is empty" > > echo Comparing out of xfs_quota and xfs_db > diff --git a/tests/xfs/054 b/tests/xfs/054 > index 1ce6180..97590e8 100755 > --- a/tests/xfs/054 > +++ b/tests/xfs/054 > @@ -24,6 +24,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -46,8 +47,8 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 > _supported_fs xfs > _supported_os Linux IRIX > > -cp /dev/null $seq.full > -chmod ugo+rwx $seq.full > +cp /dev/null $seqres.full > +chmod ugo+rwx $seqres.full > > _require_scratch > _require_xfs_quota > @@ -98,7 +99,7 @@ _exercise() > umount $SCRATCH_MNT 2>/dev/null > } > > -_scratch_mkfs_xfs >> $seq.full 2>&1 || _fail "mkfs failed!" > +_scratch_mkfs_xfs >> $seqres.full 2>&1 || _fail "mkfs failed!" > > _qmount_option "uquota,gquota" > _qmount > diff --git a/tests/xfs/055 b/tests/xfs/055 > index 965b43a..1804727 100755 > --- a/tests/xfs/055 > +++ b/tests/xfs/055 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/056 b/tests/xfs/056 > index be65bfb..8ab61f9 100755 > --- a/tests/xfs/056 > +++ b/tests/xfs/056 > @@ -24,6 +24,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/057 b/tests/xfs/057 > index faa4776..fd856d7 100755 > --- a/tests/xfs/057 > +++ b/tests/xfs/057 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/058 b/tests/xfs/058 > index dfce43b..c800286 100755 > --- a/tests/xfs/058 > +++ b/tests/xfs/058 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/059 b/tests/xfs/059 > index a2a07c9..c26fa4d 100755 > --- a/tests/xfs/059 > +++ b/tests/xfs/059 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/060 b/tests/xfs/060 > index f0d9870..6adce78 100755 > --- a/tests/xfs/060 > +++ b/tests/xfs/060 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/061 b/tests/xfs/061 > index fa98085..e5a8413 100755 > --- a/tests/xfs/061 > +++ b/tests/xfs/061 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/063 b/tests/xfs/063 > index cdaf524..a2ee188 100755 > --- a/tests/xfs/063 > +++ b/tests/xfs/063 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/064 b/tests/xfs/064 > index c7e727c..9ba542e 100755 > --- a/tests/xfs/064 > +++ b/tests/xfs/064 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -66,14 +67,14 @@ while [ $i -le 9 ]; do > _stable_fs > sleep 2 > > - echo "********* level $i ***********" >>$seq.full > - date >>$seq.full > + echo "********* level $i ***********" >>$seqres.full > + date >>$seqres.full > find $SCRATCH_MNT -exec $here/src/lstat64 {} \; | sed 's/(00.*)//' >$tmp.dates.$i > if [ $i -gt 0 ]; then > let level_1=$i-1 > - diff -c $tmp.dates.$level_1 $tmp.dates.$i >>$seq.full > + diff -c $tmp.dates.$level_1 $tmp.dates.$i >>$seqres.full > else > - cat $tmp.dates.$i >>$seq.full > + cat $tmp.dates.$i >>$seqres.full > fi > > _do_dump_file -f $tmp.df.level$i -l $i > diff --git a/tests/xfs/065 b/tests/xfs/065 > index 12f2ac9..ef1d10f 100755 > --- a/tests/xfs/065 > +++ b/tests/xfs/065 > @@ -26,6 +26,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/066 b/tests/xfs/066 > index 7a68f79..8709a2b 100755 > --- a/tests/xfs/066 > +++ b/tests/xfs/066 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/067 b/tests/xfs/067 > index baaed77..87b3cc9 100755 > --- a/tests/xfs/067 > +++ b/tests/xfs/067 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -46,14 +47,14 @@ _require_scratch > > # set up fs for 1K inodes > isize=0 > -_scratch_mkfs_xfs | _filter_mkfs >$seq.full 2>$tmp.mkfs > +_scratch_mkfs_xfs | _filter_mkfs >$seqres.full 2>$tmp.mkfs > [ $? -eq 0 ] && source $tmp.mkfs > if [ "$isize" -lt 1024 ]; then > - _scratch_mkfs_xfs -i size=1024 >>$here/$seq.full \ > + _scratch_mkfs_xfs -i size=1024 >>$here/$seqres.full \ > || _notrun "Cannot mkfs for this test using MKFS_OPTIONS specified" > fi > -_scratch_mount >>$here/$seq.full || _fail "mount failed" > -xfs_info $SCRATCH_MNT >>$here/$seq.full > +_scratch_mount >>$here/$seqres.full || _fail "mount failed" > +xfs_info $SCRATCH_MNT >>$here/$seqres.full > cd $SCRATCH_MNT > > echo "" > diff --git a/tests/xfs/071 b/tests/xfs/071 > index c135d1a..b22dd6d 100755 > --- a/tests/xfs/071 > +++ b/tests/xfs/071 > @@ -22,8 +22,9 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > -rm -f $seq.full > +rm -f $seqres.full > > here=`pwd` > tmp=/tmp/$$ > @@ -81,19 +82,19 @@ write_block() > [ `$direct` ] && flags=-d > > echo "Writing $bytes bytes, offset is $words (direct=$direct)" | _filter_io > - echo "Writing $bytes bytes at $location $words (direct=$direct)" >>$seq.full > + echo "Writing $bytes bytes at $location $words (direct=$direct)" >>$seqres.full > $XFS_IO_PROG -c "pwrite $offset 512" $flags $SCRATCH_MNT/$seq \ > - 2>&1 | _filter_off $offset | tee -a $seq.full | _filter_pwrite > - xfs_bmap -v $SCRATCH_MNT/$seq >>$seq.full > + 2>&1 | _filter_off $offset | tee -a $seqres.full | _filter_pwrite > + xfs_bmap -v $SCRATCH_MNT/$seq >>$seqres.full > > echo "Reading $bytes bytes (direct=$direct)" | _filter_io > - echo "Reading $bytes bytes at $location (direct=$direct)" >>$seq.full > + echo "Reading $bytes bytes at $location (direct=$direct)" >>$seqres.full > $XFS_IO_PROG -c "pread $offset $bytes" $flags $SCRATCH_MNT/$seq \ > - 2>&1 | _filter_off $offset | tee -a $seq.full | _filter_pread > + 2>&1 | _filter_off $offset | tee -a $seqres.full | _filter_pread > > - $XFS_IO_PROG -c "pread -v $offset $bytes" $flags $SCRATCH_MNT/$seq >>$seq.full 2>&1 > + $XFS_IO_PROG -c "pread -v $offset $bytes" $flags $SCRATCH_MNT/$seq >>$seqres.full 2>&1 > > - echo | tee -a $seq.full > + echo | tee -a $seqres.full > } > > # real QA test starts here > diff --git a/tests/xfs/072 b/tests/xfs/072 > index 930a983..d5bec3c 100755 > --- a/tests/xfs/072 > +++ b/tests/xfs/072 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > _cleanup() > @@ -49,7 +50,7 @@ _supported_os IRIX Linux > > _require_scratch > > -rm -f $seq.full > +rm -f $seqres.full > umount $SCRATCH_DEV >/dev/null 2>&1 > > _scratch_mkfs_xfs >/dev/null || _fail "mkfs failed" > diff --git a/tests/xfs/073 b/tests/xfs/073 > index d19c8f5..336cb89 100755 > --- a/tests/xfs/073 > +++ b/tests/xfs/073 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/078 b/tests/xfs/078 > index 901723e..df4fc6f 100755 > --- a/tests/xfs/078 > +++ b/tests/xfs/078 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/080 b/tests/xfs/080 > index 3243fe1..fb5b6a6 100755 > --- a/tests/xfs/080 > +++ b/tests/xfs/080 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/081 b/tests/xfs/081 > index f0ee819..44018bc 100755 > --- a/tests/xfs/081 > +++ b/tests/xfs/081 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -50,7 +51,7 @@ _cleanup() > trap "_cleanup; exit \$status" 0 1 2 3 15 > > # prelim > -rm -f $seq.full $tmp.* > +rm -f $seqres.full $tmp.* > _require_scratch > _require_xfs_quota > _require_v2log > diff --git a/tests/xfs/082 b/tests/xfs/082 > index e21a793..652f362 100755 > --- a/tests/xfs/082 > +++ b/tests/xfs/082 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -48,7 +49,7 @@ _supported_fs xfs > _supported_os IRIX Linux > > # prelim > -rm -f $seq.full $tmp.* > +rm -f $seqres.full $tmp.* > _require_scratch > _require_v2log > > diff --git a/tests/xfs/084 b/tests/xfs/084 > index ba5743a..46aa837 100755 > --- a/tests/xfs/084 > +++ b/tests/xfs/084 > @@ -24,6 +24,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/085 b/tests/xfs/085 > index 44123ad..a02c42d 100755 > --- a/tests/xfs/085 > +++ b/tests/xfs/085 > @@ -26,6 +26,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -42,24 +43,24 @@ trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15 > _supported_fs xfs > _supported_os IRIX Linux > > -rm -f $seq.full > +rm -f $seqres.full > rm -f $tmp.log > > _require_scratch > > echo "mkfs" > -_scratch_mkfs_xfs >>$seq.full 2>&1 \ > +_scratch_mkfs_xfs >>$seqres.full 2>&1 \ > || _fail "mkfs scratch failed" > > echo "mount" > -_scratch_mount >>$seq.full 2>&1 \ > +_scratch_mount >>$seqres.full 2>&1 \ > || _fail "mount failed: $MOUNT_OPTIONS" > > echo "touch files" > touch $SCRATCH_MNT/{0,1,2,3,4,5,6,7,8,9}{0,1,2,3,4,5,6,7,8,9} > > echo "godown" > -src/godown -v -f $SCRATCH_MNT >> $seq.full > +src/godown -v -f $SCRATCH_MNT >> $seqres.full > > echo "unmount" > umount $SCRATCH_MNT > @@ -75,7 +76,7 @@ if false; then > fi > > echo "mount with replay" > -_scratch_mount $mnt >>$seq.full 2>&1 \ > +_scratch_mount $mnt >>$seqres.full 2>&1 \ > || _fail "mount failed: $mnt $MOUNT_OPTIONS" > > echo "ls SCRATCH_MNT" > diff --git a/tests/xfs/086 b/tests/xfs/086 > index b59ad0a..2e2d4cf 100755 > --- a/tests/xfs/086 > +++ b/tests/xfs/086 > @@ -25,6 +25,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -41,7 +42,7 @@ trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15 > _supported_fs xfs > _supported_os IRIX Linux > > -rm -f $seq.full $tmp.* > +rm -f $seqres.full $tmp.* > _require_scratch > _require_v2log > > @@ -83,7 +84,7 @@ for s in sync nosync ; do > > # mkfs the FS > _echofull "mkfs" > - _scratch_mkfs_xfs >>$seq.full 2>&1 > + _scratch_mkfs_xfs >>$seqres.full 2>&1 > if [ $? -ne 0 ] ; then > _echofull "mkfs failed: $MKFS_OPTIONS" > continue > @@ -91,7 +92,7 @@ for s in sync nosync ; do > > # mount the FS > _echofull "mount" > - if ! _scratch_mount >>$seq.full 2>&1; then > + if ! _scratch_mount >>$seqres.full 2>&1; then > _echofull "mount failed: $MOUNT_OPTIONS" > continue > fi > @@ -116,17 +117,17 @@ for s in sync nosync ; do > ls $SCRATCH_MNT > > _echofull "godown" > - src/godown -v -f $SCRATCH_MNT >> $seq.full > + src/godown -v -f $SCRATCH_MNT >> $seqres.full > > _echofull "unmount" > - umount $SCRATCH_DEV >>$seq.full 2>&1 \ > + umount $SCRATCH_DEV >>$seqres.full 2>&1 \ > || _fail "umount failed" > > _echofull "logprint after going down..." > _print_logstate > > _echofull "mount with replay" > - _scratch_mount >>$seq.full 2>&1 \ > + _scratch_mount >>$seqres.full 2>&1 \ > || _fail "mount failed: $MOUNT_OPTIONS" > > # check on what FS looks like after log recovery > diff --git a/tests/xfs/087 b/tests/xfs/087 > index 30e117b..3e51fcb 100755 > --- a/tests/xfs/087 > +++ b/tests/xfs/087 > @@ -25,6 +25,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -45,7 +46,7 @@ _do_meta() > param="-p 4 -z -f rmdir=10 -f link=10 -f creat=10 -f mkdir=10 \ > -f rename=30 -f stat=30 -f unlink=30 -f truncate=20" > _echofull "calling fsstress $param -m8 -n $count" > - if ! $FSSTRESS_PROG $param $FSSTRESS_AVOID -m 8 -n $count -d $out >>$seq.full 2>&1 > + if ! $FSSTRESS_PROG $param $FSSTRESS_AVOID -m 8 -n $count -d $out >>$seqres.full 2>&1 > then > _echofull "fsstress failed" > fi > @@ -55,7 +56,7 @@ _do_meta() > _supported_fs xfs > _supported_os IRIX Linux > > -rm -f $seq.full $tmp.* > +rm -f $seqres.full $tmp.* > _require_scratch > _require_v2log > _require_xfs_quota > @@ -90,7 +91,7 @@ do > > # mkfs the FS > _echofull "mkfs" > - _scratch_mkfs_xfs >>$seq.full 2>&1 > + _scratch_mkfs_xfs >>$seqres.full 2>&1 > if [ $? -ne 0 ] ; then > _echofull "mkfs failed: $MKFS_OPTIONS" > continue > @@ -98,7 +99,7 @@ do > > # mount the FS > _echofull "mount" > - if ! _scratch_mount -o uquota >>$seq.full 2>&1; then > + if ! _scratch_mount -o uquota >>$seqres.full 2>&1; then > _echofull "mount failed: $MOUNT_OPTIONS" > continue > fi > @@ -111,20 +112,20 @@ do > ls -RF $SCRATCH_MNT >$tmp.ls1 > > _echofull "godown" > - src/godown -v -f $SCRATCH_MNT >> $seq.full > + src/godown -v -f $SCRATCH_MNT >> $seqres.full > > _echofull "unmount" > - umount $SCRATCH_DEV >>$seq.full 2>&1 \ > + umount $SCRATCH_DEV >>$seqres.full 2>&1 \ > || _fail "umount failed" > > _echofull "logprint after going down..." > _print_logstate > > _full "logprint headers" > - _scratch_xfs_logprint -n >>$seq.full 2>&1 > + _scratch_xfs_logprint -n >>$seqres.full 2>&1 > > _echofull "mount with replay" > - _scratch_mount -o uquota >>$seq.full 2>&1 \ > + _scratch_mount -o uquota >>$seqres.full 2>&1 \ > || _fail "mount failed: $MOUNT_OPTIONS" > > # check on what FS looks like after log recovery > diff --git a/tests/xfs/090 b/tests/xfs/090 > index 8ce50c0..8477329 100755 > --- a/tests/xfs/090 > +++ b/tests/xfs/090 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/092 b/tests/xfs/092 > index 2f849f3..e65fe27 100755 > --- a/tests/xfs/092 > +++ b/tests/xfs/092 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/094 b/tests/xfs/094 > index 4f4cf34..6aa2d74 100755 > --- a/tests/xfs/094 > +++ b/tests/xfs/094 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/095 b/tests/xfs/095 > index 9de4476..9a74d5f 100755 > --- a/tests/xfs/095 > +++ b/tests/xfs/095 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/096 b/tests/xfs/096 > index ecadd73..0fef425 100755 > --- a/tests/xfs/096 > +++ b/tests/xfs/096 > @@ -24,6 +24,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -63,7 +64,7 @@ _cleanup() > # > _mkfs_filter() > { > - tee -a $seq.full | \ > + tee -a $seqres.full | \ > sed \ > -e 's/extsz=[0-9][0-9]*[ ]*/extsz=N, /' \ > -e 's/blocks=[0-9][0-9]*/blocks=N/' \ > @@ -88,7 +89,7 @@ _mkfs_filter() > } > > # real QA test starts here > -rm -f $seq.full > +rm -f $seqres.full > > # Modify as appropriate. > _supported_fs xfs > diff --git a/tests/xfs/103 b/tests/xfs/103 > index 9750153..753b14d 100755 > --- a/tests/xfs/103 > +++ b/tests/xfs/103 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/104 b/tests/xfs/104 > index 4e61837..0968daa 100755 > --- a/tests/xfs/104 > +++ b/tests/xfs/104 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -37,7 +38,7 @@ trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15 > _create_scratch() > { > echo "*** mkfs" > - _scratch_mkfs_xfs $@ | tee -a $seq.full | _filter_mkfs 2>$tmp.mkfs > + _scratch_mkfs_xfs $@ | tee -a $seqres.full | _filter_mkfs 2>$tmp.mkfs > . $tmp.mkfs > > echo "*** mount" > @@ -68,7 +69,7 @@ _stress_scratch() > # real QA test starts here > _supported_fs xfs > _require_scratch > -_scratch_mkfs_xfs | tee -a $seq.full | _filter_mkfs 2>$tmp.mkfs > +_scratch_mkfs_xfs | tee -a $seqres.full | _filter_mkfs 2>$tmp.mkfs > . $tmp.mkfs # extract blocksize and data size for scratch device > > endsize=`expr 550 \* 1048576` # stop after growing this big > @@ -93,19 +94,19 @@ _fill_scratch $fillsize > # > while [ $size -le $endsize ]; do > echo "*** stressing a ${size} byte filesystem" > - echo "*** stressing a ${sizeb} block filesystem" >> $seq.full > + echo "*** stressing a ${sizeb} block filesystem" >> $seqres.full > _stress_scratch > sleep 1 > size=`expr $size + $incsize` > sizeb=`expr $size / $dbsize` # in data blocks > echo "*** growing to a ${size} byte filesystem" > - echo "*** growing to a ${sizeb} block filesystem" >> $seq.full > + echo "*** growing to a ${sizeb} block filesystem" >> $seqres.full > xfs_growfs -D ${sizeb} $SCRATCH_MNT \ > - | tee -a $seq.full | _filter_mkfs 2>$tmp.growfs > + | tee -a $seqres.full | _filter_mkfs 2>$tmp.growfs > . $tmp.growfs > [ `expr $size % $modsize` -eq 0 ] && wait # every 4th iteration > - echo AGCOUNT=$agcount | tee -a $seq.full > - echo && echo >> $seq.full > + echo AGCOUNT=$agcount | tee -a $seqres.full > + echo && echo >> $seqres.full > done > wait # stop for any remaining stress processes > > diff --git a/tests/xfs/106 b/tests/xfs/106 > index 613b12c..667115d 100755 > --- a/tests/xfs/106 > +++ b/tests/xfs/106 > @@ -25,6 +25,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -44,7 +45,7 @@ _require_xfs_quota > > # real QA test starts here > _scratch_mkfs_xfs | _filter_mkfs 2>$tmp.mkfs > -cat $tmp.mkfs >$seq.full > +cat $tmp.mkfs >$seqres.full > . $tmp.mkfs > > # setup a default run > @@ -86,7 +87,7 @@ s/Inode: \#\d+ \(\d+ blocks, \d+ extents\)/Inode: #[INO] (X blocks, Y extents)/; > test_quot() > { > echo "checking quot command (type=$type)" # not deterministic on blks > - xfs_quota -x -c "quot -n -$type" $SCRATCH_MNT >>$seq.full 2>&1 > + xfs_quota -x -c "quot -n -$type" $SCRATCH_MNT >>$seqres.full 2>&1 > } > > test_report() > diff --git a/tests/xfs/107 b/tests/xfs/107 > index e887384..7124dc2 100755 > --- a/tests/xfs/107 > +++ b/tests/xfs/107 > @@ -25,6 +25,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -56,7 +57,7 @@ _require_xfs_quota > > # real QA test starts here > _scratch_mkfs_xfs | _filter_mkfs 2>$tmp.mkfs > -cat $tmp.mkfs >$seq.full > +cat $tmp.mkfs >$seqres.full > . $tmp.mkfs > > # setup a default run > @@ -72,7 +73,7 @@ _require_prjquota $SCRATCH_DEV > echo "### create projects file" > rm -f $tmp.projects > target=$SCRATCH_MNT/project > -echo "6:$target" | tee -a $seq.full > $tmp.projects > +echo "6:$target" | tee -a $seqres.full > $tmp.projects > > echo "### populate filesystem" > mkdir $target || exit > diff --git a/tests/xfs/108 b/tests/xfs/108 > index 6b656e6..809659d 100755 > --- a/tests/xfs/108 > +++ b/tests/xfs/108 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -57,15 +58,15 @@ test_files() > test_accounting() > { > echo "### some controlled buffered, direct and mmapd IO (type=$type)" > - echo "--- initiating parallel IO..." >>$seq.full > + echo "--- initiating parallel IO..." >>$seqres.full > $XFS_IO_PROG -c 'pwrite -b 1m 0 16m' -c 'fsync' \ > - $SCRATCH_MNT/buffer >>$seq.full 2>&1 & > + $SCRATCH_MNT/buffer >>$seqres.full 2>&1 & > $XFS_IO_PROG -c 'pwrite -b 1m 0 16m' -d \ > - $SCRATCH_MNT/direct >>$seq.full 2>&1 & > + $SCRATCH_MNT/direct >>$seqres.full 2>&1 & > $XFS_IO_PROG -c 't 16m' -c 'mm -rw 0 16m' -c 'mw 0 16m' -c 'ms -s' \ > - $SCRATCH_MNT/mmap >>$seq.full 2>&1 & > + $SCRATCH_MNT/mmap >>$seqres.full 2>&1 & > wait > - echo "--- completed parallel IO ($type)" >>$seq.full > + echo "--- completed parallel IO ($type)" >>$seqres.full > > for file in $SCRATCH_MNT/{buffer,direct,mmap}; do > $here/src/lstat64 $file | head -3 | _filter_scratch > @@ -80,10 +81,10 @@ _qmount > _require_prjquota $SCRATCH_DEV > > # real QA test starts here > -rm -f $tmp.projects $seq.full > +rm -f $tmp.projects $seqres.full > umount $SCRATCH_DEV 2>/dev/null > _scratch_mkfs_xfs | _filter_mkfs 2>$tmp.mkfs > -cat $tmp.mkfs >>$seq.full > +cat $tmp.mkfs >>$seqres.full > _scratch_mount > > uid=1 > diff --git a/tests/xfs/109 b/tests/xfs/109 > index 56364f4..2e36d0f 100755 > --- a/tests/xfs/109 > +++ b/tests/xfs/109 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -102,7 +103,7 @@ fi > umount $SCRATCH_DEV > > _scratch_mkfs_xfs -dsize=160m,agcount=4 $faststart | _filter_mkfs 2>$tmp.mkfs > -cat $tmp.mkfs >>$seq.full > +cat $tmp.mkfs >>$seqres.full > _scratch_mount > > populate > diff --git a/tests/xfs/110 b/tests/xfs/110 > index 8749afa..a2790c8 100755 > --- a/tests/xfs/110 > +++ b/tests/xfs/110 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/111 b/tests/xfs/111 > index 8f4c142..af7cd65 100755 > --- a/tests/xfs/111 > +++ b/tests/xfs/111 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/114 b/tests/xfs/114 > index fa64093..5228eca 100755 > --- a/tests/xfs/114 > +++ b/tests/xfs/114 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -79,8 +80,8 @@ _test_create() > p=dir2/dir3/dir4/file4 > touch $p > > - #_print_names $p >>$here/$seq.full > - _print_names $p | tee -a $here/$seq.full > + #_print_names $p >>$here/$seqres.full > + _print_names $p | tee -a $here/$seqres.full > > _check_paths $SCRATCH_MNT/$p > } > @@ -130,13 +131,13 @@ _test_hardlink() > ln $p $x > done > > - _print_names $p >>$here/$seq.full > + _print_names $p >>$here/$seqres.full > > echo "" > echo "print out names and check after created hardlinks" > echo "" > for x in $paths; do > - _print_names $x | tee -a $here/$seq.full > + _print_names $x | tee -a $here/$seqres.full > _check_paths $SCRATCH_MNT/$x > done > > @@ -160,7 +161,7 @@ _test_hardlink() > echo "" > for x in $paths; do > if [ -e $x ]; then > - _print_names $x | tee -a $here/$seq.full > + _print_names $x | tee -a $here/$seqres.full > _check_paths $SCRATCH_MNT/$x > fi > done > @@ -229,7 +230,7 @@ _test_rename() > > _filter_num() > { > - tee -a $here/$seq.full |\ > + tee -a $here/$seqres.full |\ > sed -e 's/[0-9][0-9]* inodes/I inodes/g' \ > -e 's/[0-9][0-9]* paths/P paths/g' \ > -e 's/seed = [0-9][0-9]*/seed = S/' > @@ -254,7 +255,7 @@ _test_fsstress() > if ! $FSSTRESS_PROG $args | _filter_num > then > echo " fsstress $args returned $?" > - cat $tmp.out | tee -a $here/$seq.full > + cat $tmp.out | tee -a $here/$seqres.full > status=1 > fi > > @@ -283,8 +284,8 @@ _test_dirstress() > if ! $here/src/dirstress $args >$tmp.out 2>&1 | _filter_num > then > echo " dirstress failed" > - echo "*** dirstress $args" | tee -a $here/$seq.full > - cat $tmp.out >>$here/$seq.full > + echo "*** dirstress $args" | tee -a $here/$seqres.full > + cat $tmp.out >>$here/$seqres.full > status=1 > exit > fi > @@ -294,8 +295,8 @@ _test_dirstress() > if ! $here/src/dirstress $args >$tmp.out 2>&1 | _filter_num > then > echo " dirstress failed" > - echo "*** dirstress $args" | tee -a $here/$seq.full > - cat $tmp.out >>$here/$seq.full > + echo "*** dirstress $args" | tee -a $here/$seqres.full > + cat $tmp.out >>$here/$seqres.full > status=1 > exit > fi > @@ -315,16 +316,16 @@ _require_scratch > _require_attrs > _need_to_be_root > > -rm -f $here/$seq.full > +rm -f $here/$seqres.full > > echo "mkfs" > -_scratch_mkfs_xfs >>$here/$seq.full 2>&1 \ > +_scratch_mkfs_xfs >>$here/$seqres.full 2>&1 \ > || _fail "mkfs scratch failed" > -_scratch_mkfs_xfs -i parent=1 >>$here/$seq.full 2>&1 \ > +_scratch_mkfs_xfs -i parent=1 >>$here/$seqres.full 2>&1 \ > || _notrun "parent inodes not supported" > > echo "mount" > -_scratch_mount >>$here/$seq.full 2>&1 \ > +_scratch_mount >>$here/$seqres.full 2>&1 \ > || _fail "mount failed: $MOUNT_OPTIONS" > > # real QA test starts here > diff --git a/tests/xfs/115 b/tests/xfs/115 > index ebcc995..aa281d6 100755 > --- a/tests/xfs/115 > +++ b/tests/xfs/115 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -101,16 +102,16 @@ _supported_os IRIX > _require_scratch > _require_attrs > > -rm -f $here/$seq.full > +rm -f $here/$seqres.full > > echo "mkfs" > -_scratch_mkfs_xfs >>$here/$seq.full 2>&1 \ > +_scratch_mkfs_xfs >>$here/$seqres.full 2>&1 \ > || _fail "mkfs scratch failed" > -_scratch_mkfs_xfs -i paths=1 >>$here/$seq.full 2>&1 \ > +_scratch_mkfs_xfs -i paths=1 >>$here/$seqres.full 2>&1 \ > || _notrun "i_paths not supported" > > echo "mount" > -_scratch_mount >>$here/$seq.full 2>&1 \ > +_scratch_mount >>$here/$seqres.full 2>&1 \ > || _fail "mount failed: $MOUNT_OPTIONS" > > # real QA test starts here > @@ -251,7 +252,7 @@ _do_test() > xfs_repair_ipaths -n $SCRATCH_MNT > } > > -_do_test 2>&1 | tee $seq.full | _filter_inodes > +_do_test 2>&1 | tee $seqres.full | _filter_inodes > > # success, all done > status=0 > diff --git a/tests/xfs/116 b/tests/xfs/116 > index 2c3ab92..4554d20 100755 > --- a/tests/xfs/116 > +++ b/tests/xfs/116 > @@ -25,6 +25,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/118 b/tests/xfs/118 > index d140a8b..e4ce711 100755 > --- a/tests/xfs/118 > +++ b/tests/xfs/118 > @@ -25,6 +25,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -72,7 +73,7 @@ _chowning_file() > > > echo "mkfs on scratch" > -_scratch_mkfs_xfs >$seq.full > +_scratch_mkfs_xfs >$seqres.full > > echo "mount with quotas" > export MOUNT_OPTIONS="-o uquota" > diff --git a/tests/xfs/119 b/tests/xfs/119 > index 85af211..066ddbd 100755 > --- a/tests/xfs/119 > +++ b/tests/xfs/119 > @@ -25,6 +25,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/121 b/tests/xfs/121 > index a590bb0..f6dc83a 100755 > --- a/tests/xfs/121 > +++ b/tests/xfs/121 > @@ -27,6 +27,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -43,17 +44,17 @@ trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15 > _supported_fs xfs > _supported_os IRIX Linux > > -rm -f $seq.full > +rm -f $seqres.full > rm -f $tmp.log > > _require_scratch > > echo "mkfs" > -_scratch_mkfs_xfs >>$seq.full 2>&1 \ > +_scratch_mkfs_xfs >>$seqres.full 2>&1 \ > || _fail "mkfs scratch failed" > > echo "mount" > -_scratch_mount >>$seq.full 2>&1 \ > +_scratch_mount >>$seqres.full 2>&1 \ > || _fail "mount failed: $MOUNT_OPTIONS" > > # num_files must be greater than 64 (XFS_AGI_UNLINKED_BUCKETS) > @@ -68,7 +69,7 @@ src/multi_open_unlink -f $SCRATCH_MNT/test_file -n $num_files -s $delay & > sleep 3 > > echo "godown" > -src/godown -v -f $SCRATCH_MNT >> $seq.full > +src/godown -v -f $SCRATCH_MNT >> $seqres.full > > # time for multi_open_unlink to exit out after its delay > # so we have no references and can unmount > @@ -81,11 +82,11 @@ echo "logprint after going down..." > _print_logstate > > echo "mount with replay" > -_scratch_mount $mnt >>$seq.full 2>&1 \ > +_scratch_mount $mnt >>$seqres.full 2>&1 \ > || _fail "mount failed: $mnt $MOUNT_OPTIONS" > > echo "godown" > -src/godown -v -f $SCRATCH_MNT >> $seq.full > +src/godown -v -f $SCRATCH_MNT >> $seqres.full > > echo "unmount" > umount $SCRATCH_MNT > @@ -94,7 +95,7 @@ echo "logprint after going down..." > _print_logstate > > echo "logprint to check for CLEAR_AGI_BUCKET..." > -if _scratch_xfs_logprint -t | tee -a $seq.full | grep CLEAR; then > +if _scratch_xfs_logprint -t | tee -a $seqres.full | grep CLEAR; then > echo 'CLEAR_AGI_BUCKET transactions found!!' > echo 'Are you running with an old xfs kernel - where the bug still exists?' > else > @@ -102,7 +103,7 @@ else > fi > > # clean up dirty log with log recovery on mount > -_scratch_mount >> $seq.full 2>&1 \ > +_scratch_mount >> $seqres.full 2>&1 \ > || _fail "mount failed" > > # should now be peaches > diff --git a/tests/xfs/122 b/tests/xfs/122 > index 1c4f3a4..2a81728 100755 > --- a/tests/xfs/122 > +++ b/tests/xfs/122 > @@ -25,6 +25,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -176,7 +177,7 @@ echo 'int main(int argc, char *argv[]) {' >>$cprog > # > cat /usr/include/xfs/xfs*.h | indent |\ > _attribute_filter |\ > -tee $seq.full |\ > +tee $seqres.full |\ > egrep '} *xfs_.*_t' |\ > egrep -v -f $tmp.ignore |\ > awk '{sub(/[;,]/,"",$2); print "printf(\"sizeof(", $2, ") = %d\\n\", sizeof(", $2, "));"}' \ > @@ -198,8 +199,8 @@ awk ' > echo 'return 0; }' >>$cprog > > # create and run program > -cc -o $oprog $cprog >> $seq.full 2>&1 || \ > - _notrun "Could not compile test program (see end of $seq.full)" > +cc -o $oprog $cprog >> $seqres.full 2>&1 || \ > + _notrun "Could not compile test program (see end of $seqres.full)" > $oprog | _type_size_filter | _type_name_filter > $progout > > # > diff --git a/tests/xfs/134 b/tests/xfs/134 > index 2117b4a..f38fc6e 100755 > --- a/tests/xfs/134 > +++ b/tests/xfs/134 > @@ -24,6 +24,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -60,8 +61,8 @@ cat >$tmp.projid < test:1 > EOF > > -cp /dev/null $seq.full > -chmod a+rwx $seq.full # arbitrary users will write here > +cp /dev/null $seqres.full > +chmod a+rwx $seqres.full # arbitrary users will write here > > _require_scratch > _scratch_mkfs_xfs >/dev/null 2>&1 > diff --git a/tests/xfs/136 b/tests/xfs/136 > index 6479c8c..ec3f71a 100755 > --- a/tests/xfs/136 > +++ b/tests/xfs/136 > @@ -25,6 +25,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/137 b/tests/xfs/137 > index 0f65d08..5c0fc51 100755 > --- a/tests/xfs/137 > +++ b/tests/xfs/137 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/138 b/tests/xfs/138 > index f8af8dd..a0aeb82 100755 > --- a/tests/xfs/138 > +++ b/tests/xfs/138 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/139 b/tests/xfs/139 > index 7d2e409..9de1fca 100755 > --- a/tests/xfs/139 > +++ b/tests/xfs/139 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/140 b/tests/xfs/140 > index a8cbd09..8564b28 100755 > --- a/tests/xfs/140 > +++ b/tests/xfs/140 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/142 b/tests/xfs/142 > index 526167d..e09ae3f 100755 > --- a/tests/xfs/142 > +++ b/tests/xfs/142 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/143 b/tests/xfs/143 > index 63281f9..686be64 100755 > --- a/tests/xfs/143 > +++ b/tests/xfs/143 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/144 b/tests/xfs/144 > index 52123cc..cf5eca7 100755 > --- a/tests/xfs/144 > +++ b/tests/xfs/144 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/145 b/tests/xfs/145 > index 54b8198..2a4b2f6 100755 > --- a/tests/xfs/145 > +++ b/tests/xfs/145 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/146 b/tests/xfs/146 > index bb4975c..2091db1 100755 > --- a/tests/xfs/146 > +++ b/tests/xfs/146 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/147 b/tests/xfs/147 > index e366dc7..c65dde9 100755 > --- a/tests/xfs/147 > +++ b/tests/xfs/147 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/148 b/tests/xfs/148 > index abc516a..49892ab 100755 > --- a/tests/xfs/148 > +++ b/tests/xfs/148 > @@ -24,6 +24,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/149 b/tests/xfs/149 > index b1793b7..d345f4a 100755 > --- a/tests/xfs/149 > +++ b/tests/xfs/149 > @@ -24,13 +24,14 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > tmp=/tmp/$$ > status=1 # failure is the default! > trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15 > -rm -f $seq.full > +rm -f $seqres.full > > # get standard environment, filters and checks > . ./common.rc > @@ -44,15 +45,15 @@ export XFS_REPAIR_PROG=$XFS_PARALLEL_REPAIR_PROG > > _check_repair() > { > - echo "Repairing, round 0" >> $seq.full > - _scratch_xfs_repair 2>&1 | _filter_repair | tee -a $seq.full >$tmp.0 > + echo "Repairing, round 0" >> $seqres.full > + _scratch_xfs_repair 2>&1 | _filter_repair | tee -a $seqres.full >$tmp.0 > for i in 1 2 3 4 > do > - echo "Repairing, iteration $i" | tee -a $seq.full > + echo "Repairing, iteration $i" | tee -a $seqres.full > _scratch_xfs_repair 2>&1 | _filter_repair >$tmp.$i > - diff $tmp.0 $tmp.$i >> $seq.full > + diff $tmp.0 $tmp.$i >> $seqres.full > if [ $? -ne 0 ]; then > - echo "ERROR: repair round $i differs to round 0 (see $seq.full)" | tee -a $seq.full > + echo "ERROR: repair round $i differs to round 0 (see $seqres.full)" | tee -a $seqres.full > break > fi > # echo all interesting stuff... > diff --git a/tests/xfs/150 b/tests/xfs/150 > index b6a04c5..529b6b4 100755 > --- a/tests/xfs/150 > +++ b/tests/xfs/150 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/151 b/tests/xfs/151 > index 4bfaff3..9de8ab4 100755 > --- a/tests/xfs/151 > +++ b/tests/xfs/151 > @@ -25,6 +25,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -55,7 +56,7 @@ _check_sids() > | perl -ne "if (/^sids.*[\"|\s]($i)[\"|\s].*/) {print \$1} ;"` > if [ -z "$CHECKED_SID" ] ; then > echo "ERROR: SID(s) not created" > - ${DMAPI_QASUITE1_DIR}../simple/dm_getall_sessions >>$seq.full > + ${DMAPI_QASUITE1_DIR}../simple/dm_getall_sessions >>$seqres.full > return > fi > done > diff --git a/tests/xfs/152 b/tests/xfs/152 > index 2317291..4b9d471 100755 > --- a/tests/xfs/152 > +++ b/tests/xfs/152 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/153 b/tests/xfs/153 > index 81be175..86df036 100755 > --- a/tests/xfs/153 > +++ b/tests/xfs/153 > @@ -24,6 +24,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/154 b/tests/xfs/154 > index 62e79c2..528ec9c 100755 > --- a/tests/xfs/154 > +++ b/tests/xfs/154 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/155 b/tests/xfs/155 > index 949bd98..1c4ea6c 100755 > --- a/tests/xfs/155 > +++ b/tests/xfs/155 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/156 b/tests/xfs/156 > index 549cac8..0a73b6b 100755 > --- a/tests/xfs/156 > +++ b/tests/xfs/156 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -48,8 +49,8 @@ _require_scratch > _scratch_mkfs_xfs >/dev/null 2>&1 > _dmapi_scratch_mount > > -${DMAPI_QASUITE1_DIR}cmd/get_dirattrs $SCRATCH_MNT > $seq.full > -[ $? -ne 0 ] && echo "get_dirattrs failed - see $seq.full" > +${DMAPI_QASUITE1_DIR}cmd/get_dirattrs $SCRATCH_MNT > $seqres.full > +[ $? -ne 0 ] && echo "get_dirattrs failed - see $seqres.full" > > status=0 > exit > diff --git a/tests/xfs/157 b/tests/xfs/157 > index 9ae3c40..91819ef 100755 > --- a/tests/xfs/157 > +++ b/tests/xfs/157 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/158 b/tests/xfs/158 > index e740654..ef8d4d1 100755 > --- a/tests/xfs/158 > +++ b/tests/xfs/158 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/159 b/tests/xfs/159 > index bfc225d..8f80482 100755 > --- a/tests/xfs/159 > +++ b/tests/xfs/159 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/160 b/tests/xfs/160 > index 3900299..2323697 100755 > --- a/tests/xfs/160 > +++ b/tests/xfs/160 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/161 b/tests/xfs/161 > index c419380..45210c7 100755 > --- a/tests/xfs/161 > +++ b/tests/xfs/161 > @@ -24,6 +24,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/162 b/tests/xfs/162 > index acd70e0..67aec9a 100755 > --- a/tests/xfs/162 > +++ b/tests/xfs/162 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/163 b/tests/xfs/163 > index d4eef64..434f100 100755 > --- a/tests/xfs/163 > +++ b/tests/xfs/163 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/164 b/tests/xfs/164 > index 1ef4aaf..8af0b0d 100755 > --- a/tests/xfs/164 > +++ b/tests/xfs/164 > @@ -29,6 +29,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -44,7 +45,7 @@ _cleanup() > > _filter_io() > { > - tee -a $seq.full | sed 's/ops;.*/ops/' > + tee -a $seqres.full | sed 's/ops;.*/ops/' > } > > # > @@ -55,7 +56,7 @@ _filter_bmap() > { > awk '$3 ~ /hole/ { print $1, $2, $3; next } > $7 ~ /10000/ { print $1, $2, "unwritten"; next } > - {print $1, $2}' >> $seq.full > + {print $1, $2}' >> $seqres.full > } > > > diff --git a/tests/xfs/165 b/tests/xfs/165 > index 3b321b9..72376f3 100755 > --- a/tests/xfs/165 > +++ b/tests/xfs/165 > @@ -26,6 +26,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -41,7 +42,7 @@ _cleanup() > > _filter_io() > { > - tee -a $seq.full | _filter_xfs_io > + tee -a $seqres.full | _filter_xfs_io > } > > # > @@ -52,7 +53,7 @@ _filter_io() > _filter_bmap() > { > awk '$3 ~ /hole/ { print $1, $2, $3; next } > - {print $1, $2}' >> $seq.full > + {print $1, $2}' >> $seqres.full > } > > # get standard environment, filters and checks > @@ -68,7 +69,7 @@ _supported_os IRIX Linux > # io tests > testfile=$TEST_DIR/file.$seq > rm -f $testfile > -rm -f $seq.full > +rm -f $seqres.full > len=4 > end=`expr 10 \* $len` > > diff --git a/tests/xfs/166 b/tests/xfs/166 > index 527686f..3170fa6 100755 > --- a/tests/xfs/166 > +++ b/tests/xfs/166 > @@ -23,13 +23,14 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > tmp=/tmp/$$ > status=1 # failure is the default! > trap "_cleanup; exit \$status" 0 1 2 3 15 > -rm -f $seq.full > +rm -f $seqres.full > > _cleanup() > { > @@ -91,7 +92,7 @@ FILE_SIZE=1048576 > rm -f $TEST_FILE > $TEST_PROG $FILE_SIZE $TEST_FILE > > -xfs_bmap -vp $TEST_FILE >> $seq.full > +xfs_bmap -vp $TEST_FILE >> $seqres.full > xfs_bmap -vp $TEST_FILE | _filter_blocks > > status=0 > diff --git a/tests/xfs/167 b/tests/xfs/167 > index c2e15e8..84bbe09 100755 > --- a/tests/xfs/167 > +++ b/tests/xfs/167 > @@ -23,11 +23,12 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > tmp=/tmp/$$ > -rm -f $seq.full > +rm -f $seqres.full > status=1 # failure is the default! > trap "_cleanup; exit \$status" 0 1 2 3 15 > > @@ -43,7 +44,7 @@ workout() > procs=100 > nops=15000 > $FSSTRESS_PROG -d $SCRATCH_MNT -p $procs -n $nops $FSSTRESS_AVOID \ > - >>$seq.full & > + >>$seqres.full & > sleep 2 > } > > diff --git a/tests/xfs/168 b/tests/xfs/168 > index 8980f9b..67f1e19 100755 > --- a/tests/xfs/168 > +++ b/tests/xfs/168 > @@ -24,11 +24,12 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > tmp=/tmp/$$ > -rm -f $seq.full > +rm -f $seqres.full > status=1 # failure is the default! > trap "_cleanup; exit \$status" 0 1 2 3 15 > > @@ -106,7 +107,7 @@ wait > # dmapi destroy events are asyncronous, don't rely on fixed ordering of events > # in print_event output, use sort. > echo "# here comes the dmapi print_event filtered and sorted output" > -cat $tmp.print_event_out | tee -a $here/$seq.full | _filter_dmapi_print_event | LC_COLLATE=POSIX sort > +cat $tmp.print_event_out | tee -a $here/$seqres.full | _filter_dmapi_print_event | LC_COLLATE=POSIX sort > rm $tmp.print_event_out > > status=0 > diff --git a/tests/xfs/170 b/tests/xfs/170 > index b725d3a..f470946 100755 > --- a/tests/xfs/170 > +++ b/tests/xfs/170 > @@ -25,11 +25,12 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > tmp=/tmp/$$ > -rm -f $seq.full > +rm -f $seqres.full > status=1 # failure is the default! > trap "_cleanup; exit \$status" 0 1 2 3 15 > > diff --git a/tests/xfs/171 b/tests/xfs/171 > index 4f77a41..af7a216 100755 > --- a/tests/xfs/171 > +++ b/tests/xfs/171 > @@ -24,11 +24,12 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > tmp=/tmp/$$ > -rm -f $seq.full > +rm -f $seqres.full > status=1 # failure is the default! > trap "_cleanup; exit \$status" 0 1 2 3 15 > > diff --git a/tests/xfs/172 b/tests/xfs/172 > index b6b496c..50eda81 100755 > --- a/tests/xfs/172 > +++ b/tests/xfs/172 > @@ -24,11 +24,12 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > tmp=/tmp/$$ > -rm -f $seq.full > +rm -f $seqres.full > status=1 # failure is the default! > trap "_cleanup; exit \$status" 0 1 2 3 15 > > diff --git a/tests/xfs/173 b/tests/xfs/173 > index 7146d2f..6761a8a 100755 > --- a/tests/xfs/173 > +++ b/tests/xfs/173 > @@ -24,11 +24,12 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > tmp=/tmp/$$ > -rm -f $seq.full > +rm -f $seqres.full > status=1 # failure is the default! > trap "_cleanup; exit \$status" 0 1 2 3 15 > > diff --git a/tests/xfs/174 b/tests/xfs/174 > index 7745a6a..ffb6754 100755 > --- a/tests/xfs/174 > +++ b/tests/xfs/174 > @@ -24,11 +24,12 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > tmp=/tmp/$$ > -rm -f $seq.full > +rm -f $seqres.full > status=1 # failure is the default! > trap "_cleanup; exit \$status" 0 1 2 3 15 > > diff --git a/tests/xfs/175 b/tests/xfs/175 > index 4fc3ffb..4753f21 100755 > --- a/tests/xfs/175 > +++ b/tests/xfs/175 > @@ -26,11 +26,12 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > tmp=/tmp/$$ > -rm -f $seq.full > +rm -f $seqres.full > status=1 # failure is the default! > trap "_cleanup; exit \$status" 0 1 2 3 15 > > diff --git a/tests/xfs/176 b/tests/xfs/176 > index 93083c4..3fe9f04 100755 > --- a/tests/xfs/176 > +++ b/tests/xfs/176 > @@ -23,11 +23,12 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > tmp=/tmp/$$ > -rm -f $seq.full > +rm -f $seqres.full > status=1 # failure is the default! > trap "_cleanup; exit \$status" 0 1 2 3 15 > > diff --git a/tests/xfs/177 b/tests/xfs/177 > index ec8aca7..49ca282 100755 > --- a/tests/xfs/177 > +++ b/tests/xfs/177 > @@ -24,6 +24,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/178 b/tests/xfs/178 > index 8856656..084aeb9 100755 > --- a/tests/xfs/178 > +++ b/tests/xfs/178 > @@ -24,6 +24,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/179 b/tests/xfs/179 > index f3facca..451d7cc 100755 > --- a/tests/xfs/179 > +++ b/tests/xfs/179 > @@ -24,6 +24,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/180 b/tests/xfs/180 > index 0f82306..15e0221 100755 > --- a/tests/xfs/180 > +++ b/tests/xfs/180 > @@ -24,6 +24,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/181 b/tests/xfs/181 > index fb65100..35e808f 100755 > --- a/tests/xfs/181 > +++ b/tests/xfs/181 > @@ -27,6 +27,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > _cleanup() > @@ -50,17 +51,17 @@ trap "_cleanup; exit \$status" 0 1 2 3 15 > _supported_fs xfs > _supported_os IRIX Linux > > -rm -f $seq.full > +rm -f $seqres.full > rm -f $tmp.log > > _require_scratch > > echo "mkfs" > -_scratch_mkfs_xfs >>$seq.full 2>&1 \ > +_scratch_mkfs_xfs >>$seqres.full 2>&1 \ > || _fail "mkfs scratch failed" > > echo "mount" > -_scratch_mount >>$seq.full 2>&1 \ > +_scratch_mount >>$seqres.full 2>&1 \ > || _fail "mount failed: $MOUNT_OPTIONS" > > # num_files must be greater than 64 (XFS_AGI_UNLINKED_BUCKETS) > @@ -81,7 +82,7 @@ pid=$! > sleep 10 > > echo "godown" > -src/godown -v -f $SCRATCH_MNT >> $seq.full > +src/godown -v -f $SCRATCH_MNT >> $seqres.full > > # kill the multi_open_unlink > kill $pid 2>/dev/null > @@ -95,11 +96,11 @@ echo "logprint after going down..." > _print_logstate > > echo "mount with replay" > -_scratch_mount $mnt >>$seq.full 2>&1 \ > +_scratch_mount $mnt >>$seqres.full 2>&1 \ > || _fail "mount failed: $mnt $MOUNT_OPTIONS" > > echo "godown" > -src/godown -v -f $SCRATCH_MNT >> $seq.full > +src/godown -v -f $SCRATCH_MNT >> $seqres.full > > echo "unmount" > umount $SCRATCH_MNT > @@ -108,7 +109,7 @@ echo "logprint after going down..." > _print_logstate > > echo "logprint to check for CLEAR_AGI_BUCKET..." > -if _scratch_xfs_logprint -t | tee -a $seq.full | grep CLEAR; then > +if _scratch_xfs_logprint -t | tee -a $seqres.full | grep CLEAR; then > echo 'CLEAR_AGI_BUCKET transactions found!!' > echo 'Are you running with an old xfs kernel - where the bug still exists?' > else > @@ -116,7 +117,7 @@ else > fi > > # clean up dirty log with log recovery on mount > -_scratch_mount >> $seq.full 2>&1 \ > +_scratch_mount >> $seqres.full 2>&1 \ > || _fail "mount failed" > > # should now be peaches > diff --git a/tests/xfs/182 b/tests/xfs/182 > index 33e8010..7495eb1 100755 > --- a/tests/xfs/182 > +++ b/tests/xfs/182 > @@ -24,6 +24,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/183 b/tests/xfs/183 > index 4624ab4..5a7587f 100755 > --- a/tests/xfs/183 > +++ b/tests/xfs/183 > @@ -24,6 +24,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/185 b/tests/xfs/185 > index 928eb24..f00858b 100755 > --- a/tests/xfs/185 > +++ b/tests/xfs/185 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/186 b/tests/xfs/186 > index 2c66026..46cd087 100755 > --- a/tests/xfs/186 > +++ b/tests/xfs/186 > @@ -34,6 +34,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -77,7 +78,7 @@ _rmv_eas() > > _filter_inode() > { > - tee -a $here/$seq.full | \ > + tee -a $here/$seqres.full | \ > sed -e "s/core.forkoff/forkoff/g" | \ > egrep '^u.sfdir2|^a.sfattr|forkoff' | \ > egrep -v 'inumber|parent' > @@ -85,7 +86,7 @@ _filter_inode() > > _filter_version() > { > - tee -a $here/$seq.full | tr ',' '\n' | grep ATTR > + tee -a $here/$seqres.full | tr ',' '\n' | grep ATTR > } > > _print_inode() > @@ -148,7 +149,7 @@ _supported_os Linux > _require_scratch > _require_attrs > > -rm -f $seq.full > +rm -f $seqres.full > > _scratch_mkfs -i attr=2,size=512 -l lazy-count=1 >/dev/null 2>&1 > > diff --git a/tests/xfs/187 b/tests/xfs/187 > index bff0caa..c414017 100755 > --- a/tests/xfs/187 > +++ b/tests/xfs/187 > @@ -28,6 +28,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -43,7 +44,7 @@ _cleanup() > > _filter_version() > { > - tee -a $seq.full | tr ',' '\n' | egrep 'ATTR|MORE|LAZY' > + tee -a $seqres.full | tr ',' '\n' | egrep 'ATTR|MORE|LAZY' > } > > # get standard environment, filters and checks > @@ -58,7 +59,7 @@ _supported_os Linux > _require_scratch > _require_attrs > > -rm -f $seq.full > +rm -f $seqres.full > > # lazysb and attr2 are in features2 and will require morebitsbit on > # So test with lazysb and without it to see if the morebitsbit is > diff --git a/tests/xfs/188 b/tests/xfs/188 > index 4ebbfc1..a8fe431 100755 > --- a/tests/xfs/188 > +++ b/tests/xfs/188 > @@ -30,6 +30,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -57,7 +58,7 @@ if [ $XFSPROGS_VERSION -lt 21000 ]; then > fi > > _require_scratch > -rm -f $seq.full > +rm -f $seqres.full > > _scratch_mkfs -n version=ci >/dev/null 2>&1 > _scratch_mount > diff --git a/tests/xfs/189 b/tests/xfs/189 > index a5a5682..24cc29e 100755 > --- a/tests/xfs/189 > +++ b/tests/xfs/189 > @@ -24,6 +24,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -220,5 +221,5 @@ _test_remount_barrier > > # success, all done > echo "*** done" > -rm -f $seq.full > +rm -f $seqres.full > status=0 > diff --git a/tests/xfs/190 b/tests/xfs/190 > index 5bb4743..c760ee6 100755 > --- a/tests/xfs/190 > +++ b/tests/xfs/190 > @@ -35,12 +35,13 @@ filesize=10 > filename=test-190 > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > tmp=/tmp/$$ > status=0 # success is the default! > -rm -f $seq.full > +rm -f $seqres.full > > # get standard environment, filters and checks > . ./common.rc > @@ -55,20 +56,20 @@ _scratch_mkfs_xfs >/dev/null 2>&1 > _scratch_mount > fsblocksize=`xfs_info $SCRATCH_MNT|sed 's/=/ /g'|awk '/^data / { print $3 }'` > > -dd if=/dev/zero of=$SCRATCH_MNT/$filename bs=1024k count=10 >> $seq.full 2>&1 > +dd if=/dev/zero of=$SCRATCH_MNT/$filename bs=1024k count=10 >> $seqres.full 2>&1 > > # run DMAPI test using verbose output > echo Punching holes in file > -echo Punching holes in file >> $seq.full > +echo Punching holes in file >> $seqres.full > for i in $holes ; do > - echo xfs_io -c "unresvsp `echo $i |$SED_PROG 's/:/ /g'`" $SCRATCH_MNT/$filename >> $seq.full > + echo xfs_io -c "unresvsp `echo $i |$SED_PROG 's/:/ /g'`" $SCRATCH_MNT/$filename >> $seqres.full > xfs_io -c "unresvsp `echo $i |$SED_PROG 's/:/ /g'`" $SCRATCH_MNT/$filename ; > done > > echo Verifying holes are in the correct spots: > > xfs_bmap=`xfs_bmap $SCRATCH_MNT/$filename` > -xfs_bmap $SCRATCH_MNT/$filename >> $seq.full > +xfs_bmap $SCRATCH_MNT/$filename >> $seqres.full > for i in $holes ; do > holeStart=$[`echo $i|$SED_PROG 's/:/ /g'|awk '{print $1}'`]; > holeEnd=$[`echo $i|$SED_PROG 's/:/ /g'|awk '{print $2}'`]; > @@ -83,7 +84,7 @@ for i in $holes ; do > #xfs_bmap prints holes in the following format > # 1: [8..15]: hole > bmap="\[$[$holeStart/512]..$[($holeEnd/512) -1]\]"; > - echo $bmap >> $seq.full > + echo $bmap >> $seqres.full > if [ $holeEnd == $holeStart ] ; then > continue #there is no hole > fi > diff --git a/tests/xfs/191 b/tests/xfs/191 > index 3120dcb..d3b227c 100755 > --- a/tests/xfs/191 > +++ b/tests/xfs/191 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -41,7 +42,7 @@ _supported_fs xfs > _supported_os Linux > > _require_scratch > -_scratch_mkfs_xfs -i nfs4acl 1>$tmp.mkfs 2>$seq.full > +_scratch_mkfs_xfs -i nfs4acl 1>$tmp.mkfs 2>$seqres.full > if [ $? -ne 0 ] > then > _notrun "no mkfs support for NFS v4 ACLs" > @@ -53,7 +54,7 @@ then > _notrun "no kernel mount support for NFS v4 ACLs" > fi > > -set_prog_path nfs4acl >>$seq.full > +set_prog_path nfs4acl >>$seqres.full > if [ $? -ne 0 ] > then > _notrun "no nfs4acl utility found" > diff --git a/tests/xfs/194 b/tests/xfs/194 > index 595da25..4609a17 100755 > --- a/tests/xfs/194 > +++ b/tests/xfs/194 > @@ -22,6 +22,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -44,7 +45,7 @@ _supported_fs xfs > _supported_os IRIX Linux > > # real QA test starts here > -rm -f $seq.full > +rm -f $seqres.full > > # For this test we use block size = 1/8 page size > pgsize=`$here/src/feature -s` > @@ -63,7 +64,7 @@ blksize=`expr $pgsize / 8` > > _filter_bmap() > { > - tee -a $seq.full | \ > + tee -a $seqres.full | \ > sed "s#$SCRATCH_MNT#SCRATCH_MNT#g" | \ > awk \ > '$3 ~ /hole/ { print $1 "\t" $3 "\t" ($4 * 512) / blksize; next } > @@ -75,7 +76,7 @@ _filter_bmap() > # Filter out offsets, which vary by blocksize > _filter_od() > { > - tee -a $seq.full | \ > + tee -a $seqres.full | \ > sed -e "s/^[0-9A-Fa-f ]\{7,8\}//" > } > > @@ -118,12 +119,12 @@ xfs_io \ > -c "pwrite -S 0x11 -b `expr $pgsize / 2` 0 `expr $pgsize / 2`" \ > -c "truncate `expr $blksize / 2`" \ > -c "truncate $pgsize" \ > --t -f $SCRATCH_MNT/testfile1 >> $seq.full > +-t -f $SCRATCH_MNT/testfile1 >> $seqres.full > > # directio read of entire file > xfs_io \ > -c "pread 0 $pgsize" \ > --d $SCRATCH_MNT/testfile1 >> $seq.full > +-d $SCRATCH_MNT/testfile1 >> $seqres.full > > xfs_bmap -v $SCRATCH_MNT/testfile1 | _filter_bmap > od -x $SCRATCH_MNT/testfile1 | _filter_od > @@ -137,12 +138,12 @@ xfs_io \ > -c "truncate `expr $blksize / 2`" \ > -c "truncate $pgsize" \ > -c "pwrite -S 0x22 -b $blksize `expr $blksize \* 4` $blksize" \ > --t -f $SCRATCH_MNT/testfile2 >> $seq.full > +-t -f $SCRATCH_MNT/testfile2 >> $seqres.full > > # directio read of entire file > xfs_io \ > -c "pread 0 $pgsize" \ > --d $SCRATCH_MNT/testfile2 >> $seq.full > +-d $SCRATCH_MNT/testfile2 >> $seqres.full > > xfs_bmap -v $SCRATCH_MNT/testfile2 | _filter_bmap > od -x $SCRATCH_MNT/testfile2 | _filter_od > @@ -187,7 +188,7 @@ xfs_io \ > -c "truncate `expr $blksize / 2`" \ > -c "truncate `expr $blksize + 1`" \ > -c "pwrite -S 0x22 -b $blksize `expr $pgsize / 2` $blksize" \ > --t -d -f $SCRATCH_MNT/testfile3 >> $seq.full > +-t -d -f $SCRATCH_MNT/testfile3 >> $seqres.full > > xfs_bmap -v $SCRATCH_MNT/testfile3 | _filter_bmap > od -x $SCRATCH_MNT/testfile3 | _filter_od > @@ -207,7 +208,7 @@ xfs_io \ > -c "truncate `expr $blksize + 1`" \ > -c "pwrite -S 0x22 -b $blksize `expr $pgsize / 2` $blksize" \ > -c "pwrite -S 0x33 -b 512 `expr $blksize \* 2` 512" \ > --t -d -f $SCRATCH_MNT/testfile4 >> $seq.full > +-t -d -f $SCRATCH_MNT/testfile4 >> $seqres.full > > xfs_bmap -v $SCRATCH_MNT/testfile4 | _filter_bmap > od -x $SCRATCH_MNT/testfile4 | _filter_od > diff --git a/tests/xfs/195 b/tests/xfs/195 > index cd64db1..e0755f4 100755 > --- a/tests/xfs/195 > +++ b/tests/xfs/195 > @@ -24,6 +24,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -82,5 +83,5 @@ _do_dump > > # success, all done > echo "*** done" > -rm -f $seq.full > +rm -f $seqres.full > status=0 > diff --git a/tests/xfs/196 b/tests/xfs/196 > index 321fe47..20b20b2 100755 > --- a/tests/xfs/196 > +++ b/tests/xfs/196 > @@ -25,6 +25,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -93,5 +94,5 @@ done > > # success, all done > echo "*** done" > -rm -f $seq.full > +rm -f $seqres.full > status=0 > diff --git a/tests/xfs/197 b/tests/xfs/197 > index 8c2ebd2..b17ea37 100755 > --- a/tests/xfs/197 > +++ b/tests/xfs/197 > @@ -28,6 +28,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -61,5 +62,5 @@ src/t_dir_offset $TEST_DIR/ttt > > # success, all done > echo "*** done" > -rm -f $seq.full > +rm -f $seqres.full > status=0 > diff --git a/tests/xfs/199 b/tests/xfs/199 > index 127f307..fbca7c6 100755 > --- a/tests/xfs/199 > +++ b/tests/xfs/199 > @@ -25,6 +25,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -86,5 +87,5 @@ xfs_db -x $SCRATCH_DEV -c 'sb' -c 'print features2' > > # success, all done > echo "*** done" > -rm -f $seq.full > +rm -f $seqres.full > status=0 > diff --git a/tests/xfs/200 b/tests/xfs/200 > index 34139cc..a70fcfe 100755 > --- a/tests/xfs/200 > +++ b/tests/xfs/200 > @@ -22,6 +22,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -121,5 +122,5 @@ _scratch_mount -o ro 2>&1 | _filter_scratch > > # success, all done > echo "*** done" > -rm -f $seq.full > +rm -f $seqres.full > status=0 > diff --git a/tests/xfs/201 b/tests/xfs/201 > index e868d99..3f5b1fb 100755 > --- a/tests/xfs/201 > +++ b/tests/xfs/201 > @@ -25,6 +25,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -94,5 +95,5 @@ sync > > # success, all done > echo "*** done" > -rm -f $seq.full > +rm -f $seqres.full > status=0 > diff --git a/tests/xfs/202 b/tests/xfs/202 > index 27f9e67..b0591d3 100755 > --- a/tests/xfs/202 > +++ b/tests/xfs/202 > @@ -22,6 +22,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -56,5 +57,5 @@ _scratch_xfs_repair -o force_geometry 2>&1 | _filter_repair > > # success, all done > echo "*** done" > -rm -f $seq.full > +rm -f $seqres.full > status=0 > diff --git a/tests/xfs/203 b/tests/xfs/203 > index ed89600..98ee792 100755 > --- a/tests/xfs/203 > +++ b/tests/xfs/203 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -61,7 +62,7 @@ _cleanup() > } > trap "_cleanup; exit \$status" 0 1 2 3 15 > > -rm -f $seq.full > +rm -f $seqres.full > > # get standard environment, filters and checks > . ./common.rc > diff --git a/tests/xfs/205 b/tests/xfs/205 > index 7c953db..8b973c2 100755 > --- a/tests/xfs/205 > +++ b/tests/xfs/205 > @@ -22,6 +22,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -38,14 +39,14 @@ _supported_os Linux > > _require_scratch > > -rm -f $seq.full > +rm -f $seqres.full > > -_scratch_mkfs_xfs -d size=16m -b size=512 >> $seq.full 2>&1 > +_scratch_mkfs_xfs -d size=16m -b size=512 >> $seqres.full 2>&1 > _scratch_mount > > # fix the reserve block pool to a known size so that the enospc calculations > # work out correctly. > -_scratch_resvblks 1024 >> $seq.full 2>&1 > +_scratch_resvblks 1024 >> $seqres.full 2>&1 > > # on a 16MB filesystem, there's 32768x512byte blocks. used is: > # - 4944 in the log, > diff --git a/tests/xfs/206 b/tests/xfs/206 > index 1c25305..7f822cc 100755 > --- a/tests/xfs/206 > +++ b/tests/xfs/206 > @@ -28,6 +28,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -58,7 +59,7 @@ if [ "$bitsperlong" -ne 64 ]; then > _notrun "This test is only valid on 64 bit machines" > fi > > -rm -f $seq.full > +rm -f $seqres.full > > tmpfile=$TEST_DIR/fsfile.$$ > tmpdir=$TEST_DIR/tmpdir.$$ > diff --git a/tests/xfs/216 b/tests/xfs/216 > index a997d5a..486bd9d 100755 > --- a/tests/xfs/216 > +++ b/tests/xfs/216 > @@ -22,6 +22,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/217 b/tests/xfs/217 > index b33c2e7..25d3a15 100755 > --- a/tests/xfs/217 > +++ b/tests/xfs/217 > @@ -22,6 +22,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/220 b/tests/xfs/220 > index 061b395..a696aa0 100755 > --- a/tests/xfs/220 > +++ b/tests/xfs/220 > @@ -26,6 +26,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/222 b/tests/xfs/222 > index 133f221..bb22756 100755 > --- a/tests/xfs/222 > +++ b/tests/xfs/222 > @@ -26,6 +26,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -49,7 +50,7 @@ _supported_os Linux > > [ "$XFS_FSR_PROG" = "" ] && _notrun "xfs_fsr not found" > > -xfs_fsr -d -v $TEST_MNT > $seq.full 2>&1 > +xfs_fsr -d -v $TEST_MNT > $seqres.full 2>&1 > > echo "--- silence is golden ---" > status=0 ; exit > diff --git a/tests/xfs/227 b/tests/xfs/227 > index 8403724..650c72e 100755 > --- a/tests/xfs/227 > +++ b/tests/xfs/227 > @@ -28,6 +28,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -50,7 +51,7 @@ _supported_fs xfs > _supported_os Linux > _require_scratch > > -rm -f $seq.full > +rm -f $seqres.full > > [ "$XFS_FSR_PROG" = "" ] && _notrun "xfs_fsr not found" > > @@ -152,10 +153,10 @@ create_target_attr_last() > create_attrs $nattrs $target > } > > -rm -f $seq.full > +rm -f $seqres.full > > # use a small filesystem so we can control freespace easily > -_scratch_mkfs_sized $((50 * 1024 * 1024)) >> $seq.full 2>&1 > +_scratch_mkfs_sized $((50 * 1024 * 1024)) >> $seqres.full 2>&1 > _scratch_mount > fragment_freespace > > @@ -187,20 +188,20 @@ _scratch_mount > > targ=$SCRATCH_MNT/fsr_test_file.$$ > for n in `seq 4 1 12`; do > - echo "*** n == $n ***" >> $seq.full > + echo "*** n == $n ***" >> $seqres.full > for i in `seq 5 1 15`; do > for j in `seq 5 1 20`; do > - create_target_attr_first $i $j $targ.$i.$j >> $seq.full 2>&1 > + create_target_attr_first $i $j $targ.$i.$j >> $seqres.full 2>&1 > done > - xfs_bmap -vp $targ.$i.* >> $seq.full 2>&1 > - FSRXFSTEST=true xfs_fsr -d -v -C $n $targ.$i.* >> $seq.full 2>&1 > - xfs_bmap -vp $targ.$i.* >> $seq.full 2>&1 > + xfs_bmap -vp $targ.$i.* >> $seqres.full 2>&1 > + FSRXFSTEST=true xfs_fsr -d -v -C $n $targ.$i.* >> $seqres.full 2>&1 > + xfs_bmap -vp $targ.$i.* >> $seqres.full 2>&1 > for j in `seq 5 1 20`; do > - create_target_attr_last $i $j $targ.$i.$j >> $seq.full 2>&1 > + create_target_attr_last $i $j $targ.$i.$j >> $seqres.full 2>&1 > done > - xfs_bmap -vp $targ.$i.* >> $seq.full 2>&1 > - FSRXFSTEST=true xfs_fsr -d -v -C $n $targ.$i.* >> $seq.full 2>&1 > - xfs_bmap -vp $targ.$i.* >> $seq.full 2>&1 > + xfs_bmap -vp $targ.$i.* >> $seqres.full 2>&1 > + FSRXFSTEST=true xfs_fsr -d -v -C $n $targ.$i.* >> $seqres.full 2>&1 > + xfs_bmap -vp $targ.$i.* >> $seqres.full 2>&1 > done > done > > diff --git a/tests/xfs/229 b/tests/xfs/229 > index 52be5c3..eef6a2d 100755 > --- a/tests/xfs/229 > +++ b/tests/xfs/229 > @@ -29,6 +29,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/238 b/tests/xfs/238 > index e1a8749..00dd620 100755 > --- a/tests/xfs/238 > +++ b/tests/xfs/238 > @@ -22,6 +22,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/242 b/tests/xfs/242 > index eb5f9df..6476d5a 100755 > --- a/tests/xfs/242 > +++ b/tests/xfs/242 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/244 b/tests/xfs/244 > index c96d4eb..566caaa 100755 > --- a/tests/xfs/244 > +++ b/tests/xfs/244 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -51,7 +52,7 @@ _require_projid32bit > export MOUNT_OPTIONS="-opquota" > > # make fs with no projid32bit > -_scratch_mkfs_xfs -i projid32bit=0 >> $seq.full || _fail "mkfs failed" > +_scratch_mkfs_xfs -i projid32bit=0 >> $seqres.full || _fail "mkfs failed" > _qmount > # make sure project quota is supported > _require_prjquota ${SCRATCH_DEV} > @@ -68,7 +69,7 @@ mkdir $dir > touch $dir/below16bit > # below 16bit value > $XFS_QUOTA_PROG -x -c "project -s -p $dir/below16bit 3422" $SCRATCH_DEV \ > - >> $seq.full > + >> $seqres.full > projid=$($XFS_IO_PROG -r -c "lsproj" $dir/below16bit) > if [ "projid = 3422" != "$projid" ]; then > echo "FAIL: projid32bit disabled: returned projid value ($projid)" > @@ -79,7 +80,7 @@ fi > # 32bit value, should fail > touch $dir/over16bit > if $XFS_QUOTA_PROG -x -c "project -s -p $dir/over16bit 108545" $SCRATCH_DEV \ > - >> $seq.full 2>&1; then > + >> $seqres.full 2>&1; then > echo "FAIL: projid32bit disabled: setting 32bit projid succeeded" > echo " while it should fail" > status=1 > @@ -87,7 +88,7 @@ fi > > # over 32bit value, should fail > touch $dir/over32bit > -if $XFS_QUOTA_PROG -x -c "project -s -p $dir/over32bit 5344967296" $SCRATCH_DEV >> $seq.full 2>&1; then > +if $XFS_QUOTA_PROG -x -c "project -s -p $dir/over32bit 5344967296" $SCRATCH_DEV >> $seqres.full 2>&1; then > echo "FAIL: projid32bit disabled: setting over 32bit projid succeeded" > echo " while it should fail" > status=1 > @@ -95,14 +96,14 @@ fi > > # Do testing on filesystem with projid32bit feature enabled > umount $SCRATCH_DEV 2>/dev/null > -_scratch_mkfs_xfs -i projid32bit=1 >> $seq.full || _fail "mkfs failed" > +_scratch_mkfs_xfs -i projid32bit=1 >> $seqres.full || _fail "mkfs failed" > _qmount > mkdir $dir > > touch $dir/below16bit > # below 16bit value, should succeed > $XFS_QUOTA_PROG -x -c "project -s -p $dir/below16bit 3422" $SCRATCH_DEV \ > - >> $seq.full > + >> $seqres.full > projid=$($XFS_IO_PROG -r -c "lsproj" $dir/below16bit) > if [ "projid = 3422" != "$projid" ]; then > echo "FAIL: projid32bit enabled: returned projid value ($projid)" > @@ -113,7 +114,7 @@ fi > # 32bit value, should succeed > touch $dir/over16bit > if $XFS_QUOTA_PROG -x -c "project -s -p $dir/over16bit 108545" $SCRATCH_DEV \ > - >> $seq.full 2>&1; then > + >> $seqres.full 2>&1; then > projid=$($XFS_IO_PROG -r -c "lsproj" $dir/over16bit) > if [ "projid = 108545" != "$projid" ]; then > echo "FAIL: projid32bit enabled: returned projid value ($projid)" > @@ -129,7 +130,7 @@ fi > # over 32bit value, should fail > touch $dir/over32bit > if $XFS_QUOTA_PROG -x -c "project -s -p $dir/over32bit 5344967296" $SCRATCH_DEV \ > - >> $seq.full 2>&1; then > + >> $seqres.full 2>&1; then > echo "FAIL: projid32bit enabled: setting over 32bit projid succeeded" > echo " while it should fail" > status=1 > diff --git a/tests/xfs/250 b/tests/xfs/250 > index 2dd12e8..a6edc2d 100755 > --- a/tests/xfs/250 > +++ b/tests/xfs/250 > @@ -22,6 +22,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/252 b/tests/xfs/252 > index 9f0424d..be3bfcf 100755 > --- a/tests/xfs/252 > +++ b/tests/xfs/252 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/253 b/tests/xfs/253 > index b63b7f6..b73cf6d 100755 > --- a/tests/xfs/253 > +++ b/tests/xfs/253 > @@ -33,6 +33,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/259 b/tests/xfs/259 > index 91503a0..6a29230 100755 > --- a/tests/xfs/259 > +++ b/tests/xfs/259 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > status=1 # failure is the default! > diff --git a/tests/xfs/261 b/tests/xfs/261 > index 8903ec8..7c575aa 100755 > --- a/tests/xfs/261 > +++ b/tests/xfs/261 > @@ -26,6 +26,7 @@ > # > > seq=$(basename $0) > +seqres=$RESULT_DIR/$seq > echo "QA output created by ${seq}" > > here=$(pwd) > diff --git a/tests/xfs/262 b/tests/xfs/262 > index 5a060f1..2ed7123 100755 > --- a/tests/xfs/262 > +++ b/tests/xfs/262 > @@ -27,6 +27,7 @@ > # > > seq=$(basename $0) > +seqres=$RESULT_DIR/$seq > echo "QA output created by ${seq}" > > here=$(pwd) > diff --git a/tests/xfs/266 b/tests/xfs/266 > index 89c590f..3efbb75 100755 > --- a/tests/xfs/266 > +++ b/tests/xfs/266 > @@ -22,6 +22,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/267 b/tests/xfs/267 > index c52d810..05360a9 100755 > --- a/tests/xfs/267 > +++ b/tests/xfs/267 > @@ -22,6 +22,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/268 b/tests/xfs/268 > index 36391a3..c0c45f2 100755 > --- a/tests/xfs/268 > +++ b/tests/xfs/268 > @@ -24,6 +24,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/278 b/tests/xfs/278 > index 559e174..6439eb4 100755 > --- a/tests/xfs/278 > +++ b/tests/xfs/278 > @@ -25,6 +25,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -60,22 +61,22 @@ _scratch_unmount > echo "Silence is goodness..." > > # Corrupt DIR > -xfs_db -x -c "inode $DIR_INO" -c "write u.sfdir2.list[0].inumber.i4 0" $SCRATCH_DEV >> $seq.full > -xfs_db -x -c "inode $DIR_INO" -c "write u.sfdir2.list[0].name 0" $SCRATCH_DEV >> $seq.full > -xfs_db -x -c "inode $DIR_INO" -c "write u.sfdir2.list[0].offset 0" $SCRATCH_DEV >> $seq.full > -xfs_db -x -c "inode $DIR_INO" -c "write u.sfdir2.list[0].namelen 0" $SCRATCH_DEV >> $seq.full > -xfs_db -x -c "inode $DIR_INO" -c "write u.sfdir2.hdr.parent.i4 0" $SCRATCH_DEV >> $seq.full > -xfs_db -x -c "inode $DIR_INO" -c "write core.nlinkv2 0" $SCRATCH_DEV >> $seq.full > +xfs_db -x -c "inode $DIR_INO" -c "write u.sfdir2.list[0].inumber.i4 0" $SCRATCH_DEV >> $seqres.full > +xfs_db -x -c "inode $DIR_INO" -c "write u.sfdir2.list[0].name 0" $SCRATCH_DEV >> $seqres.full > +xfs_db -x -c "inode $DIR_INO" -c "write u.sfdir2.list[0].offset 0" $SCRATCH_DEV >> $seqres.full > +xfs_db -x -c "inode $DIR_INO" -c "write u.sfdir2.list[0].namelen 0" $SCRATCH_DEV >> $seqres.full > +xfs_db -x -c "inode $DIR_INO" -c "write u.sfdir2.hdr.parent.i4 0" $SCRATCH_DEV >> $seqres.full > +xfs_db -x -c "inode $DIR_INO" -c "write core.nlinkv2 0" $SCRATCH_DEV >> $seqres.full > > # Corrupt SUBDIR > -xfs_db -x -c "inode $SUBDIR_INO" -c "write u.sfdir2.hdr.parent.i4 0" $SCRATCH_DEV >> $seq.full > -xfs_db -x -c "inode $SUBDIR_INO" -c "write core.nlinkv2 0" $SCRATCH_DEV >> $seq.full > +xfs_db -x -c "inode $SUBDIR_INO" -c "write u.sfdir2.hdr.parent.i4 0" $SCRATCH_DEV >> $seqres.full > +xfs_db -x -c "inode $SUBDIR_INO" -c "write core.nlinkv2 0" $SCRATCH_DEV >> $seqres.full > > -echo "===== BEGIN of xfs_repair =====" >> $seq.full > -echo "" >>$seq.full > +echo "===== BEGIN of xfs_repair =====" >> $seqres.full > +echo "" >>$seqres.full > > -xfs_repair $SCRATCH_DEV >> $seq.full 2>&1 > -echo "===== END of xfs_repair =====" >> $seq.full > +xfs_repair $SCRATCH_DEV >> $seqres.full 2>&1 > +echo "===== END of xfs_repair =====" >> $seqres.full > > #if _check_scratch_fs; then > # status=0 > diff --git a/tests/xfs/279 b/tests/xfs/279 > index 8ee3328..e96c823 100755 > --- a/tests/xfs/279 > +++ b/tests/xfs/279 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -48,7 +49,7 @@ _supported_os Linux > > _require_scsi_debug > > -rm -f $seq.full > +rm -f $seqres.full > > # Remove xfs signature so -f isn't needed to re-mkfs > _wipe_device() > @@ -67,7 +68,7 @@ _check_mkfs() > return > fi > echo "Passed." > - cat $tmp.mkfs.full | _filter_mkfs >> $seq.full 2>$tmp.mkfs > + cat $tmp.mkfs.full | _filter_mkfs >> $seqres.full 2>$tmp.mkfs > . $tmp.mkfs > echo "Got sector size: $sectsz" > device=`echo $@ | awk '{print $NF}'` > @@ -83,7 +84,7 @@ SCSI_DEBUG_DEV=`_get_scsi_debug_dev 4096 512 0 128` > _check_mkfs $SCSI_DEBUG_DEV > # blocksize smaller than physical sectorsize should revert to logical sectorsize > _check_mkfs -b size=2048 -f $SCSI_DEBUG_DEV > -) | tee -a $seq.full > +) | tee -a $seqres.full > _put_scsi_debug_dev > > # === 4k physical 512b logical unaligned > @@ -99,7 +100,7 @@ _check_mkfs -f $SCSI_DEBUG_DEV > _check_mkfs -s size=4096 $SCSI_DEBUG_DEV > # with 4k sector specified should fall back to logical sector size with force > _check_mkfs -s size=4096 -f $SCSI_DEBUG_DEV > -) | tee -a $seq.full > +) | tee -a $seqres.full > _put_scsi_debug_dev > > # === hard 4k physical / 4k logical > @@ -111,7 +112,7 @@ SCSI_DEBUG_DEV=`_get_scsi_debug_dev 4096 4096 0 128` > _check_mkfs -b size=2048 $SCSI_DEBUG_DEV > # sector size smaller than physical sector size should fail > _check_mkfs -s size=512 $SCSI_DEBUG_DEV > -) | tee -a $seq.full > +) | tee -a $seqres.full > _put_scsi_debug_dev > > status=0 > diff --git a/tests/xfs/281 b/tests/xfs/281 > index 2af3533..7aae2a5 100755 > --- a/tests/xfs/281 > +++ b/tests/xfs/281 > @@ -23,6 +23,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > diff --git a/tests/xfs/282 b/tests/xfs/282 > index 4938408..0680b9c 100755 > --- a/tests/xfs/282 > +++ b/tests/xfs/282 > @@ -25,6 +25,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -45,13 +46,13 @@ _require_legacy_v2_format > _create_dumpdir_fill > # ensure file/dir timestamps precede dump timestamp > sleep 2 > -src/bstat $SCRATCH_MNT >>$here/$seq.full > +src/bstat $SCRATCH_MNT >>$here/$seqres.full > > echo "*** Level 0 dump, format 2" > _do_dump_file -f $tmp.l0 -K > > _append_dumpdir_fill > -src/bstat $SCRATCH_MNT >>$here/$seq.full > +src/bstat $SCRATCH_MNT >>$here/$seqres.full > > echo "*** Level 1 dump, current format" > _do_dump_file -l 1 -f $tmp.l1 > diff --git a/tests/xfs/283 b/tests/xfs/283 > index d1ce8ad..75ee26e 100755 > --- a/tests/xfs/283 > +++ b/tests/xfs/283 > @@ -25,6 +25,7 @@ > # > > seq=`basename $0` > +seqres=$RESULT_DIR/$seq > echo "QA output created by $seq" > > here=`pwd` > @@ -45,13 +46,13 @@ _require_legacy_v2_format > _create_dumpdir_fill > # ensure file/dir timestamps precede dump timestamp > sleep 2 > -src/bstat $SCRATCH_MNT >>$here/$seq.full > +src/bstat $SCRATCH_MNT >>$here/$seqres.full > > echo "*** Level 0 dump, current format" > _do_dump_file -f $tmp.l0 > > _append_dumpdir_fill > -src/bstat $SCRATCH_MNT >>$here/$seq.full > +src/bstat $SCRATCH_MNT >>$here/$seqres.full > > echo "*** Level 1 dump, format 2" > _do_dump_file -l 1 -f $tmp.l1 -K Quite a lot of tests use $here/$seq.full. This results in $here/$seqres.full after the sed. $seqres is just a $RESULT_DIR/$seq. This would break if RESULT_DIR was set to an absolute path instead of relative path. This sed command could probably be better for the conversion: sed -i -e '/^seq=.*$/a seqres=$RESULT_DIR/$seq' -e 's/[^/]seq.full/seqres.full/' -e 's;here/\$seq;RESULT_DIR/\$seq;g' tests/*/* From bfoster@redhat.com Wed Sep 5 07:22:31 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q85CMVsm044460 for ; Wed, 5 Sep 2012 07:22:31 -0500 X-ASG-Debug-ID: 1346847809-04cb6c2361141ad0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id rRTuB6H5fV3553fT for ; Wed, 05 Sep 2012 05:23:29 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q85CNSXZ001778 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 5 Sep 2012 08:23:28 -0400 Received: from laptop.bfoster (vpn-9-102.rdu.redhat.com [10.11.9.102]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id q85CNRVC011240 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Wed, 5 Sep 2012 08:23:28 -0400 Message-ID: <504743E8.7040500@redhat.com> Date: Wed, 05 Sep 2012 08:22:00 -0400 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:14.0) Gecko/20120717 Thunderbird/14.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [RFC PATCH 2/4] xfs: create function to scan and clear EOFBLOCKS inodes References: <1346097111-4476-1-git-send-email-bfoster@redhat.com> <1346097111-4476-3-git-send-email-bfoster@redhat.com> <20120903050612.GR15292@dastard> <50460BB8.1060701@redhat.com> <20120905064202.GG15292@dastard> X-ASG-Orig-Subj: Re: [RFC PATCH 2/4] xfs: create function to scan and clear EOFBLOCKS inodes In-Reply-To: <20120905064202.GG15292@dastard> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1346847809 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com On 09/05/2012 02:42 AM, Dave Chinner wrote: > On Tue, Sep 04, 2012 at 10:10:00AM -0400, Brian Foster wrote: >> On 09/03/2012 01:06 AM, Dave Chinner wrote: >>> On Mon, Aug 27, 2012 at 03:51:49PM -0400, Brian Foster wrote: >> ... >>>> +/* >>>> + * Handle an EOFBLOCKS tagged inode. If this is a forced scan, we wait on the >>>> + * iolock ourselves rather than rely on the trylock in xfs_free_eofblocks(). >>>> + * >>>> + * We rely on the output parameter from xfs_free_eofblocks() to determine >>>> + * whether we should clear the tag because in the trylock case, it could have >>>> + * skipped the inode due to lock contention. >>>> + */ >>>> +STATIC int >>>> +xfs_inode_free_eofblocks( >>>> + struct xfs_inode *ip, >>>> + int flags) >>>> +{ >>>> + int ret = 0; >>>> + bool freed = false; >>>> + bool wait_iolock = (flags & EOFBLOCKS_WAIT) ? true : false; >>>> + >>>> + if (wait_iolock) >>>> + xfs_ilock(ip, XFS_IOLOCK_EXCL); >>> >>> Why do we need the IO lock here? xfs_free_eofblocks() does all the >>> necessary locking.... >>> >> >> This was for the wait case (e.g., xfs_free_eofblocks() does a trylock >> on the IO lock and we want to wait for the lock in this case). > > Does it really matter if we can't get the iolock and skip the inode? > Well I thought that was the point of the force/wait scan as opposed to the best effort scan. But... > Note that xfs_inode_ag_walk() will keep a skipped count if you > return EAGAIN, and re-run the walk on the AG if any inodes are > skipped. This is done to prevent blocking on locks slowing down the > scan - instead of blocking we move on to the next inode, and revist > the blocked inodes again in a later pass. > > IOWs, if you convert the code to use the generic walk and make > xfs_free_eofblocks() return EAGAIN when it can't get the io lock, > you get the retry for free... > This sounds more efficient. ;) I'll move it to this approach. Thanks. Brian > Cheers, > > Dave. > From bfoster@redhat.com Wed Sep 5 07:22:38 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q85CMcMC044473 for ; Wed, 5 Sep 2012 07:22:38 -0500 X-ASG-Debug-ID: 1346847816-04bdf078fd132a70001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id UizVgI7HwApTgTgT for ; Wed, 05 Sep 2012 05:23:36 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q85CNZ3M001790 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 5 Sep 2012 08:23:36 -0400 Received: from laptop.bfoster (vpn-9-102.rdu.redhat.com [10.11.9.102]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q85CNYLw001134 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Wed, 5 Sep 2012 08:23:35 -0400 Message-ID: <504743F0.1050802@redhat.com> Date: Wed, 05 Sep 2012 08:22:08 -0400 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:14.0) Gecko/20120717 Thunderbird/14.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [RFC PATCH 3/4] xfs: add FREE_EOFBLOCKS ioctl References: <1346097111-4476-1-git-send-email-bfoster@redhat.com> <1346097111-4476-4-git-send-email-bfoster@redhat.com> <20120903051742.GS15292@dastard> <50460BDB.40806@redhat.com> <20120905064944.GH15292@dastard> X-ASG-Orig-Subj: Re: [RFC PATCH 3/4] xfs: add FREE_EOFBLOCKS ioctl In-Reply-To: <20120905064944.GH15292@dastard> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1346847816 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com On 09/05/2012 02:49 AM, Dave Chinner wrote: > On Tue, Sep 04, 2012 at 10:10:35AM -0400, Brian Foster wrote: >> On 09/03/2012 01:17 AM, Dave Chinner wrote: >>> On Mon, Aug 27, 2012 at 03:51:50PM -0400, Brian Foster wrote: ... >> This is something I see throughout the code that I haven't quite >> followed (i.e., using the _t typedefs vs. not). Is the general consensus >> to move away from typedefs when possible? > > Yes. The Irix code that XFS came from was full of typedefs - part > of it was to try to strictly type check things that were the same > storage size or on-disk vs in-memory. We've got other ways of doing > that better (e.g. the endian checking sparse does), and typedefs > are generally frowned upon in the main kernel code because they > often obfuscate the code rather than improve it, so we're > removing them as we modify code or write new code. > Good to know. ... >> Ok. I was thinking that we could support the ability to scan by uid/gid >> regardless of whether quota is enabled, but perhaps there's no purpose >> to that if a quota isn't enabled. > > I can't really think of a use case for doing this. Making the API > more expansive in future if someone needs this can be done - it's > removing stuff that is really hard to do. Hence, don't add it if it > is not going to be used immediately. :) > Ok. Brian > Cheers, > > Dave. > From bfoster@redhat.com Wed Sep 5 07:22:44 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q85CMijU044486 for ; Wed, 5 Sep 2012 07:22:44 -0500 X-ASG-Debug-ID: 1346847823-04cbb0271a12e530001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id GT6iYikn4raURAe6 for ; Wed, 05 Sep 2012 05:23:43 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q85CNgbd001859 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 5 Sep 2012 08:23:42 -0400 Received: from laptop.bfoster (vpn-9-102.rdu.redhat.com [10.11.9.102]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q85CNfc7029109 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Wed, 5 Sep 2012 08:23:41 -0400 Message-ID: <504743F6.8040606@redhat.com> Date: Wed, 05 Sep 2012 08:22:14 -0400 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:14.0) Gecko/20120717 Thunderbird/14.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [RFC PATCH 4/4] xfs: add background scanning to clear EOFBLOCKS inodes References: <1346097111-4476-1-git-send-email-bfoster@redhat.com> <1346097111-4476-5-git-send-email-bfoster@redhat.com> <20120903052842.GT15292@dastard> <50460BF1.3070100@redhat.com> <20120905070011.GI15292@dastard> X-ASG-Orig-Subj: Re: [RFC PATCH 4/4] xfs: add background scanning to clear EOFBLOCKS inodes In-Reply-To: <20120905070011.GI15292@dastard> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1346847823 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com On 09/05/2012 03:00 AM, Dave Chinner wrote: > On Tue, Sep 04, 2012 at 10:10:57AM -0400, Brian Foster wrote: >> On 09/03/2012 01:28 AM, Dave Chinner wrote: >>> On Mon, Aug 27, 2012 at 03:51:51PM -0400, Brian Foster wrote: ... >> >> Any thoughts on having tunables for both values (time and min size?) on >> the background scanning? > > Well, my suggestion for timing is as per above (xfs_syncd_centisecs > * 100), but I don't really have any good rule of thumb for the > minimum size. What threshold do people start to notice this? > For the testing I've done so far, I'm hitting EDQUOT with 20-30GB of space left while sequentially writing to many large files. I'm really just trying to get used space before failure more in the ball park of the limit, so I'm not going to complain too much over leaving a few hundred MB or so around on an otherwise full quota. ;) From where I sit, the problem is more when we extend a file by 2, 4, 8GB and consume a large amount of limited available space. I suppose for the background scanning, it's more about just using a value that doesn't get in the way of general behavior/performance. I'll do some more testing in this area. > I'd SWAG that something like 32MB is a good size to start at because > most IO subsystems will still be able to reach full bandwidth with > extents of this size when reading files. > > Alternatively, if you can determine if the inode is still in use at > the time of the scan (e.g. elevated reference count due to an open > fd) and skip the truncation for those inodes, then a minimum size is > not really needed, right? > Hmm, good idea. Though perhaps I can use the min_size as a force parameter (i.e., trim anything over this size), and the inode in use check allows a more conservative default. I'll have to play around with the right time/size values some more to get a better feel for it. I'll probably include tunables at least for testing purposes, and they can always be removed later. Thanks. Brian > Cheers, > > Dave. > From tinguely@sgi.com Wed Sep 5 08:16:06 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q85DG6DV052524 for ; Wed, 5 Sep 2012 08:16:06 -0500 Received: from [128.162.232.196] (eagdhcp-232-196.americas.sgi.com [128.162.232.196]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0791930406A; Wed, 5 Sep 2012 06:17:02 -0700 (PDT) Message-ID: <504750CB.2090907@sgi.com> Date: Wed, 05 Sep 2012 08:16:59 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 03/13] xfs: rationalise xfs_mount_wq users References: <1346328017-2795-1-git-send-email-david@fromorbit.com> <1346328017-2795-4-git-send-email-david@fromorbit.com> <504622C1.20201@sgi.com> <20120905043000.GE15292@dastard> In-Reply-To: <20120905043000.GE15292@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/04/12 23:30, Dave Chinner wrote: > On Tue, Sep 04, 2012 at 10:48:17AM -0500, Mark Tinguely wrote: >> On 08/30/12 07:00, Dave Chinner wrote: >>> - /* >>> - * We shouldn't write/force the log if we are in the mount/unmount >>> - * process or on a read only filesystem. The workqueue still needs to be >>> - * active in both cases, however, because it is used for inode reclaim >>> - * during these times. Use the MS_ACTIVE flag to avoid doing anything >>> - * during mount. Doing work during unmount is avoided by calling >>> - * cancel_delayed_work_sync on this work queue before tearing down >>> - * the ail and the log in xfs_log_unmount. >>> - */ >>> - if (!(mp->m_super->s_flags& MS_ACTIVE)&& >>> - !(mp->m_flags& XFS_MOUNT_RDONLY)) { >>> + if (!(mp->m_flags& XFS_MOUNT_RDONLY)) { >>> /* dgc: errors ignored here */ >>> if (mp->m_super->s_writers.frozen == SB_UNFROZEN&& >>> xfs_log_need_covered(mp)) >>> @@ -408,8 +398,7 @@ xfs_sync_worker( >>> else >>> xfs_log_force(mp, 0); >>> >>> - /* start pushing all the metadata that is currently >>> - * dirty */ >>> + /* start pushing all the metadata that is currently dirty */ >>> xfs_ail_push_all(mp->m_ail); >>> } >>> >> >> It appears that the removal of the MS_ACTIVE flag is causing the >> "atomic_read(&bp->b_hold)> 0," ASSERT. > > I must be being slow today - I don't see why that would cause any > problems. The worker is not started at the end of the mount process > after everything is set up (i.e. just before MS_ACTIVE is removed), > and the worker is stopped before anything is torn down. That should > effectively replicate what the MS_ACTIVE flag is providing in the > old code. > > Can you explain in more detail what lead you to this conclusion? > > Cheers, > > Dave. You are correct, it does not make sense, but with the !(mp->m_super->s_flags & MS_ACTIVE) test removed, test 107 causes the above assert on different machines/architectures. Place the test in, the assert does not happen. I will see if I can get it to dump on the x86_32 machine. --Mark. From tinguely@sgi.com Wed Sep 5 09:33:13 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q85EXDZt067172 for ; Wed, 5 Sep 2012 09:33:13 -0500 Received: from [128.162.232.196] (eagdhcp-232-196.americas.sgi.com [128.162.232.196]) by relay2.corp.sgi.com (Postfix) with ESMTP id 64779304048; Wed, 5 Sep 2012 07:34:09 -0700 (PDT) Message-ID: <504762DD.4090205@sgi.com> Date: Wed, 05 Sep 2012 09:34:05 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 03/13] xfs: rationalise xfs_mount_wq users References: <1346328017-2795-1-git-send-email-david@fromorbit.com> <1346328017-2795-4-git-send-email-david@fromorbit.com> <504622C1.20201@sgi.com> <20120905043000.GE15292@dastard> <504750CB.2090907@sgi.com> In-Reply-To: <504750CB.2090907@sgi.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/05/12 08:16, Mark Tinguely wrote: > On 09/04/12 23:30, Dave Chinner wrote: >> On Tue, Sep 04, 2012 at 10:48:17AM -0500, Mark Tinguely wrote: >>> On 08/30/12 07:00, Dave Chinner wrote: >>>> - /* >>>> - * We shouldn't write/force the log if we are in the mount/unmount >>>> - * process or on a read only filesystem. The workqueue still needs >>>> to be >>>> - * active in both cases, however, because it is used for inode reclaim >>>> - * during these times. Use the MS_ACTIVE flag to avoid doing anything >>>> - * during mount. Doing work during unmount is avoided by calling >>>> - * cancel_delayed_work_sync on this work queue before tearing down >>>> - * the ail and the log in xfs_log_unmount. >>>> - */ >>>> - if (!(mp->m_super->s_flags& MS_ACTIVE)&& >>>> - !(mp->m_flags& XFS_MOUNT_RDONLY)) { >>>> + if (!(mp->m_flags& XFS_MOUNT_RDONLY)) { >>>> /* dgc: errors ignored here */ >>>> if (mp->m_super->s_writers.frozen == SB_UNFROZEN&& >>>> xfs_log_need_covered(mp)) >>>> @@ -408,8 +398,7 @@ xfs_sync_worker( >>>> else >>>> xfs_log_force(mp, 0); >>>> >>>> - /* start pushing all the metadata that is currently >>>> - * dirty */ >>>> + /* start pushing all the metadata that is currently dirty */ >>>> xfs_ail_push_all(mp->m_ail); >>>> } >>>> >>> >>> It appears that the removal of the MS_ACTIVE flag is causing the >>> "atomic_read(&bp->b_hold)> 0," ASSERT. >> >> I must be being slow today - I don't see why that would cause any >> problems. The worker is not started at the end of the mount process >> after everything is set up (i.e. just before MS_ACTIVE is removed), >> and the worker is stopped before anything is torn down. That should >> effectively replicate what the MS_ACTIVE flag is providing in the >> old code. >> >> Can you explain in more detail what lead you to this conclusion? >> >> Cheers, >> >> Dave. > > You are correct, it does not make sense, but with the > !(mp->m_super->s_flags & MS_ACTIVE) > test removed, test 107 causes the above assert on > different machines/architectures. Place the test in, the > assert does not happen. > > I will see if I can get it to dump on the x86_32 machine. > > --Mark. Make that xfstest 179. The ASSERT happens right away. I have a dump from x86_32 machine. I will take a quick look at it. --Mark. From rjohnston@sgi.com Wed Sep 5 11:26:08 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_62 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q85GQ8UH086908 for ; Wed, 5 Sep 2012 11:26:08 -0500 Received: from xmail.sgi.com (pv-excas1-dc21-nlb.corp.sgi.com [137.38.102.126]) by relay1.corp.sgi.com (Postfix) with ESMTP id ED7008F8050; Wed, 5 Sep 2012 09:27:04 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.1.339.1; Wed, 5 Sep 2012 11:27:04 -0500 Message-ID: <50477D60.8000604@sgi.com> Date: Wed, 5 Sep 2012 11:27:12 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: Dave Chinner CC: Subject: Re: [PATCH 08/10] xfstests: enable large fs testing on ext4 References: <1343291989-14987-1-git-send-email-david@fromorbit.com> <1343291989-14987-9-git-send-email-david@fromorbit.com> In-Reply-To: <1343291989-14987-9-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] On 07/26/2012 03:39 AM, Dave Chinner wrote: > From: Dave Chinner > > Now that setting up large filesystem testing on sparse loopback > devices uses a generic method for filling the filesystem, extent > support to ext4 filesystems. > > ext4 is slightly more complex to fill as it does not support files > larger than 16TB. Hence a slightly more complex method of using > multiple smaller files to fill the space is necessary. > > WARNING: be prepeared for ext4 to take forever to prepare large > filesystems as allocation of large amounts of space (especially as > it approaches ENOSPC) is can take minutes rather than milliseconds > > Signed-off-by: Dave Chinner > --- > common.rc | 90 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 90 insertions(+) > Looks good. Reviewed-by: Rich Johnston Regards --Rich From bpm@sgi.com Wed Sep 5 16:33:31 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_65 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q85LXUYx135611 for ; Wed, 5 Sep 2012 16:33:30 -0500 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay3.corp.sgi.com (Postfix) with ESMTP id 13FEAAC003; Wed, 5 Sep 2012 14:34:27 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 9BC054266DC; Wed, 5 Sep 2012 16:34:26 -0500 (CDT) Date: Wed, 5 Sep 2012 16:34:26 -0500 From: Ben Myers To: rjohnston@sgi.com Cc: xfs@oss.sgi.com Subject: Re: [PATCH 11/10] xfstests: rework large filesystem testing - add golden output Message-ID: <20120905213426.GL3274@sgi.com> References: <20120831194326.741195404@sgi.com> <1343291989-14987-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1343291989-14987-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.20 (2009-06-14) Hey Rich, On Fri, Aug 31, 2012 at 02:43:27PM -0500, rjohnston@sgi.com wrote: > Patch "rework large filesystem testing" introduces a new option --large-fs > which creates a new file $SCRATCH_MNT/.use_space. If this 10 part patchset is > applied, the following tests will fail: > 019 026 027 028 046 047 050 056 059 060 062 063 064 065 066 > > This patch accounts for the following new output when testing xfs filesystems with > the --large-fs option by creating new output file to compare against > ($seq.largefs.out): > > 1. The following four lines appear in test 019. > File: "./.use_space" > Size: 6312890368 Filetype: Regular File > Mode: (0600/-rw-------) Uid: (0) Gid: (0) > Device: Inode: Links: 1 > > 2. When the nodump attribute is set, the xfsdump -e option will cause the > following additional lines to appear. > xfsdump: NOTE: pruned 1 files: skip attribute set > Only in SCRATCH_MNT: .use_space > SCRATCH_MNT/.use_space > > 3. Number of files off by one. > xfsrestore: # directories and (off by 1) entries processed > [ROOT] 0 0 0 00 [--------] (off by 1) 0 0 00 [--------] 0 0 0 00 [--------] > > This patch also modifies check and common.quota to use the new output file > $seq.largefs.out when the --large-fs option is used (LARGE_SCRATCH_DEV = yes) > or $seq.out when the --large-fs option is NOT used (LARGE_SCRATCH_DEV != yes). > > Signed-off-by: Rich Johnston This looks pretty good to me. .use_space changed some golden output and you've fixed that up by adding additional output files for when this --large-fs option is used. Dave will probably want to take a look too. Reviewed-by: Ben Myers From sandeen@redhat.com Wed Sep 5 17:19:17 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_57 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q85MJHPq144789 for ; Wed, 5 Sep 2012 17:19:17 -0500 X-ASG-Debug-ID: 1346883615-04cb6c14a61a600001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id QiTPvO8x8CQ5hSZK for ; Wed, 05 Sep 2012 15:20:16 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q85MKFxg015276 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 5 Sep 2012 18:20:15 -0400 Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id q85MKEm9012697 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Wed, 5 Sep 2012 18:20:14 -0400 Message-ID: <5047D01E.1070104@redhat.com> Date: Wed, 05 Sep 2012 17:20:14 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20120824 Thunderbird/15.0 MIME-Version: 1.0 To: xfs-oss , ext4 development Subject: [PATCH] xfstests 285: verify extN statfs f_blocks X-Enigmail-Version: 1.4.4 X-ASG-Orig-Subj: [PATCH] xfstests 285: verify extN statfs f_blocks Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1346883616 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com extN can report f_blocks in statfs in 2 different ways, based on whether or not metadata overhead is counted. This has broken in the past, so here's a test for it. It looks at dumpe2fs output to get total blocks and free blocks right after mkfs. The difference should be, by definition, the exact amount of metadata overhead. It then compares this to what's reported via stat -f for f_blocks. For "minix" df, it should be exactly equal to the total blocks, and for "bsd" df, it should be total blocks less overhead. It tests that the latter is accurate to within a 1% tolerance. Today the journal doesn't count as overhead in the statfs call; this should be fixed kernelside but for many filesystems it'll be within the threshold anyway. Signed-off-by: Eric Sandeen --- diff --git a/285 b/285 new file mode 100755 index 0000000..cda8531 --- /dev/null +++ b/285 @@ -0,0 +1,97 @@ +#! /bin/bash +# FS QA Test No. 286 +# +# Test overhead & df output for extN filesystems +# +#----------------------------------------------------------------------- +# Copyright (c) 2012 Red Hat, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +#----------------------------------------------------------------------- +# +# creator +owner=sandeen@redhat.com + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* +} + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter + +# real QA test starts here + +# Modify as appropriate. +_supported_fs ext2 ext3 ext4 +_supported_os Linux +_require_scratch + +rm -f $seq.full + +_scratch_mkfs >> $seq.full 2>&1 + +TOTAL_BLOCKS=`dumpe2fs -h $SCRATCH_DEV 2>/dev/null \ + | awk '/Block count:/{print $3}'` + +FREE_BLOCKS=`dumpe2fs -h $SCRATCH_DEV 2>/dev/null \ + | awk '/Free blocks:/{print $3}'` + +# nb: kernels today don't count journal blocks as overhead, but should. +# For most fileystems this will still be within tolerance. +OVERHEAD=$(($TOTAL_BLOCKS-$FREE_BLOCKS)) + +# bsddf|minixdf +# Set the behaviour for the statfs system call. The minixdf +# behaviour is to return in the f_blocks field the total number of +# blocks of the filesystem, while the bsddf behaviour (which is +# the default) is to subtract the overhead blocks used by the ext2 +# filesystem and not available for file storage. + +# stat -f output looks like; we get f_blocks from that, which +# varies depending on the df mount options used below: + +# Filesystem 4K-blocks Used Available Use% Mounted on +# /dev/sda8 2405312 2208933 196379 92% / + +_scratch_mount "-o minixdf" +MINIX_F_BLOCKS=`stat -f $SCRATCH_MNT | awk '/^Blocks/{print $3}'` +umount $SCRATCH_MNT + +_scratch_mount "-o bsddf" +BSD_F_BLOCKS=`stat -f $SCRATCH_MNT | awk '/^Blocks/{print $3}'` +umount $SCRATCH_MNT + +echo "Overhead is $OVERHEAD out of $TOTAL_BLOCKS" >> $seq.full +echo "BSD blocks $BSD_F_BLOCKS" >> $seq.full +echo "MINIX blocks $MINIX_F_BLOCKS" >> $seq.full + +# minix should be exactly equal (hence 0) +_within_tolerance "minix f_blocks" $MINIX_F_BLOCKS $TOTAL_BLOCKS 0 -v +# bsd should be within ... we'll say 1% +_within_tolerance "bsd f_blocks" $BSD_F_BLOCKS $(($TOTAL_BLOCKS-$OVERHEAD)) 1% -v + +# success, all done +status=0 +exit diff --git a/285.out b/285.out new file mode 100644 index 0000000..2075e21 --- /dev/null +++ b/285.out @@ -0,0 +1,3 @@ +QA output created by 285 +minix f_blocks is in range +bsd f_blocks is in range diff --git a/group b/group index 104ed35..0b33178 100644 --- a/group +++ b/group @@ -403,3 +403,4 @@ deprecated 282 dump ioctl auto quick 283 dump ioctl auto quick 284 auto +285 auto From david@fromorbit.com Wed Sep 5 17:25:46 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_65 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q85MPkd3146216 for ; Wed, 5 Sep 2012 17:25:46 -0500 X-ASG-Debug-ID: 1346884003-04bdf01ad21f340001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id J0xml6GhfBGEeMVa for ; Wed, 05 Sep 2012 15:26:44 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AhAFAKLQR1B5LbN8/2dsb2JhbABFhRy2CoEIgiABAQQBOhwjBQsIAxguFCUDNIgHBbp5FIp9HIYpA5VYkBuCdYFH Received: from ppp121-45-179-124.lns20.syd7.internode.on.net (HELO dastard) ([121.45.179.124]) by ipmail05.adl6.internode.on.net with ESMTP; 06 Sep 2012 07:56:42 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1T9O3V-0000zD-3e; Thu, 06 Sep 2012 08:26:41 +1000 Date: Thu, 6 Sep 2012 08:26:41 +1000 From: Dave Chinner To: rjohnston@sgi.com Cc: xfs@oss.sgi.com Subject: Re: [PATCH 11/10] xfstests: rework large filesystem testing - add golden output Message-ID: <20120905222641.GJ15292@dastard> X-ASG-Orig-Subj: Re: [PATCH 11/10] xfstests: rework large filesystem testing - add golden output References: <20120831194326.741195404@sgi.com> <1343291989-14987-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1343291989-14987-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1346884003 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107717 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Fri, Aug 31, 2012 at 02:43:27PM -0500, rjohnston@sgi.com wrote: > Patch "rework large filesystem testing" introduces a new option --large-fs > which creates a new file $SCRATCH_MNT/.use_space. If this 10 part patchset is > applied, the following tests will fail: > 019 026 027 028 046 047 050 056 059 060 062 063 064 065 066 That's a lot more tests than I see failing. > This patch accounts for the following new output when testing xfs filesystems with > the --large-fs option by creating new output file to compare against > ($seq.largefs.out): Creating new output files is the absolute last resort. Indeed, what happens when you get different output for tests that already select an output file based on, say, platform or some other criteria? We get a combinatorial explosion of golden output files, and that is simply not manageable. The usual thing to do is update the necessary filters or change the way the tests run to avoid trivial output file differences e.g. use a subdir rather than SCRATCH_MNT directly. Or, for example the filters that munge different standard error messages from different platforms to be the same... > 1. The following four lines appear in test 019. > File: "./.use_space" > Size: 6312890368 Filetype: Regular File > Mode: (0600/-rw-------) Uid: (0) Gid: (0) > Device: Inode: Links: 1 This test doesn't really need to be run for large filesystems - running it on large filesystems doesn't improve the coverage of or our confidence in the code it is testing, so I'd just add a _require_no_large_scratch_dev to it. > 2. When the nodump attribute is set, the xfsdump -e option will cause the > following additional lines to appear. > xfsdump: NOTE: pruned 1 files: skip attribute set > Only in SCRATCH_MNT: .use_space > SCRATCH_MNT/.use_space Ok, those are the errors I haven't seen - not sure why. I'll have to look into that. However, this is definitely a case of updating the dump output filter to remove these messages from the output stream. The alternative is to change the common dump code to use a subdirectory rather than the root directory so it doesn't see these files at all. > 3. Number of files off by one. > xfsrestore: # directories and (off by 1) entries processed That would be fixed by using a subdir for the dump tests. I don't recommend that the number should be filtered, as having dump report the correct number of files scanned is important. > [ROOT] 0 0 0 00 [--------] (off by 1) 0 0 00 [--------] 0 0 0 00 [--------] Perhaps the usre/group of the use_space file needs to be changed so it doesn't impact on the test results. Alternatively, a filter could be written/modified to fix the number appropriately. > This patch also modifies check and common.quota to use the new output file > $seq.largefs.out when the --large-fs option is used (LARGE_SCRATCH_DEV = yes) > or $seq.out when the --large-fs option is NOT used (LARGE_SCRATCH_DEV != yes). > > Signed-off-by: Rich Johnston > > --- > 019.largefs.out | 5 +++ > 026.largefs.out | 4 ++- > 027.largefs.out | 2 - > 028.largefs.out | 5 +++ > 046.largefs.out | 3 +- > 047.largefs.out | 5 +++ > 050.largefs.out | 72 ++++++++++++++++++++++++++++---------------------------- > 056.largefs.out | 3 +- > 059.largefs.out | 2 + > 060.largefs.out | 4 ++- > 062.largefs.out | 2 + > 063.largefs.out | 3 +- > 064.largefs.out | 41 ++++++++++++++++--------------- > 065.largefs.out | 29 +++++++++++----------- > 066.largefs.out | 3 +- > check | 12 +++++++-- > common.quota | 20 ++++++++++----- > 17 files changed, 128 insertions(+), 87 deletions(-) FWIW, this patch is supposed to add these *.largefs.out files, right? The patch, however: > Index: b/019.largefs.out > =================================================================== > --- a/019.largefs.out > +++ b/019.largefs.out > @@ -9,6 +9,11 @@ Wrote 2048.00Kb (value 0x2c) > Mode: (0777/drwxrwxrwx) Uid: (3) Gid: (1) > Device: Inode: Links: 3 > > + File: "./.use_space" > + Size: 6312890368 Filetype: Regular File > + Mode: (0600/-rw-------) Uid: (0) Gid: (0) > +Device: Inode: Links: 1 > + > File: "./bigfile" > Size: 2097152 Filetype: Regular File > Mode: (0666/-rw-rw-rw-) Uid: (3) Gid: (0) ... assumes they already exist... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Sep 5 18:04:09 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q85N49mV153315 for ; Wed, 5 Sep 2012 18:04:09 -0500 X-ASG-Debug-ID: 1346886306-04bdf01ad5214d0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id dZxix6Ba6SmEWQ6G for ; Wed, 05 Sep 2012 16:05:07 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AhEFADXaR1B5LbN8/2dsb2JhbABFhRy2CIEIgiABAQU6HCMQCAMOBgEDLhQlAyETiAy6dxSKfYZFA5VYkBuCdQ Received: from ppp121-45-179-124.lns20.syd7.internode.on.net (HELO dastard) ([121.45.179.124]) by ipmail05.adl6.internode.on.net with ESMTP; 06 Sep 2012 08:34:32 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1T9Oe7-000133-Vj; Thu, 06 Sep 2012 09:04:32 +1000 Date: Thu, 6 Sep 2012 09:04:31 +1000 From: Dave Chinner To: Boris Ranto Cc: xfs@oss.sgi.com Subject: Re: [PATCH 17/18] xfstests: convert tests to use new results directory Message-ID: <20120905230431.GK15292@dastard> X-ASG-Orig-Subj: Re: [PATCH 17/18] xfstests: convert tests to use new results directory References: <1343294892-20991-1-git-send-email-david@fromorbit.com> <1343294892-20991-18-git-send-email-david@fromorbit.com> <1346846436.1129.20.camel@localhost> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1346846436.1129.20.camel@localhost> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1346886306 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107719 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Sep 05, 2012 at 02:00:35PM +0200, Boris Ranto wrote: > On Thu, 2012-07-26 at 19:28 +1000, Dave Chinner wrote: > > From: Dave Chinner > > > > Essentially the change is simply this. Converting: > > > > ... >> $seq.???? > > > > to: > > > > .... >> $RESULT_DIR/$seq.???? > > > > so that output files are directed to the defined output directory. > > > > sed to the rescue: > > > > $ sed -i -e '/^seq=.*$/a seqres=$RESULT_DIR/$seq' -e 's/seq.full/seqres.full/' tests/*/* > > > > will do most of the work automatically. ..... > Quite a lot of tests use $here/$seq.full. This results in > $here/$seqres.full after the sed. $seqres is just a $RESULT_DIR/$seq. > This would break if RESULT_DIR was set to an absolute path instead of > relative path. Yes. As the patch description says it "will do most of the work", but it doesn't do all of it. Indeed, supporting full paths for $RESULT_DIR is actually necessary for other reasons, such as supporting completely external result destinations. To that end, I have a patch in my current series that does the rest of the conversion with the appropriate setup changes: commit 08dbbb1e6a82a4ed04e0622b7ee63957fae7721b Author: Dave Chinner Date: Wed Aug 22 16:09:33 2012 +1000 xfstests: RESULTS_DIR needs to be an absolute path Some tests 'cd ' and then direct output to $RESULT_DIR, which fails if the current working directory is not $here. Regardless, if an external results directory is to be used it needs to have a full path specified and the use of $here as the base of the results files is completely incorrect. Hence change all the $here/$seqres* references to simply be $seqres*, and instead encode the full path to the results in $RESULT_DIR. Signed-off-by: Dave Chinner Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Sep 5 18:42:27 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q85NgRtu161940 for ; Wed, 5 Sep 2012 18:42:27 -0500 X-ASG-Debug-ID: 1346888604-04bdf01ad5238d0001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id j6pFH2Rtbx0DpX5v for ; Wed, 05 Sep 2012 16:43:25 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AhEFAKziR1B5LbN8/2dsb2JhbABFhRy2CIEIgiABAQQBOhwjBQsIAw4KLhQlAyETiAcFumwUin0UAQeGKQOVWJAbgnWBRgE Received: from ppp121-45-179-124.lns20.syd7.internode.on.net (HELO dastard) ([121.45.179.124]) by ipmail05.adl6.internode.on.net with ESMTP; 06 Sep 2012 09:13:24 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1T9PFj-00017q-9Y; Thu, 06 Sep 2012 09:43:23 +1000 Date: Thu, 6 Sep 2012 09:43:23 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [RFC PATCH 4/4] xfs: add background scanning to clear EOFBLOCKS inodes Message-ID: <20120905234323.GL15292@dastard> X-ASG-Orig-Subj: Re: [RFC PATCH 4/4] xfs: add background scanning to clear EOFBLOCKS inodes References: <1346097111-4476-1-git-send-email-bfoster@redhat.com> <1346097111-4476-5-git-send-email-bfoster@redhat.com> <20120903052842.GT15292@dastard> <50460BF1.3070100@redhat.com> <20120905070011.GI15292@dastard> <504743F6.8040606@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <504743F6.8040606@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1346888604 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107721 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Sep 05, 2012 at 08:22:14AM -0400, Brian Foster wrote: > On 09/05/2012 03:00 AM, Dave Chinner wrote: > > On Tue, Sep 04, 2012 at 10:10:57AM -0400, Brian Foster wrote: > >> On 09/03/2012 01:28 AM, Dave Chinner wrote: > >>> On Mon, Aug 27, 2012 at 03:51:51PM -0400, Brian Foster wrote: > ... > >> > >> Any thoughts on having tunables for both values (time and min size?) on > >> the background scanning? > > > > Well, my suggestion for timing is as per above (xfs_syncd_centisecs > > * 100), but I don't really have any good rule of thumb for the > > minimum size. What threshold do people start to notice this? > > > > For the testing I've done so far, I'm hitting EDQUOT with 20-30GB of > space left while sequentially writing to many large files. Sure, background scanning won't prevent that, though. The background scan is to catch preallocation that is no longer needed. i.e. the files are no longer being written and have no dirty date but due to the access nature, xfs_release() didn't free the unused preallocation. The background scan will clean that up faster than waiting for the inodes to cycle through the cache.... > I'm really > just trying to get used space before failure more in the ball park of > the limit, That's what prealloc size throttling is for. ;) > so I'm not going to complain too much over leaving a few > hundred MB or so around on an otherwise full quota. ;) From where I sit, > the problem is more when we extend a file by 2, 4, 8GB and consume a > large amount of limited available space. > > I suppose for the background scanning, it's more about just using a > value that doesn't get in the way of general behavior/performance. I'll > do some more testing in this area. Right. > > I'd SWAG that something like 32MB is a good size to start at because > > most IO subsystems will still be able to reach full bandwidth with > > extents of this size when reading files. > > > > Alternatively, if you can determine if the inode is still in use at > > the time of the scan (e.g. elevated reference count due to an open > > fd) and skip the truncation for those inodes, then a minimum size is > > not really needed, right? > > > > Hmm, good idea. Though perhaps I can use the min_size as a force > parameter (i.e., trim anything over this size), If it's a background scan, we don't want to trim active preallocations. > and the inode in use > check allows a more conservative default. I just thought of a better check than an in-use check - if the inode has a dirty page cache, don't trim it as the speculative prealloc is still useful. If the inode is clean, it has not recently been written to so we can remove the speculative prealloc and we are unlikely to suffer any penalty from doing so.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Sep 5 19:30:56 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=BAYES_00, TVD_SUBJ_NUM_OBFU_MINFP autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q860UtKK170782 for ; Wed, 5 Sep 2012 19:30:56 -0500 X-ASG-Debug-ID: 1346891512-04cbb02aa21f560001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id FLHJnT1YX1HDLpIj for ; Wed, 05 Sep 2012 17:31:53 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AhEFAE3tR1B5LbN8/2dsb2JhbABFhRy2BIEIgiABAQQBOhwWDQULCAMYIwsUDRgDIROHfgMGBbEQDYlTFIoaYxyGKQOUBYFTixOFCIJ1gUYBIg Received: from ppp121-45-179-124.lns20.syd7.internode.on.net (HELO dastard) ([121.45.179.124]) by ipmail05.adl6.internode.on.net with ESMTP; 06 Sep 2012 10:01:52 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1T9Q0c-0001EB-WC; Thu, 06 Sep 2012 10:31:51 +1000 Date: Thu, 6 Sep 2012 10:31:50 +1000 From: Dave Chinner To: Boris Ranto Cc: xfs-oss , Eric Sandeen Subject: Re: [PATCH v2] xfstests: Add test case to test xfs projid32bit functionality a bit more extensively. Message-ID: <20120906003150.GM15292@dastard> X-ASG-Orig-Subj: Re: [PATCH v2] xfstests: Add test case to test xfs projid32bit functionality a bit more extensively. References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1346891512 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107725 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Aug 28, 2012 at 02:59:42PM +0200, Boris Ranto wrote: > The test covers several areas including enabling projid32bit > functionality dynamically by xfs_admin, dumping, restoring, quota > reporting and xfs_db projid values reporting. > This test case hits two bugs: one for broken xfsdump/xfsrestore > functionality and one for enabling projid32bit functionality with > xfs_admin on a LVM device (SCRATCH_DEV must be an LVM device to hit > this). The LVM problem is incidental - if there's a problem with LVM devices then xfs_db should show the same problem, as should all other xfs_admin commands that use xfs_db. Hence I don't think that there is any point in mentioning it here. > This version does not create/handle any loop devices. > > Signed-off-by: Boris Ranto > --- > 285 | 138 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > 285.out | 27 ++++++++++++ > group | 1 + > 3 files changed, 166 insertions(+), 0 deletions(-) > create mode 100644 285 > create mode 100644 285.out > > diff --git a/285 b/285 > new file mode 100644 > index 0000000..ad96aa6 > --- /dev/null > +++ b/285 > @@ -0,0 +1,138 @@ > +#! /bin/bash > +# FS QA Test No. 285 > +# > +# Test to verify project quota xfs_admin, xfsdump/xfsrestore and > +# xfs_db functionality > +# > +#----------------------------------------------------------------------- > +# Copyright (c) 2012 Boris Ranto. All Rights Reserved. Shouldn't this be Red Hat? > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License as > +# published by the Free Software Foundation. > +# > +# This program is distributed in the hope that it would be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write the Free Software Foundation, > +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > +# > +#----------------------------------------------------------------------- > +# > +# creator > +owner=ranto.boris@gmail.com > + > +seq=`basename $0` > +echo "QA output created by $seq" > +tmp=/tmp/$$ > +here=`pwd` > +status=1 # failure is the default! > +trap "_cleanup; exit \$status" 0 1 2 3 15 > +rm -f $seq.full > + > +# get standard environment, filters and checks > +. ./common.rc > +. ./common.quota > + > +_cleanup() > +{ > + cd / > + umount $SCRATCH_MNT 2>/dev/null > + rm -rf $tmp.* > +} > + > +# real QA test starts here > +_supported_fs xfs > +_require_xfs_quota > +_require_scratch > +_require_projid32bit > + > +export MOUNT_OPTIONS="-opquota" Kill that - '_qmount_option "pquota"' is the preferred way to do specific project quota configuration mounts. > + > +# create xfs fs without projid32bit ability, will be gained by xfs_admin > +_scratch_mkfs_xfs -i projid32bit=0 -d size=200m >> $seq.full || _fail > "mkfs failed" You need to turn off line wrapping when you post patches. > +_qmount _qmount_option "pquota" > +# require project quotas > +_require_prjquota $SCRATCH_DEV > + > +dir=$SCRATCH_MNT/pquota > + > +status=1 > + > +mkdir -p $dir > +touch $dir/{16,32}less "less" is a weird filename suffix. What's it mean? Why not just something standard like "test"? > +inode16a=$(ls -i $dir/16less|cut -d ' ' -f 1) > +inode32a=$(ls -i $dir/32less|cut -d ' ' -f 1) > +$XFS_QUOTA_PROG -x -c "project -s -p $dir/16less 1234" $SCRATCH_DEV \ > + >> $seq.full > +$XFS_QUOTA_PROG -x -c "project -s -p $dir/32less 2123456789" $SCRATCH_DEV \ > + >> $seq.full 2>&1 > +# These will be checked by $seq.out No need for comments like this > +echo "No 32bit project quotas:" > +$XFS_IO_PROG -r -c "lsproj" $dir/16less > +$XFS_IO_PROG -r -c "lsproj" $dir/32less > + > +umount $SCRATCH_MNT > + > +# Now, enable projid32bit support by xfs_admin > +xfs_admin -p $SCRATCH_DEV > /dev/null 2>&1 Output to $seq.full, and use the _fail script if xfs-admin returned an error. > +echo "xfs_admin returned $?" > + > +# Now mount the fs, 32bit project quotas shall be supported, now > +_qmount > +$XFS_QUOTA_PROG -x -c "project -s -p $dir/32less 2123456789" $SCRATCH_DEV \ > + >> $seq.full > + > +# These will be checked by $seq.out > +echo "With 32bit project quota support:" > +$XFS_IO_PROG -r -c "lsproj" $dir/16less > +$XFS_IO_PROG -r -c "lsproj" $dir/32less > + > +# Dump the fs to a temporary file > +rm -f $tmp.dump.img > +$XFSDUMP_PROG -f $tmp.dump -L label -M media -l 0 $SCRATCH_MNT >> > $seq.full || _fail "dump failed" > +echo "xfsdump returned $?" If xfsdump failed, this won't be run. If it succeeded, the output will always be zero. So this sort of output is not needed. > +# Prepare the device to restore the dumped file system > +dir=$SCRATCH_MNT/restore/pquota This is just confusing - the same variable points to different directories in different parts of the test. A good reason for separating the tests. > +# Just make the restore dir, the pquota dir will be created by xfsrestore > +mkdir -p $SCRATCH_MNT/restore > + > +# Restore > +$XFSRESTORE_PROG -f $tmp.dump $SCRATCH_MNT/restore > /dev/null 2>&1 > +echo "xfsrestore returned $?" > + > +# Check that they are the same > +diff -urpN $SCRATCH_MNT/{,restore}/pquota > +echo "diff returned $?" _fail if diff returned somethign non-zero. > +touch $dir/32lessv2 > +inode16b=$(ls -i $dir/16less|cut -d ' ' -f 1) > +inode32b=$(ls -i $dir/32less|cut -d ' ' -f 1) > +inode32v2=$(ls -i $dir/32lessv2|cut -d ' ' -f 1) > +$XFS_QUOTA_PROG -x -c "project -s -p $dir/32lessv2 2123456789" $SCRATCH_MNT \ > + >> $seq.full Why do you shorten some long lines, and not others... > +echo "The restored file system + one additional file:" > +$XFS_IO_PROG -r -c "lsproj" $dir/16less > +$XFS_IO_PROG -r -c "lsproj" $dir/32less > +$XFS_IO_PROG -r -c "lsproj" $dir/32lessv2 > + > +umount $SCRATCH_MNT > + > +# Now, we can examine the file systems with xfs_db > +# These two should report the same values > +echo "These two values of 16bit project quota ids shall be the same" No need to output this into the out file. The comment says it all, and we don't need the text in the output file to test for test failure. > +$XFS_DB_PROG -c "inode $inode16a" -c "print core.projid_lo" -c "print > core.projid_hi" $SCRATCH_DEV $XFS_DB_PROG -c "inode $inode16a" \ -c "print core.projid_lo" \ -c "print core.projid_hi" \ $SCRATCH_DEV or, because it's called 5 times: _print_projid() { $XFS_DB_PROG -c "inode $1" \ -c "print core.projid_lo" \ -c "print core.projid_hi" \ $SCRATCH_DEV } _print_projid $inode16a _print_projid $inode16b _print_projid $inode32a _print_projid $inode32b _print_projid $inode32v2 > +$XFS_DB_PROG -c "inode $inode16b" -c "print core.projid_lo" -c "print > core.projid_hi" $SCRATCH_DEV > + > +# These three should report the same values > +echo "These three values of 32bit project quota ids shall be the same" > +$XFS_DB_PROG -c "inode $inode32a" -c "print core.projid_lo" -c "print > core.projid_hi" $SCRATCH_DEV > +$XFS_DB_PROG -c "inode $inode32b" -c "print core.projid_lo" -c "print > core.projid_hi" $SCRATCH_DEV > +$XFS_DB_PROG -c "inode $inode32v2" -c "print core.projid_lo" -c > "print core.projid_hi" $SCRATCH_DEV > + > +status=0 > +exit > diff --git a/285.out b/285.out > new file mode 100644 > index 0000000..a601452 > --- /dev/null > +++ b/285.out > @@ -0,0 +1,27 @@ > +QA output created by 285 > +No 32bit project quotas: > +projid = 1234 > +projid = 0 > +xfs_admin returned 0 > +With 32bit project quota support: > +projid = 1234 > +projid = 2123456789 > +xfsdump returned 0 > +xfsrestore returned 0 > +diff returned 0 > +The restored file system + one additional file: > +projid = 1234 > +projid = 2123456789 > +projid = 2123456789 > +These two values of 16bit project quota ids shall be the same > +core.projid_lo = 1234 > +core.projid_hi = 0 > +core.projid_lo = 1234 > +core.projid_hi = 0 > +These three values of 32bit project quota ids shall be the same > +core.projid_lo = 24853 > +core.projid_hi = 32401 > +core.projid_lo = 24853 > +core.projid_hi = 32401 > +core.projid_lo = 24853 > +core.projid_hi = 32401 > diff --git a/group b/group > index 104ed35..bbc74fe 100644 > --- a/group > +++ b/group > @@ -403,3 +403,4 @@ deprecated > 282 dump ioctl auto quick > 283 dump ioctl auto quick > 284 auto > +285 auto dump quota And quick. Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Wed Sep 5 19:39:42 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=BAYES_00, TVD_SUBJ_NUM_OBFU_MINFP autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q860dgws172693 for ; Wed, 5 Sep 2012 19:39:42 -0500 X-ASG-Debug-ID: 1346892038-04cb6c14a421a90001-NocioJ Received: from mail.sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id fu9HOdpBMLSBgAek for ; Wed, 05 Sep 2012 17:40:39 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) (Authenticated sender: sandeen) by mail.sandeen.net (Postfix) with ESMTP id BEB6E4963294; Wed, 5 Sep 2012 19:40:38 -0500 (CDT) Message-ID: <5047F106.4050905@sandeen.net> Date: Wed, 05 Sep 2012 19:40:38 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20120824 Thunderbird/15.0 MIME-Version: 1.0 To: Dave Chinner CC: Boris Ranto , xfs-oss Subject: Re: [PATCH v2] xfstests: Add test case to test xfs projid32bit functionality a bit more extensively. References: <20120906003150.GM15292@dastard> X-ASG-Orig-Subj: Re: [PATCH v2] xfstests: Add test case to test xfs projid32bit functionality a bit more extensively. In-Reply-To: <20120906003150.GM15292@dastard> X-Enigmail-Version: 1.4.4 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1346892039 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107725 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 9/5/12 7:31 PM, Dave Chinner wrote: > On Tue, Aug 28, 2012 at 02:59:42PM +0200, Boris Ranto wrote: >> The test covers several areas including enabling projid32bit >> functionality dynamically by xfs_admin, dumping, restoring, quota >> reporting and xfs_db projid values reporting. >> This test case hits two bugs: one for broken xfsdump/xfsrestore >> functionality and one for enabling projid32bit functionality with >> xfs_admin on a LVM device (SCRATCH_DEV must be an LVM device to hit >> this). > > The LVM problem is incidental - if there's a problem with LVM > devices then xfs_db should show the same problem, as should all > other xfs_admin commands that use xfs_db. Hence I don't think that > there is any point in mentioning it here. I agree. And FWIW, though I tried to bisect my way to the root cause, in the end I realized that upstream it's no longer a problem, so TBH I stopped looking ... ... >> +mkdir -p $dir >> +touch $dir/{16,32}less > > "less" is a weird filename suffix. What's it mean? Why not just > something standard like "test"? 16 or less (fewer) bits, 32 or less bits. ... >> +# Now, we can examine the file systems with xfs_db >> +# These two should report the same values >> +echo "These two values of 16bit project quota ids shall be the same" > > No need to output this into the out file. The comment says it all, > and we don't need the text in the output file to test for test > failure. Although the comments don't end up in the output file; if it fails with an out file diff like: @blah,blah core.projid_lo = 24853 core.projid_hi = 32401 core.projid_lo = 24853 -core.projid_hi = 32401 +core.projid_hi = 0 core.projid_lo = 24853 core.projid_hi = 32401 it's sometimes tedious to work your way back to where the numbers came from and what was being tested at the time; IOW comment-style landmarks in the output file like this are sometimes helpful, in my experience. -Eric From david@fromorbit.com Wed Sep 5 19:45:11 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q860jB4Y173783 for ; Wed, 5 Sep 2012 19:45:11 -0500 X-ASG-Debug-ID: 1346892368-04cbb02aa520150001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id 2vXKeuLXqyk0fPxd for ; Wed, 05 Sep 2012 17:46:09 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AhAFAArxR1B5LbN8/2dsb2JhbAA/BoUctgSBCIIgAQEFJxMcIxAIAxguFCUDIROIDLpqFIp9JoYfA5VYiTSGZ4J1gUYE Received: from ppp121-45-179-124.lns20.syd7.internode.on.net (HELO dastard) ([121.45.179.124]) by ipmail05.adl6.internode.on.net with ESMTP; 06 Sep 2012 10:16:08 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1T9QER-0001Fi-72; Thu, 06 Sep 2012 10:46:07 +1000 Date: Thu, 6 Sep 2012 10:46:07 +1000 From: Dave Chinner To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: [PATCH 03/13] xfs: rationalise xfs_mount_wq users Message-ID: <20120906004607.GN15292@dastard> X-ASG-Orig-Subj: Re: [PATCH 03/13] xfs: rationalise xfs_mount_wq users References: <1346328017-2795-1-git-send-email-david@fromorbit.com> <1346328017-2795-4-git-send-email-david@fromorbit.com> <504622C1.20201@sgi.com> <20120905043000.GE15292@dastard> <504750CB.2090907@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <504750CB.2090907@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1346892368 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107725 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Sep 05, 2012 at 08:16:59AM -0500, Mark Tinguely wrote: > On 09/04/12 23:30, Dave Chinner wrote: > >On Tue, Sep 04, 2012 at 10:48:17AM -0500, Mark Tinguely wrote: > >>On 08/30/12 07:00, Dave Chinner wrote: > >>>- /* > >>>- * We shouldn't write/force the log if we are in the mount/unmount > >>>- * process or on a read only filesystem. The workqueue still needs to be > >>>- * active in both cases, however, because it is used for inode reclaim > >>>- * during these times. Use the MS_ACTIVE flag to avoid doing anything > >>>- * during mount. Doing work during unmount is avoided by calling > >>>- * cancel_delayed_work_sync on this work queue before tearing down > >>>- * the ail and the log in xfs_log_unmount. > >>>- */ > >>>- if (!(mp->m_super->s_flags& MS_ACTIVE)&& > >>>- !(mp->m_flags& XFS_MOUNT_RDONLY)) { > >>>+ if (!(mp->m_flags& XFS_MOUNT_RDONLY)) { > >>> /* dgc: errors ignored here */ > >>> if (mp->m_super->s_writers.frozen == SB_UNFROZEN&& > >>> xfs_log_need_covered(mp)) > >>>@@ -408,8 +398,7 @@ xfs_sync_worker( > >>> else > >>> xfs_log_force(mp, 0); > >>> > >>>- /* start pushing all the metadata that is currently > >>>- * dirty */ > >>>+ /* start pushing all the metadata that is currently dirty */ > >>> xfs_ail_push_all(mp->m_ail); > >>> } > >>> > >> > >>It appears that the removal of the MS_ACTIVE flag is causing the > >>"atomic_read(&bp->b_hold)> 0," ASSERT. > > > >I must be being slow today - I don't see why that would cause any > >problems. The worker is not started at the end of the mount process > >after everything is set up (i.e. just before MS_ACTIVE is removed), > >and the worker is stopped before anything is torn down. That should > >effectively replicate what the MS_ACTIVE flag is providing in the > >old code. > > > >Can you explain in more detail what lead you to this conclusion? > > > >Cheers, > > > >Dave. > > You are correct, it does not make sense, but with the > !(mp->m_super->s_flags & MS_ACTIVE) > test removed, test 107 causes the above assert on > different machines/architectures. Place the test in, the > assert does not happen. test 107 is not in the auto group. That means it is generally unreliable as a regression test, so I don't run it. That said, I don't see anything unusual in that test that would cause problems... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Sep 5 19:52:28 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q860qSsd174948 for ; Wed, 5 Sep 2012 19:52:28 -0500 X-ASG-Debug-ID: 1346892806-04cbb02aa5207b0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id J3NBAB9bSPx6M5h0 for ; Wed, 05 Sep 2012 17:53:26 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AhAFANLyR1B5LbN8/2dsb2JhbAA9CIUctgWBCIIgAQEFOhwjEAgDFQMuFCUDIROIDLpyFIp9FoYvA5VYiTSGZ4J1 Received: from ppp121-45-179-124.lns20.syd7.internode.on.net (HELO dastard) ([121.45.179.124]) by ipmail06.adl6.internode.on.net with ESMTP; 06 Sep 2012 10:23:25 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1T9QLU-0001Gd-Ci; Thu, 06 Sep 2012 10:53:24 +1000 Date: Thu, 6 Sep 2012 10:53:24 +1000 From: Dave Chinner To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: [PATCH 07/13] xfs: xfs_sync_data is redundant. Message-ID: <20120906005324.GO15292@dastard> X-ASG-Orig-Subj: Re: [PATCH 07/13] xfs: xfs_sync_data is redundant. References: <1346328017-2795-1-git-send-email-david@fromorbit.com> <1346328017-2795-8-git-send-email-david@fromorbit.com> <5046693A.9010102@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5046693A.9010102@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1346892806 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107727 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Sep 04, 2012 at 03:48:58PM -0500, Mark Tinguely wrote: > On 08/30/12 07:00, Dave Chinner wrote: > >From: Dave Chinner > > > >We don't do any data writeback from XFS any more - the VFS is > >completely responsible for that, including for freeze. We can > >replace the remaining caller with the VFS level function that > >achieves the same thing, but without conflicting with current > >writeback work - writeback_inodes_sb_if_idle(). > > > >This means we can remove the flush_work and xfs_flush_inodes() - the > >VFS functionality completely replaces the internal flush queue for > >doing this writeback work in a separate context to avoid stack > >overruns.. > > > >Signed-off-by: Dave Chinner > >--- > > I get a XFS hang on xfstest 205 - couple different machines: > > # cat /proc/413/stack > [] sleep_on_page+0x9/0x10 > [] __lock_page+0x64/0x70 > [] write_cache_pages+0x368/0x510 > [] generic_writepages+0x4c/0x70 > [] xfs_vm_writepages+0x54/0x70 [xfs] > [] do_writepages+0x1b/0x40 > [] __writeback_single_inode+0x45/0x160 > [] writeback_sb_inodes+0x2a7/0x490 > [] wb_writeback+0x119/0x2b0 > [] wb_do_writeback+0xd4/0x230 > [] bdi_writeback_thread+0xdb/0x230 > [] kthread+0x9e/0xb0 > [] kernel_thread_helper+0x4/0x10 > [] 0xffffffffffffffff Oh, curious. That implies that writeback has got stuck on the page we currently hold locked in this thread: > # cat /proc/12489/stack (dd command) > [] writeback_inodes_sb_nr+0x85/0xb0 > [] writeback_inodes_sb+0x5c/0x80 > [] writeback_inodes_sb_if_idle+0x42/0x60 > [] xfs_iomap_write_delay+0x28e/0x320 [xfs] > [] __xfs_get_blocks+0x2b8/0x500 [xfs] > [] xfs_get_blocks+0xc/0x10 [xfs] > [] __block_write_begin+0x2af/0x5c0 > [] xfs_vm_write_begin+0x61/0xd0 [xfs] > [] generic_perform_write+0xc2/0x1e0 > [] generic_file_buffered_write+0x60/0xa0 > [] xfs_file_buffered_aio_write+0x11d/0x1b0 [xfs] > [] xfs_file_aio_write+0x110/0x170 [xfs] > [] do_sync_write+0xa1/0xf0 > [] vfs_write+0xcb/0x130 > [] sys_write+0x50/0x90 > [] system_call_fastpath+0x16/0x1b > [] 0xffffffffffffffff Why didn't the current writeback code have this problem? It blocked waiting for writeback on dirty inodes. Oh, it woul dhave found the xfs_inode with the IOLOCK already held, so it skipped writeback on the inode that triggered the flush. Bugger. Let me have a bit of a think about this. Cheers, Dave. -- Dave Chinner david@fromorbit.com From guaneryu@gmail.com Thu Sep 6 03:49:20 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,FREEMAIL_FROM, J_CHICKENPOX_52,J_CHICKENPOX_57,T_DKIM_INVALID autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q868nKmO017437 for ; Thu, 6 Sep 2012 03:49:20 -0500 X-ASG-Debug-ID: 1346921418-04cb6c14a53c2c0001-NocioJ Received: from mail-we0-f181.google.com (mail-we0-f181.google.com [74.125.82.181]) by cuda.sgi.com with ESMTP id HTcNcIAtDsfTMlDs (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 06 Sep 2012 01:50:18 -0700 (PDT) X-Barracuda-Envelope-From: guaneryu@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.82.181 Received: by weyt57 with SMTP id t57so1063620wey.26 for ; Thu, 06 Sep 2012 01:50:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:reply-to:in-reply-to:references:from:date:message-id :subject:to:cc:content-type; bh=lkKwbmmmZx7bwDI4RkX85WeP9OhbT9+t6ZPk2gbuAxo=; b=hLCImb1r8QxZP6hN8Zbmw1lhlhtWr55ByCd6qZBbu+sHQIfsF/YbO4HcUpldxNFkYG 9R9LWip3vbGfEwC1C3o93SKpnbkdaeCSgM+Gl7UYAJFnSrLwdgWN5Hi4HvycsjdSt+ES hTdlIyvFiQkH40TrAclc9IbPCk9BMhnv2Zbrz7ZF4YEn2NbhSbsaZoGzKcnQJUT1rq/+ hhRZ9teHtacng0Ez+vz58NdJ/h97PCXbhfve/D7bAA1QUQ0mJTtmZHExwOvoue7w40Wy nyubzxKAp7q8BL6M8g66LAhUofHecIafJCgYtLGlQFOO0u2M5gH7YQSncGbuvrtFJR/V ObMg== Received: by 10.216.132.76 with SMTP id n54mr812832wei.135.1346921417666; Thu, 06 Sep 2012 01:50:17 -0700 (PDT) MIME-Version: 1.0 Received: by 10.216.84.133 with HTTP; Thu, 6 Sep 2012 01:49:57 -0700 (PDT) Reply-To: guaneryu@gmail.com In-Reply-To: <5047D01E.1070104@redhat.com> References: <5047D01E.1070104@redhat.com> From: Eryu Guan Date: Thu, 6 Sep 2012 16:49:57 +0800 Message-ID: Subject: Re: [PATCH] xfstests 285: verify extN statfs f_blocks To: Eric Sandeen X-ASG-Orig-Subj: Re: [PATCH] xfstests 285: verify extN statfs f_blocks Cc: xfs-oss , ext4 development Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: mail-we0-f181.google.com[74.125.82.181] X-Barracuda-Start-Time: 1346921418 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107759 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Thu, Sep 6, 2012 at 6:20 AM, Eric Sandeen wrote: > extN can report f_blocks in statfs in 2 different ways, based > on whether or not metadata overhead is counted. This has broken > in the past, so here's a test for it. > > It looks at dumpe2fs output to get total blocks and free blocks > right after mkfs. The difference should be, by definition, the > exact amount of metadata overhead. > > It then compares this to what's reported via stat -f for f_blocks. > For "minix" df, it should be exactly equal to the total blocks, > and for "bsd" df, it should be total blocks less overhead. > > It tests that the latter is accurate to within a 1% tolerance. > > Today the journal doesn't count as overhead in the statfs call; > this should be fixed kernelside but for many filesystems it'll be > within the threshold anyway. > > Signed-off-by: Eric Sandeen > --- > > diff --git a/285 b/285 > new file mode 100755 > index 0000000..cda8531 > --- /dev/null > +++ b/285 > @@ -0,0 +1,97 @@ > +#! /bin/bash > +# FS QA Test No. 286 The Test No. should be 285 here? > +# > +# Test overhead & df output for extN filesystems > +# > +#----------------------------------------------------------------------- > +# Copyright (c) 2012 Red Hat, Inc. All Rights Reserved. > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License as > +# published by the Free Software Foundation. > +# > +# This program is distributed in the hope that it would be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write the Free Software Foundation, > +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > +#----------------------------------------------------------------------- > +# > +# creator > +owner=sandeen@redhat.com > + > +seq=`basename $0` > +echo "QA output created by $seq" > + > +here=`pwd` > +tmp=/tmp/$$ > +status=1 # failure is the default! > +trap "_cleanup; exit \$status" 0 1 2 3 15 > + > +_cleanup() > +{ > + cd / > + rm -f $tmp.* > +} > + > +# get standard environment, filters and checks > +. ./common.rc > +. ./common.filter > + > +# real QA test starts here > + > +# Modify as appropriate. > +_supported_fs ext2 ext3 ext4 > +_supported_os Linux > +_require_scratch > + > +rm -f $seq.full > + > +_scratch_mkfs >> $seq.full 2>&1 > + > +TOTAL_BLOCKS=`dumpe2fs -h $SCRATCH_DEV 2>/dev/null \ > + | awk '/Block count:/{print $3}'` > + > +FREE_BLOCKS=`dumpe2fs -h $SCRATCH_DEV 2>/dev/null \ > + | awk '/Free blocks:/{print $3}'` I guess TOTAL_BLOCKS and FREE_BLOCKS will be wrong when testing ext4 on RHEL5 which has a separate dumpe4fs for ext4. Thanks, Eryu Guan > + > +# nb: kernels today don't count journal blocks as overhead, but should. > +# For most fileystems this will still be within tolerance. > +OVERHEAD=$(($TOTAL_BLOCKS-$FREE_BLOCKS)) > + > +# bsddf|minixdf > +# Set the behaviour for the statfs system call. The minixdf > +# behaviour is to return in the f_blocks field the total number of > +# blocks of the filesystem, while the bsddf behaviour (which is > +# the default) is to subtract the overhead blocks used by the ext2 > +# filesystem and not available for file storage. > + > +# stat -f output looks like; we get f_blocks from that, which > +# varies depending on the df mount options used below: > + > +# Filesystem 4K-blocks Used Available Use% Mounted on > +# /dev/sda8 2405312 2208933 196379 92% / > + > +_scratch_mount "-o minixdf" > +MINIX_F_BLOCKS=`stat -f $SCRATCH_MNT | awk '/^Blocks/{print $3}'` > +umount $SCRATCH_MNT > + > +_scratch_mount "-o bsddf" > +BSD_F_BLOCKS=`stat -f $SCRATCH_MNT | awk '/^Blocks/{print $3}'` > +umount $SCRATCH_MNT > + > +echo "Overhead is $OVERHEAD out of $TOTAL_BLOCKS" >> $seq.full > +echo "BSD blocks $BSD_F_BLOCKS" >> $seq.full > +echo "MINIX blocks $MINIX_F_BLOCKS" >> $seq.full > + > +# minix should be exactly equal (hence 0) > +_within_tolerance "minix f_blocks" $MINIX_F_BLOCKS $TOTAL_BLOCKS 0 -v > +# bsd should be within ... we'll say 1% > +_within_tolerance "bsd f_blocks" $BSD_F_BLOCKS $(($TOTAL_BLOCKS-$OVERHEAD)) 1% -v > + > +# success, all done > +status=0 > +exit > diff --git a/285.out b/285.out > new file mode 100644 > index 0000000..2075e21 > --- /dev/null > +++ b/285.out > @@ -0,0 +1,3 @@ > +QA output created by 285 > +minix f_blocks is in range > +bsd f_blocks is in range > diff --git a/group b/group > index 104ed35..0b33178 100644 > --- a/group > +++ b/group > @@ -403,3 +403,4 @@ deprecated > 282 dump ioctl auto quick > 283 dump ioctl auto quick > 284 auto > +285 auto > > -- > To unsubscribe from this list: send the line "unsubscribe linux-ext4" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html From jlayton@redhat.com Thu Sep 6 05:38:26 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q86AcQOA044397 for ; Thu, 6 Sep 2012 05:38:26 -0500 X-ASG-Debug-ID: 1346927964-04cb6c14a344100001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id y7zPlFhZz3VR6ZCz for ; Thu, 06 Sep 2012 03:39:25 -0700 (PDT) X-Barracuda-Envelope-From: jlayton@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q86AdO4W000525 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 6 Sep 2012 06:39:24 -0400 Received: from corrin.poochiereds.net (vpn-9-194.rdu.redhat.com [10.11.9.194]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q86AdNoP027613; Thu, 6 Sep 2012 06:39:23 -0400 Date: Thu, 6 Sep 2012 06:39:21 -0400 From: Jeff Layton To: xfs@oss.sgi.com Cc: linux-fsdevel@vger.kernel.org, Jan Kara Subject: xfs freeze annotation problem on 3.6.0-rc3+ kernel Message-ID: <20120906063921.749a850a@corrin.poochiereds.net> X-ASG-Orig-Subj: xfs freeze annotation problem on 3.6.0-rc3+ kernel Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1346927965 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com I got the following xfs-related lockdep pop on a 3.6.0-rc3+ kernel. I've been able to reproduce this twice now by doing a kernel build on xfs. The last commit from Linus' tree in this kernel is 9acb172. It also has a pile of my own and Al Viro's patches on top, but I don't think any of them would affect this. I should be able to test patches for this if you come up with one, but since I've only seen it twice I'm not sure how reproducible it is yet. [ 4175.887865] [ 4175.888032] ========================================================= [ 4175.888032] [ INFO: possible irq lock inversion dependency detected ] [ 4175.888032] 3.6.0-rc3+ #11 Not tainted [ 4175.888032] --------------------------------------------------------- [ 4175.888032] kswapd0/41 just changed the state of lock: [ 4175.888032] (sb_internal){.+.+.?}, at: [] xfs_trans_alloc+0x2d/0x50 [xfs] [ 4175.888032] but this lock took another, RECLAIM_FS-unsafe lock in the past: [ 4175.888032] (&(&ip->i_lock)->mr_lock/1){+.+.+.} [ 4175.888032] [ 4175.888032] and interrupts could create inverse lock ordering between them. [ 4175.888032] [ 4175.888032] [ 4175.888032] other info that might help us debug this: [ 4175.888032] Possible interrupt unsafe locking scenario: [ 4175.888032] [ 4175.888032] CPU0 CPU1 [ 4175.888032] ---- ---- [ 4175.888032] lock(&(&ip->i_lock)->mr_lock/1); [ 4175.888032] local_irq_disable(); [ 4175.888032] lock(sb_internal); [ 4175.888032] lock(&(&ip->i_lock)->mr_lock/1); [ 4175.888032] [ 4175.888032] lock(sb_internal); [ 4175.888032] [ 4175.888032] *** DEADLOCK *** [ 4175.888032] [ 4175.888032] 2 locks held by kswapd0/41: [ 4175.888032] #0: (shrinker_rwsem){++++..}, at: [] shrink_slab+0x3c/0x500 [ 4175.888032] #1: (&type->s_umount_key#19){++++.+}, at: [] grab_super_passive+0x44/0x90 [ 4175.888032] [ 4175.888032] the shortest dependencies between 2nd lock and 1st lock: [ 4175.888032] -> (&(&ip->i_lock)->mr_lock/1){+.+.+.} ops: 14891 { [ 4175.888032] HARDIRQ-ON-W at: [ 4175.888032] [] __lock_acquire+0x5d6/0x1ad0 [ 4175.888032] [] lock_acquire+0xa1/0x1f0 [ 4175.888032] [] down_write_nested+0x65/0xb0 [ 4175.888032] [] xfs_ilock+0x121/0x200 [xfs] [ 4175.888032] [] xfs_create+0x243/0x7f0 [xfs] [ 4175.888032] [] xfs_vn_mknod+0xa6/0x1b0 [xfs] [ 4175.888032] [] xfs_vn_create+0x13/0x20 [xfs] [ 4175.888032] [] vfs_create+0xb5/0x120 [ 4175.888032] [] do_last+0x992/0xe30 [ 4175.888032] [] path_openat+0xbf/0x500 [ 4175.888032] [] do_filp_open+0x38/0x90 [ 4175.888032] [] do_sys_open+0xf6/0x1e0 [ 4175.888032] [] sys_open+0x21/0x30 [ 4175.888032] [] system_call_fastpath+0x16/0x1b [ 4175.888032] SOFTIRQ-ON-W at: [ 4175.888032] [] __lock_acquire+0x604/0x1ad0 [ 4175.888032] [] lock_acquire+0xa1/0x1f0 [ 4175.888032] [] down_write_nested+0x65/0xb0 [ 4175.888032] [] xfs_ilock+0x121/0x200 [xfs] [ 4175.888032] [] xfs_create+0x243/0x7f0 [xfs] [ 4175.888032] [] xfs_vn_mknod+0xa6/0x1b0 [xfs] [ 4175.888032] [] xfs_vn_create+0x13/0x20 [xfs] [ 4175.888032] [] vfs_create+0xb5/0x120 [ 4175.888032] [] do_last+0x992/0xe30 [ 4175.888032] [] path_openat+0xbf/0x500 [ 4175.888032] [] do_filp_open+0x38/0x90 [ 4175.888032] [] do_sys_open+0xf6/0x1e0 [ 4175.888032] [] sys_open+0x21/0x30 [ 4175.888032] [] system_call_fastpath+0x16/0x1b [ 4175.888032] RECLAIM_FS-ON-W at: [ 4175.888032] [] mark_held_locks+0xb2/0x130 [ 4175.888032] [] lockdep_trace_alloc+0x75/0xd0 [ 4175.888032] [] kmem_cache_alloc_node_trace+0x3a/0x280 [ 4175.888032] [] vm_map_ram+0x294/0x7a0 [ 4175.888032] [] _xfs_buf_map_pages+0x4b/0xf0 [xfs] [ 4175.888032] [] xfs_buf_get_map+0x13b/0x250 [xfs] [ 4175.888032] [] xfs_trans_get_buf_map+0x131/0x2e0 [xfs] [ 4175.888032] [] xfs_ialloc_inode_init+0xe4/0x1f0 [xfs] [ 4175.888032] [] xfs_ialloc_ag_alloc+0x1c2/0x570 [xfs] [ 4175.888032] [] xfs_dialloc+0x11e/0x2b0 [xfs] [ 4175.888032] [] xfs_ialloc+0x57/0x650 [xfs] [ 4175.888032] [] xfs_dir_ialloc+0x6a/0x2a0 [xfs] [ 4175.888032] [] xfs_create+0x54c/0x7f0 [xfs] [ 4175.888032] [] xfs_vn_mknod+0xa6/0x1b0 [xfs] [ 4175.888032] [] xfs_vn_create+0x13/0x20 [xfs] [ 4175.888032] [] vfs_create+0xb5/0x120 [ 4175.888032] [] do_last+0x992/0xe30 [ 4175.888032] [] path_openat+0xbf/0x500 [ 4175.888032] [] do_filp_open+0x38/0x90 [ 4175.888032] [] do_sys_open+0xf6/0x1e0 [ 4175.888032] [] sys_open+0x21/0x30 [ 4175.888032] [] system_call_fastpath+0x16/0x1b [ 4175.888032] INITIAL USE at: [ 4175.888032] [] __lock_acquire+0x317/0x1ad0 [ 4175.888032] [] lock_acquire+0xa1/0x1f0 [ 4175.888032] [] down_write_nested+0x65/0xb0 [ 4175.888032] [] xfs_ilock+0x121/0x200 [xfs] [ 4175.888032] [] xfs_create+0x243/0x7f0 [xfs] [ 4175.888032] [] xfs_vn_mknod+0xa6/0x1b0 [xfs] [ 4175.888032] [] xfs_vn_create+0x13/0x20 [xfs] [ 4175.888032] [] vfs_create+0xb5/0x120 [ 4175.888032] [] do_last+0x992/0xe30 [ 4175.888032] [] path_openat+0xbf/0x500 [ 4175.888032] [] do_filp_open+0x38/0x90 [ 4175.888032] [] do_sys_open+0xf6/0x1e0 [ 4175.888032] [] sys_open+0x21/0x30 [ 4175.888032] [] system_call_fastpath+0x16/0x1b [ 4175.888032] } [ 4175.888032] ... key at: [] __key.50301+0x1/0xfffffffffffd4318 [xfs] [ 4175.888032] ... acquired at: [ 4175.888032] [] lock_acquire+0xa1/0x1f0 [ 4175.888032] [] down_write_nested+0x65/0xb0 [ 4175.888032] [] xfs_ilock+0x121/0x200 [xfs] [ 4175.888032] [] xfs_create+0x243/0x7f0 [xfs] [ 4175.888032] [] xfs_vn_mknod+0xa6/0x1b0 [xfs] [ 4175.888032] [] xfs_vn_create+0x13/0x20 [xfs] [ 4175.888032] [] vfs_create+0xb5/0x120 [ 4175.888032] [] do_last+0x992/0xe30 [ 4175.888032] [] path_openat+0xbf/0x500 [ 4175.888032] [] do_filp_open+0x38/0x90 [ 4175.888032] [] do_sys_open+0xf6/0x1e0 [ 4175.888032] [] sys_open+0x21/0x30 [ 4175.888032] [] system_call_fastpath+0x16/0x1b [ 4175.888032] [ 4175.888032] -> (sb_internal){.+.+.?} ops: 233575 { [ 4175.888032] HARDIRQ-ON-R at: [ 4175.888032] [] __lock_acquire+0x4e8/0x1ad0 [ 4175.888032] [] lock_acquire+0xa1/0x1f0 [ 4175.888032] [] __sb_start_write+0xd7/0x1d0 [ 4175.888032] [] xfs_trans_alloc+0x2d/0x50 [xfs] [ 4175.888032] [] xfs_vn_update_time+0x4a/0x260 [xfs] [ 4175.888032] [] update_time+0x25/0xc0 [ 4175.888032] [] touch_atime+0xf2/0x140 [ 4175.888032] [] generic_file_aio_read+0x504/0x720 [ 4175.888032] [] xfs_file_aio_read+0x159/0x380 [xfs] [ 4175.888032] [] do_sync_read+0xa7/0xe0 [ 4175.888032] [] vfs_read+0xac/0x180 [ 4175.888032] [] sys_read+0x4d/0x90 [ 4175.888032] [] system_call_fastpath+0x16/0x1b [ 4175.888032] SOFTIRQ-ON-R at: [ 4175.888032] [] __lock_acquire+0x604/0x1ad0 [ 4175.888032] [] lock_acquire+0xa1/0x1f0 [ 4175.888032] [] __sb_start_write+0xd7/0x1d0 [ 4175.888032] [] xfs_trans_alloc+0x2d/0x50 [xfs] [ 4175.888032] [] xfs_vn_update_time+0x4a/0x260 [xfs] [ 4175.888032] [] update_time+0x25/0xc0 [ 4175.888032] [] touch_atime+0xf2/0x140 [ 4175.888032] [] generic_file_aio_read+0x504/0x720 [ 4175.888032] [] xfs_file_aio_read+0x159/0x380 [xfs] [ 4175.888032] [] do_sync_read+0xa7/0xe0 [ 4175.888032] [] vfs_read+0xac/0x180 [ 4175.888032] [] sys_read+0x4d/0x90 [ 4175.888032] [] system_call_fastpath+0x16/0x1b [ 4175.888032] IN-RECLAIM_FS-R at: [ 4175.888032] [] __lock_acquire+0x54c/0x1ad0 [ 4175.888032] [] lock_acquire+0xa1/0x1f0 [ 4175.888032] [] __sb_start_write+0xd7/0x1d0 [ 4175.888032] [] xfs_trans_alloc+0x2d/0x50 [xfs] [ 4175.888032] [] xfs_free_eofblocks+0x101/0x240 [xfs] [ 4175.888032] [] xfs_inactive+0xaf/0x490 [xfs] [ 4175.888032] [] xfs_fs_evict_inode+0x84/0x190 [xfs] [ 4175.888032] [] evict+0xa7/0x1a0 [ 4175.888032] [] dispose_list+0x3e/0x60 [ 4175.888032] [] prune_icache_sb+0x16b/0x320 [ 4175.888032] [] prune_super+0xe5/0x1b0 [ 4175.888032] [] shrink_slab+0x16b/0x500 [ 4175.888032] [] balance_pgdat+0x611/0x7e0 [ 4175.888032] [] kswapd+0x191/0x610 [ 4175.888032] [] kthread+0xb7/0xc0 [ 4175.888032] [] kernel_thread_helper+0x4/0x10 [ 4175.888032] RECLAIM_FS-ON-R at: [ 4175.888032] [] mark_held_locks+0xb2/0x130 [ 4175.888032] [] lockdep_trace_alloc+0x75/0xd0 [ 4175.888032] [] kmem_cache_alloc+0x2f/0x260 [ 4175.888032] [] kmem_zone_alloc+0x67/0xf0 [xfs] [ 4175.888032] [] kmem_zone_zalloc+0x1d/0x50 [xfs] [ 4175.888032] [] _xfs_trans_alloc+0x37/0xa0 [xfs] [ 4175.888032] [] xfs_trans_alloc+0x3d/0x50 [xfs] [ 4175.888032] [] xfs_vn_update_time+0x4a/0x260 [xfs] [ 4175.888032] [] update_time+0x25/0xc0 [ 4175.888032] [] touch_atime+0xf2/0x140 [ 4175.888032] [] generic_file_aio_read+0x504/0x720 [ 4175.888032] [] xfs_file_aio_read+0x159/0x380 [xfs] [ 4175.888032] [] do_sync_read+0xa7/0xe0 [ 4175.888032] [] vfs_read+0xac/0x180 [ 4175.888032] [] sys_read+0x4d/0x90 [ 4175.888032] [] system_call_fastpath+0x16/0x1b [ 4175.888032] INITIAL USE at: [ 4175.888032] [] __lock_acquire+0x317/0x1ad0 [ 4175.888032] [] lock_acquire+0xa1/0x1f0 [ 4175.888032] [] __sb_start_write+0xd7/0x1d0 [ 4175.888032] [] xfs_trans_alloc+0x2d/0x50 [xfs] [ 4175.888032] [] xfs_vn_update_time+0x4a/0x260 [xfs] [ 4175.888032] [] update_time+0x25/0xc0 [ 4175.888032] [] touch_atime+0xf2/0x140 [ 4175.888032] [] generic_file_aio_read+0x504/0x720 [ 4175.888032] [] xfs_file_aio_read+0x159/0x380 [xfs] [ 4175.888032] [] do_sync_read+0xa7/0xe0 [ 4175.888032] [] vfs_read+0xac/0x180 [ 4175.888032] [] sys_read+0x4d/0x90 [ 4175.888032] [] system_call_fastpath+0x16/0x1b [ 4175.888032] } [ 4175.888032] ... key at: [] xfs_fs_type+0x60/0xfffffffffffdcbe0 [xfs] [ 4175.888032] ... acquired at: [ 4175.888032] [] check_usage_forwards+0x136/0x140 [ 4175.888032] [] mark_lock+0x176/0x2b0 [ 4175.888032] [] __lock_acquire+0x54c/0x1ad0 [ 4175.888032] [] lock_acquire+0xa1/0x1f0 [ 4175.888032] [] __sb_start_write+0xd7/0x1d0 [ 4175.888032] [] xfs_trans_alloc+0x2d/0x50 [xfs] [ 4175.888032] [] xfs_free_eofblocks+0x101/0x240 [xfs] [ 4175.888032] [] xfs_inactive+0xaf/0x490 [xfs] [ 4175.888032] [] xfs_fs_evict_inode+0x84/0x190 [xfs] [ 4175.888032] [] evict+0xa7/0x1a0 [ 4175.888032] [] dispose_list+0x3e/0x60 [ 4175.888032] [] prune_icache_sb+0x16b/0x320 [ 4175.888032] [] prune_super+0xe5/0x1b0 [ 4175.888032] [] shrink_slab+0x16b/0x500 [ 4175.888032] [] balance_pgdat+0x611/0x7e0 [ 4175.888032] [] kswapd+0x191/0x610 [ 4175.888032] [] kthread+0xb7/0xc0 [ 4175.888032] [] kernel_thread_helper+0x4/0x10 [ 4175.888032] [ 4175.888032] [ 4175.888032] stack backtrace: [ 4175.888032] Pid: 41, comm: kswapd0 Not tainted 3.6.0-rc3+ #11 [ 4175.888032] Call Trace: [ 4175.888032] [] print_irq_inversion_bug.part.40+0x1b0/0x1bf [ 4175.888032] [] check_usage_forwards+0x136/0x140 [ 4175.888032] [] ? print_shortest_lock_dependencies+0x1c0/0x1c0 [ 4175.888032] [] mark_lock+0x176/0x2b0 [ 4175.888032] [] __lock_acquire+0x54c/0x1ad0 [ 4175.888032] [] ? sched_clock_cpu+0xa8/0x120 [ 4175.888032] [] ? xfs_iext_bno_to_ext+0x97/0x170 [xfs] [ 4175.888032] [] ? pvclock_clocksource_read+0x61/0xf0 [ 4175.888032] [] lock_acquire+0xa1/0x1f0 [ 4175.888032] [] ? xfs_trans_alloc+0x2d/0x50 [xfs] [ 4175.888032] [] ? sched_clock_local+0x25/0xa0 [ 4175.888032] [] __sb_start_write+0xd7/0x1d0 [ 4175.888032] [] ? xfs_trans_alloc+0x2d/0x50 [xfs] [ 4175.888032] [] ? xfs_trans_alloc+0x2d/0x50 [xfs] [ 4175.888032] [] xfs_trans_alloc+0x2d/0x50 [xfs] [ 4175.888032] [] xfs_free_eofblocks+0x101/0x240 [xfs] [ 4175.888032] [] xfs_inactive+0xaf/0x490 [xfs] [ 4175.888032] [] ? _raw_spin_unlock_irq+0x30/0x50 [ 4175.888032] [] xfs_fs_evict_inode+0x84/0x190 [xfs] [ 4175.888032] [] evict+0xa7/0x1a0 [ 4175.888032] [] dispose_list+0x3e/0x60 [ 4175.888032] [] prune_icache_sb+0x16b/0x320 [ 4175.888032] [] prune_super+0xe5/0x1b0 [ 4175.888032] [] shrink_slab+0x16b/0x500 [ 4175.888032] [] ? mem_cgroup_iter+0x190/0x300 [ 4175.888032] [] ? mem_cgroup_iter+0xdf/0x300 [ 4175.888032] [] balance_pgdat+0x611/0x7e0 [ 4175.888032] [] ? trace_hardirqs_on+0xd/0x10 [ 4175.888032] [] kswapd+0x191/0x610 [ 4175.888032] [] ? wake_up_bit+0x40/0x40 [ 4175.888032] [] ? balance_pgdat+0x7e0/0x7e0 [ 4175.888032] [] kthread+0xb7/0xc0 [ 4175.888032] [] kernel_thread_helper+0x4/0x10 [ 4175.888032] [] ? retint_restore_args+0x13/0x13 [ 4175.888032] [] ? __init_kthread_worker+0x70/0x70 [ 4175.888032] [] ? gs_change+0x13/0x13 -- Jeff Layton From elder@inktank.com Thu Sep 6 07:06:10 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q86C69uC060741 for ; Thu, 6 Sep 2012 07:06:09 -0500 X-ASG-Debug-ID: 1346933227-04bdf01ad351500001-NocioJ Received: from mail-ie0-f181.google.com (mail-ie0-f181.google.com [209.85.223.181]) by cuda.sgi.com with ESMTP id RDBg8Q76YpXaGP0H (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 06 Sep 2012 05:07:08 -0700 (PDT) X-Barracuda-Envelope-From: elder@inktank.com X-Barracuda-Apparent-Source-IP: 209.85.223.181 Received: by ieak12 with SMTP id k12so2922270iea.26 for ; Thu, 06 Sep 2012 05:07:07 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=message-id:date:from:user-agent:mime-version:to:subject :content-type:content-transfer-encoding:x-gm-message-state; bh=dZgw7EYC7HZJbVQlsOKuxLdyY64muXgI4fqzG3SoUfw=; b=RNytNyH2lH9NtqOml+lRL9VgNajJK2RsJ/AvjtjW6ylVWQOfwkOK0l06oVDOg6BcW/ 1TPb+1DPehUmY3AMnXqeYZAA8yWV36reqpq+VbCCtqUb4mqwerlh2Lb8jU+7KPDPANKI x4wdo/RKyvUTuMq++SVy6afnldx0//B2rQ5QFXoSnic4DELjGTUTngiUF66Ndx0TEnI+ TLMNgCdsphoL6MvQADSTUQOti81FQ9DJu22oBow6aVGToDyWXs/ZjC0yh1co6m2U+IWz /m8kyiq0UwMrPRtPPYgZoWHakVI1YOWYCov1ZHhC3mLfFZcTANix7aC7fPS7BxsN0571 EIYQ== Received: by 10.50.159.130 with SMTP id xc2mr2537687igb.33.1346933227636; Thu, 06 Sep 2012 05:07:07 -0700 (PDT) Received: from [172.22.22.4] (c-71-195-31-37.hsd1.mn.comcast.net. [71.195.31.37]) by mx.google.com with ESMTPS id p8sm3272843igl.16.2012.09.06.05.07.06 (version=SSLv3 cipher=OTHER); Thu, 06 Sep 2012 05:07:06 -0700 (PDT) Message-ID: <504891EB.2090202@inktank.com> Date: Thu, 06 Sep 2012 07:07:07 -0500 From: Alex Elder User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:15.0) Gecko/20120827 Thunderbird/15.0 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: Oops from unlock in xfs_trans_ail_delete_bulk() Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: Oops from unlock in xfs_trans_ail_delete_bulk() Content-Transfer-Encoding: 7bit X-Gm-Message-State: ALoCoQl4+S1E38uivOM138YrRcqmRia0oGHYhsetZJH59zIZxmX1GzxvOQjDOdARADyK3ROMrnOS X-Barracuda-Connect: mail-ie0-f181.google.com[209.85.223.181] X-Barracuda-Start-Time: 1346933228 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107771 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- I'm trying to capture something useful here because I need to move on with what I'm doing. I was running xfstests using a kernel with this as the latest commit affecting fs/xfs: commit a0e881b7c189fa2bd76c024dbff91e79511c971d Merge: eff0d13 dbc6e02 Author: Linus Torvalds Date: Wed Aug 1 10:26:23 2012 -0700 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/vi While running test 135 (it had started but its completion time had not yet been reported) I got an oops whose details I'll include below. My console window isn't properly wrapping long lines so some info has been truncated below. The fault address is at __ticket_spin_is_locked+0x10, called via xfs_trans_ail_delete_bulk(). I may be able to offer a little more information if someone is interested, and if I find this is repeatable I will certainly report it. -Alex Entering kdb (current=0xffff880224130000, pid 1413) on processor 5 Oops: (null) due to oops @ 0xffffffff81042c40 CPU 5 dPid: 1413, comm: kworker/5:1H Not tainted 3.6.0-rc2-ceph-00203-gacf44c98 dRIP: 0010:[] [] __ticket_spin_unlock+0x10 dRSP: 0018:ffff88020c603c18 EFLAGS: 00010202 dRAX: 0000000000000000 RBX: ffff880223762e00 RCX: 0000000000000001 dRDX: 0000000000000001 RSI: ffff8802211b54d8 RDI: 00750001007f006b dRBP: ffff88020c603c30 R08: dead000000100100 R09: dead000000200200 dR10: 0000000000000000 R11: 0000000000000001 R12: 0003000000000000 dR13: 0000000000000008 R14: ffff880223762210 R15: ffff8802211b54d8 dFS: 0000000000000000(0000) GS:ffff8802272a0000(0000) knlGS:0000000000000000 dCS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b dCR2: 00007f5c17c59120 CR3: 0000000001c0b000 CR4: 00000000000007e0 dDR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 dDR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400 dProcess kworker/5:1H (pid: 1413, threadinfo ffff88020c602000, task ffff880224) dStack: ffffffffa09853ac ffff880223762200 ffff88020c603ca8 ffff88020c603c90 ffffffffa098b7a5 0000000000000000 ffff880200000000 0000000000000000 ffff8802211b54d8 ffff88020c603c90 ffff8802211b54d8 ffff880223762200 dCall Trace: d [] ? xlog_assign_tail_lsn_locked+0x2c/0x70 [xfs] more> d [] xfs_trans_ail_delete_bulk+0x1a5/0x1d0 [xfs] d [] xfs_buf_iodone+0x45/0x60 [xfs] d [] xfs_buf_do_callbacks+0x3c/0x50 [xfs] d [] xfs_buf_iodone_callbacks+0x46/0x230 [xfs] d [] xfs_buf_iodone_work+0x23/0x50 [xfs] d [] process_one_work+0x1a0/0x5f0 d [] ? process_one_work+0x136/0x5f0 d [] ? xfs_buf_get_map+0x1a0/0x1a0 [xfs] d [] worker_thread+0x18d/0x4c0 d [] ? __lock_page+0x70/0x70 d [] ? manage_workers.isra.22+0x2c0/0x2c0 d [] kthread+0xae/0xc0 d [] ? trace_hardirqs_on+0xd/0x10 d [] kernel_thread_helper+0x4/0x10 d [] ? retint_restore_args+0x13/0x13 d [] ? flush_kthread_work+0x1a0/0x1a0 d [] ? gs_change+0x13/0x13 dCode: 00 89 d0 f0 66 0f b1 0f 66 39 d0 0f 94 c0 0f b6 c0 5d c3 0f 1f 84 00 00 [5]kdb> 0xffffffff81042c40 0xffffffff81042c40 = 0xffffffff81042c40 (__ticket_spin_is_locked) [5]kdb> md1c128 0xffffffff81042c00 0xffffffff81042c00 0f b7 17 55 31 c0 48 89 e5 38 d6 74 03 5d c3 90 ...U1.H..8. 0xffffffff81042c10 8d 8a 00 01 00 00 89 d0 f0 66 0f b1 0f 66 39 d0 .........f. 0xffffffff81042c20 0f 94 c0 0f b6 c0 5d c3 0f 1f 84 00 00 00 00 00 ......].... 0xffffffff81042c30 55 48 89 e5 80 07 01 5d c3 0f 1f 80 00 00 00 00 UH.....]... 0xffffffff81042c40 0f b7 07 55 48 89 e5 5d 38 c4 0f 95 c0 0f b6 c0 ...UH..]8.. 0xffffffff81042c50 c3 66 66 66 66 66 66 2e 0f 1f 84 00 00 00 00 00 .ffffff.... 0xffffffff81042c60 0f b7 07 55 48 89 e5 5d 0f b6 d4 28 c2 80 fa 01 ...UH..]... 0xffffffff81042c70 0f 97 c0 0f b6 c0 c3 66 0f 1f 84 00 00 00 00 00 .......f... [5]kdb> 0xffffffff81042c30 0xffffffff81042c30 = 0xffffffff81042c30 (__ticket_spin_unlock) [5]kdb> From ranto.boris@gmail.com Thu Sep 6 07:33:13 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_DKIM_INVALID autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q86CXDfM065899 for ; Thu, 6 Sep 2012 07:33:13 -0500 X-ASG-Debug-ID: 1346934852-04cbb02aa24b640001-NocioJ Received: from mail-ob0-f181.google.com (mail-ob0-f181.google.com [209.85.214.181]) by cuda.sgi.com with ESMTP id xdvEgYY4vx7rVrIO (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 06 Sep 2012 05:34:12 -0700 (PDT) X-Barracuda-Envelope-From: ranto.boris@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.214.181 X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.181] Received: by obbwd18 with SMTP id wd18so2377966obb.26 for ; Thu, 06 Sep 2012 05:34:12 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.181] X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.181] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=SsN46tFeLAmzBXlNXNib7zqN4ESGS7QcJNI7JNykcxI=; b=uM0jSmKNPRlVMjQoZYABZi9waAh1MRYxIetTnZIKj+sJmgztfwIym8lByEliDDUICX kvN8NUJX5PqISQ6fZiYaUw2R6JD+Tu/zDRaax70QEJHEvr08WPAY2n6izMK3lNNyGysk uafmJKZSQcjoF/WEMrX2BrALztgQoBToXNES2SJ+/sBC7ydr5koatlFoc8rwkxV2GQa2 uUz3qCh92H1DQKdnK1AwPh4cORkqNG+i1R+ByzQDj13rtG5/gWrmbTg6cCCPVjIsx35x yXttfj6kHe7iOOMgYEAiOn0mDy1Cw1GaFtfQLitP7kdQDFBdoHVdChGmx04nqwUIydOo TV9w== MIME-Version: 1.0 Received: by 10.182.116.2 with SMTP id js2mr1758296obb.38.1346934852194; Thu, 06 Sep 2012 05:34:12 -0700 (PDT) Received: by 10.60.142.162 with HTTP; Thu, 6 Sep 2012 05:34:12 -0700 (PDT) In-Reply-To: <20120905230431.GK15292@dastard> References: <1343294892-20991-1-git-send-email-david@fromorbit.com> <1343294892-20991-18-git-send-email-david@fromorbit.com> <1346846436.1129.20.camel@localhost> <20120905230431.GK15292@dastard> Date: Thu, 6 Sep 2012 14:34:12 +0200 Message-ID: Subject: Re: [PATCH 17/18] xfstests: convert tests to use new results directory From: Boris Ranto X-ASG-Orig-Subj: Re: [PATCH 17/18] xfstests: convert tests to use new results directory To: Dave Chinner Cc: Boris Ranto , xfs@oss.sgi.com Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: mail-ob0-f181.google.com[209.85.214.181] X-Barracuda-Start-Time: 1346934852 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107773 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Thu, Sep 6, 2012 at 1:04 AM, Dave Chinner wrote: > On Wed, Sep 05, 2012 at 02:00:35PM +0200, Boris Ranto wrote: >> On Thu, 2012-07-26 at 19:28 +1000, Dave Chinner wrote: >> > From: Dave Chinner >> > >> > Essentially the change is simply this. Converting: >> > >> > ... >> $seq.???? >> > >> > to: >> > >> > .... >> $RESULT_DIR/$seq.???? >> > >> > so that output files are directed to the defined output directory. >> > >> > sed to the rescue: >> > >> > $ sed -i -e '/^seq=.*$/a seqres=$RESULT_DIR/$seq' -e 's/seq.full/seqres.full/' tests/*/* >> > >> > will do most of the work automatically. > ..... >> Quite a lot of tests use $here/$seq.full. This results in >> $here/$seqres.full after the sed. $seqres is just a $RESULT_DIR/$seq. >> This would break if RESULT_DIR was set to an absolute path instead of >> relative path. > > Yes. As the patch description says it "will do most of the work", > but it doesn't do all of it. Indeed, supporting full paths for > $RESULT_DIR is actually necessary for other reasons, such as > supporting completely external result destinations. To that end, I > have a patch in my current series that does the rest of the > conversion with the appropriate setup changes: > > commit 08dbbb1e6a82a4ed04e0622b7ee63957fae7721b > Author: Dave Chinner > Date: Wed Aug 22 16:09:33 2012 +1000 > > xfstests: RESULTS_DIR needs to be an absolute path > > > Some tests 'cd ' and then direct output to $RESULT_DIR, > which fails if the current working directory is not $here. > Regardless, if an external results directory is to be used it needs > to have a full path specified and the use of $here as the base of > the results files is completely incorrect. > > Hence change all the $here/$seqres* references to simply be > $seqres*, and instead encode the full path to the results in > $RESULT_DIR. > > Signed-off-by: Dave Chinner > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs OK, I just wanted to report the issue. btw: The installation does not seem to work with the posted patches (it expects the old '[0-9]??' tests to be in the root directory of xfstests). Do you have/work on any patch for that? Regards, Boris From rjohnston@sgi.com Thu Sep 6 07:56:11 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_65 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q86CuBcL070765 for ; Thu, 6 Sep 2012 07:56:11 -0500 Received: from xmail.sgi.com (pv-excas1-dc21-nlb.corp.sgi.com [137.38.102.126]) by relay2.corp.sgi.com (Postfix) with ESMTP id 11B79304089; Thu, 6 Sep 2012 05:57:08 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.1.339.1; Thu, 6 Sep 2012 07:57:07 -0500 Message-ID: <50489DAE.7060904@sgi.com> Date: Thu, 6 Sep 2012 07:57:18 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: Dave Chinner CC: Subject: Re: [PATCH 11/10] xfstests: rework large filesystem testing - add golden output References: <20120831194326.741195404@sgi.com> <1343291989-14987-1-git-send-email-david@fromorbit.com> <20120905222641.GJ15292@dastard> In-Reply-To: <20120905222641.GJ15292@dastard> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] Thanks for the comments. On 09/05/2012 05:26 PM, Dave Chinner wrote: > On Fri, Aug 31, 2012 at 02:43:27PM -0500, rjohnston@sgi.com wrote: >> Patch "rework large filesystem testing" introduces a new option --large-fs >> which creates a new file $SCRATCH_MNT/.use_space. If this 10 part patchset is >> applied, the following tests will fail: >> 019 026 027 028 046 047 050 056 059 060 062 063 064 065 066 > > That's a lot more tests than I see failing. It is very repeatable for me. > >> This patch accounts for the following new output when testing xfs filesystems with >> the --large-fs option by creating new output file to compare against >> ($seq.largefs.out): > > Creating new output files is the absolute last resort. Indeed, what > happens when you get different output for tests that already select > an output file based on, say, platform or some other criteria? We > get a combinatorial explosion of golden output files, and that is > simply not manageable. > > The usual thing to do is update the necessary filters or change the > way the tests run to avoid trivial output file differences e.g. use > a subdir rather than SCRATCH_MNT directly. Or, for example the > filters that munge different standard error messages from different > platforms to be the same... > OK good to know. >> 1. The following four lines appear in test 019. >> File: "./.use_space" >> Size: 6312890368 Filetype: Regular File >> Mode: (0600/-rw-------) Uid: (0) Gid: (0) >> Device: Inode: Links: 1 > > This test doesn't really need to be run for large filesystems - > running it on large filesystems doesn't improve the coverage of or > our confidence in the code it is testing, so I'd just add a > _require_no_large_scratch_dev to it. > Works for me. >> 2. When the nodump attribute is set, the xfsdump -e option will cause the >> following additional lines to appear. >> xfsdump: NOTE: pruned 1 files: skip attribute set >> Only in SCRATCH_MNT: .use_space >> SCRATCH_MNT/.use_space > > Ok, those are the errors I haven't seen - not sure why. I'll have to > look into that. > > However, this is definitely a case of updating the dump output > filter to remove these messages from the output stream. The > alternative is to change the common dump code to use a subdirectory > rather than the root directory so it doesn't see these files at all. > Good suggestion >> 3. Number of files off by one. >> xfsrestore: # directories and (off by 1) entries processed > > That would be fixed by using a subdir for the dump tests. I don't > recommend that the number should be filtered, as having dump report > the correct number of files scanned is important. I agree. > >> [ROOT] 0 0 0 00 [--------] (off by 1) 0 0 00 [--------] 0 0 0 00 [--------] > > Perhaps the usre/group of the use_space file needs to be changed so > it doesn't impact on the test results. Alternatively, a filter could > be written/modified to fix the number appropriately. Sounds reasonable. > >> This patch also modifies check and common.quota to use the new output file >> $seq.largefs.out when the --large-fs option is used (LARGE_SCRATCH_DEV = yes) >> or $seq.out when the --large-fs option is NOT used (LARGE_SCRATCH_DEV != yes). >> >> Signed-off-by: Rich Johnston >> >> --- >> 019.largefs.out | 5 +++ >> 026.largefs.out | 4 ++- >> 027.largefs.out | 2 - >> 028.largefs.out | 5 +++ >> 046.largefs.out | 3 +- >> 047.largefs.out | 5 +++ >> 050.largefs.out | 72 ++++++++++++++++++++++++++++---------------------------- >> 056.largefs.out | 3 +- >> 059.largefs.out | 2 + >> 060.largefs.out | 4 ++- >> 062.largefs.out | 2 + >> 063.largefs.out | 3 +- >> 064.largefs.out | 41 ++++++++++++++++--------------- >> 065.largefs.out | 29 +++++++++++----------- >> 066.largefs.out | 3 +- >> check | 12 +++++++-- >> common.quota | 20 ++++++++++----- >> 17 files changed, 128 insertions(+), 87 deletions(-) > > FWIW, this patch is supposed to add these *.largefs.out files, right? The > patch, however: > >> Index: b/019.largefs.out >> =================================================================== >> --- a/019.largefs.out >> +++ b/019.largefs.out >> @@ -9,6 +9,11 @@ Wrote 2048.00Kb (value 0x2c) >> Mode: (0777/drwxrwxrwx) Uid: (3) Gid: (1) >> Device: Inode: Links: 3 >> >> + File: "./.use_space" >> + Size: 6312890368 Filetype: Regular File >> + Mode: (0600/-rw-------) Uid: (0) Gid: (0) >> +Device: Inode: Links: 1 >> + >> File: "./bigfile" >> Size: 2097152 Filetype: Regular File >> Mode: (0666/-rw-rw-rw-) Uid: (3) Gid: (0) > > ... assumes they already exist... > Yup my bad, I only posted the differences from the original *.out files. May I make the suggested changes, or as this is your patchset do you want to make them? Regards, --Rich > Cheers, > > Dave. > From ranto.boris@gmail.com Thu Sep 6 07:57:52 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.0 required=5.0 tests=BAYES_00,FREEMAIL_FROM, FREEMAIL_REPLY,TVD_SUBJ_NUM_OBFU_MINFP,T_DKIM_INVALID autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q86CvqqH071149 for ; Thu, 6 Sep 2012 07:57:52 -0500 X-ASG-Debug-ID: 1346936331-04cb6c14a34ed40001-NocioJ Received: from mail-ob0-f181.google.com (mail-ob0-f181.google.com [209.85.214.181]) by cuda.sgi.com with ESMTP id Yv6uWLguIkUPGFfG (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 06 Sep 2012 05:58:51 -0700 (PDT) X-Barracuda-Envelope-From: ranto.boris@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.214.181 X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.181] Received: by obbwd18 with SMTP id wd18so2422693obb.26 for ; Thu, 06 Sep 2012 05:58:51 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.181] X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.181] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=GqRsIn3R5xdAKofHGZYAeCFupU1BnV9STZBudBXGIYA=; b=SyaNFHgp5ITcYbN1dht50itUtOVQR8sLiNG4BY7yxqnq0mm7Be0WpjuAjEQbEnAkh4 BpXT3fRmMv9Oyn+3whNNfDbmmSa2ivMAZ7zaBfbtu6paKwHfHmMMvXfbl108Dc9XYHS4 AkYsNOQ+/oy8Fsu6HsCgQltem0iYXHGMjagMe/98dnl6J8XRydFm2BUQSAn8A1waSE/u ldLjO4GCn1aOTkvgWRKCumWNU+Gsh5iiIaJoT5rmzl0xFkYOUZyFLv6IM5zY857TF57d J5qD9wqtjY4rPpsdNoyFaE71m2Nq+x4UgaBFxo9c5Qz6sfjS65QPHam2fphGT9UeP+tk 5msQ== MIME-Version: 1.0 Received: by 10.60.13.232 with SMTP id k8mr1808651oec.81.1346936330972; Thu, 06 Sep 2012 05:58:50 -0700 (PDT) Received: by 10.60.142.162 with HTTP; Thu, 6 Sep 2012 05:58:50 -0700 (PDT) In-Reply-To: <20120906003150.GM15292@dastard> References: <20120906003150.GM15292@dastard> Date: Thu, 6 Sep 2012 14:58:50 +0200 Message-ID: Subject: Re: [PATCH v2] xfstests: Add test case to test xfs projid32bit functionality a bit more extensively. From: Boris Ranto X-ASG-Orig-Subj: Re: [PATCH v2] xfstests: Add test case to test xfs projid32bit functionality a bit more extensively. To: Dave Chinner Cc: xfs-oss , Eric Sandeen Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: mail-ob0-f181.google.com[209.85.214.181] X-Barracuda-Start-Time: 1346936331 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107775 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Thu, Sep 6, 2012 at 2:31 AM, Dave Chinner wrote: > On Tue, Aug 28, 2012 at 02:59:42PM +0200, Boris Ranto wrote: >> The test covers several areas including enabling projid32bit >> functionality dynamically by xfs_admin, dumping, restoring, quota >> reporting and xfs_db projid values reporting. >> This test case hits two bugs: one for broken xfsdump/xfsrestore >> functionality and one for enabling projid32bit functionality with >> xfs_admin on a LVM device (SCRATCH_DEV must be an LVM device to hit >> this). > > The LVM problem is incidental - if there's a problem with LVM > devices then xfs_db should show the same problem, as should all > other xfs_admin commands that use xfs_db. Hence I don't think that > there is any point in mentioning it here. > >> This version does not create/handle any loop devices. >> >> Signed-off-by: Boris Ranto >> --- >> 285 | 138 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ >> 285.out | 27 ++++++++++++ >> group | 1 + >> 3 files changed, 166 insertions(+), 0 deletions(-) >> create mode 100644 285 >> create mode 100644 285.out >> >> diff --git a/285 b/285 >> new file mode 100644 >> index 0000000..ad96aa6 >> --- /dev/null >> +++ b/285 >> @@ -0,0 +1,138 @@ >> +#! /bin/bash >> +# FS QA Test No. 285 >> +# >> +# Test to verify project quota xfs_admin, xfsdump/xfsrestore and >> +# xfs_db functionality >> +# >> +#----------------------------------------------------------------------- >> +# Copyright (c) 2012 Boris Ranto. All Rights Reserved. > > Shouldn't this be Red Hat? > Probably yes, I'll change that in next version. >> +# >> +# This program is free software; you can redistribute it and/or >> +# modify it under the terms of the GNU General Public License as >> +# published by the Free Software Foundation. >> +# >> +# This program is distributed in the hope that it would be useful, >> +# but WITHOUT ANY WARRANTY; without even the implied warranty of >> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the >> +# GNU General Public License for more details. >> +# >> +# You should have received a copy of the GNU General Public License >> +# along with this program; if not, write the Free Software Foundation, >> +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA >> +# >> +#----------------------------------------------------------------------- >> +# >> +# creator >> +owner=ranto.boris@gmail.com >> + >> +seq=`basename $0` >> +echo "QA output created by $seq" >> +tmp=/tmp/$$ >> +here=`pwd` >> +status=1 # failure is the default! >> +trap "_cleanup; exit \$status" 0 1 2 3 15 >> +rm -f $seq.full >> + >> +# get standard environment, filters and checks >> +. ./common.rc >> +. ./common.quota >> + >> +_cleanup() >> +{ >> + cd / >> + umount $SCRATCH_MNT 2>/dev/null >> + rm -rf $tmp.* >> +} >> + >> +# real QA test starts here >> +_supported_fs xfs >> +_require_xfs_quota >> +_require_scratch >> +_require_projid32bit >> + >> +export MOUNT_OPTIONS="-opquota" > > Kill that - '_qmount_option "pquota"' is the preferred way to do > specific project quota configuration mounts. > I didn't know that, 244 that I used as a starting point used the MOUNT_OPTIONS. >> + >> +# create xfs fs without projid32bit ability, will be gained by xfs_admin >> +_scratch_mkfs_xfs -i projid32bit=0 -d size=200m >> $seq.full || _fail >> "mkfs failed" > > You need to turn off line wrapping when you post patches. > >> +_qmount > > _qmount_option "pquota" > >> +# require project quotas >> +_require_prjquota $SCRATCH_DEV >> + >> +dir=$SCRATCH_MNT/pquota >> + >> +status=1 >> + >> +mkdir -p $dir >> +touch $dir/{16,32}less > > "less" is a weird filename suffix. What's it mean? Why not just > something standard like "test"? > As Eric suggested it just meant that the number is less than 16/32 bits. >> +inode16a=$(ls -i $dir/16less|cut -d ' ' -f 1) >> +inode32a=$(ls -i $dir/32less|cut -d ' ' -f 1) >> +$XFS_QUOTA_PROG -x -c "project -s -p $dir/16less 1234" $SCRATCH_DEV \ >> + >> $seq.full >> +$XFS_QUOTA_PROG -x -c "project -s -p $dir/32less 2123456789" $SCRATCH_DEV \ >> + >> $seq.full 2>&1 >> +# These will be checked by $seq.out > > No need for comments like this > >> +echo "No 32bit project quotas:" >> +$XFS_IO_PROG -r -c "lsproj" $dir/16less >> +$XFS_IO_PROG -r -c "lsproj" $dir/32less >> + >> +umount $SCRATCH_MNT >> + >> +# Now, enable projid32bit support by xfs_admin >> +xfs_admin -p $SCRATCH_DEV > /dev/null 2>&1 > > Output to $seq.full, and use the _fail script if xfs-admin returned > an error. > >> +echo "xfs_admin returned $?" >> + >> +# Now mount the fs, 32bit project quotas shall be supported, now >> +_qmount >> +$XFS_QUOTA_PROG -x -c "project -s -p $dir/32less 2123456789" $SCRATCH_DEV \ >> + >> $seq.full >> + >> +# These will be checked by $seq.out >> +echo "With 32bit project quota support:" >> +$XFS_IO_PROG -r -c "lsproj" $dir/16less >> +$XFS_IO_PROG -r -c "lsproj" $dir/32less >> + >> +# Dump the fs to a temporary file >> +rm -f $tmp.dump.img >> +$XFSDUMP_PROG -f $tmp.dump -L label -M media -l 0 $SCRATCH_MNT >> >> $seq.full || _fail "dump failed" >> +echo "xfsdump returned $?" > > If xfsdump failed, this won't be run. If it succeeded, the output > will always be zero. So this sort of output is not needed. > >> +# Prepare the device to restore the dumped file system >> +dir=$SCRATCH_MNT/restore/pquota > > This is just confusing - the same variable points to different > directories in different parts of the test. A good reason for > separating the tests. > >> +# Just make the restore dir, the pquota dir will be created by xfsrestore >> +mkdir -p $SCRATCH_MNT/restore >> + >> +# Restore >> +$XFSRESTORE_PROG -f $tmp.dump $SCRATCH_MNT/restore > /dev/null 2>&1 >> +echo "xfsrestore returned $?" >> + >> +# Check that they are the same >> +diff -urpN $SCRATCH_MNT/{,restore}/pquota >> +echo "diff returned $?" > > _fail if diff returned somethign non-zero. > I used these ' returned $?' as a progress points in the output file. >> +touch $dir/32lessv2 >> +inode16b=$(ls -i $dir/16less|cut -d ' ' -f 1) >> +inode32b=$(ls -i $dir/32less|cut -d ' ' -f 1) >> +inode32v2=$(ls -i $dir/32lessv2|cut -d ' ' -f 1) >> +$XFS_QUOTA_PROG -x -c "project -s -p $dir/32lessv2 2123456789" $SCRATCH_MNT \ >> + >> $seq.full > > Why do you shorten some long lines, and not others... > >> +echo "The restored file system + one additional file:" >> +$XFS_IO_PROG -r -c "lsproj" $dir/16less >> +$XFS_IO_PROG -r -c "lsproj" $dir/32less >> +$XFS_IO_PROG -r -c "lsproj" $dir/32lessv2 >> + >> +umount $SCRATCH_MNT >> + >> +# Now, we can examine the file systems with xfs_db >> +# These two should report the same values >> +echo "These two values of 16bit project quota ids shall be the same" > > No need to output this into the out file. The comment says it all, > and we don't need the text in the output file to test for test > failure. > Again, as Eric suggested I used that to improve output file readability and diagnostics. >> +$XFS_DB_PROG -c "inode $inode16a" -c "print core.projid_lo" -c "print >> core.projid_hi" $SCRATCH_DEV > > $XFS_DB_PROG -c "inode $inode16a" \ > -c "print core.projid_lo" \ > -c "print core.projid_hi" \ > $SCRATCH_DEV > > or, because it's called 5 times: > > _print_projid() > { > > $XFS_DB_PROG -c "inode $1" \ > -c "print core.projid_lo" \ > -c "print core.projid_hi" \ > $SCRATCH_DEV > } > > _print_projid $inode16a > _print_projid $inode16b > _print_projid $inode32a > _print_projid $inode32b > _print_projid $inode32v2 > OK, I'll switch to the _print_projid in next version. >> +$XFS_DB_PROG -c "inode $inode16b" -c "print core.projid_lo" -c "print >> core.projid_hi" $SCRATCH_DEV >> + >> +# These three should report the same values >> +echo "These three values of 32bit project quota ids shall be the same" >> +$XFS_DB_PROG -c "inode $inode32a" -c "print core.projid_lo" -c "print >> core.projid_hi" $SCRATCH_DEV >> +$XFS_DB_PROG -c "inode $inode32b" -c "print core.projid_lo" -c "print >> core.projid_hi" $SCRATCH_DEV >> +$XFS_DB_PROG -c "inode $inode32v2" -c "print core.projid_lo" -c >> "print core.projid_hi" $SCRATCH_DEV >> + >> +status=0 >> +exit >> diff --git a/285.out b/285.out >> new file mode 100644 >> index 0000000..a601452 >> --- /dev/null >> +++ b/285.out >> @@ -0,0 +1,27 @@ >> +QA output created by 285 >> +No 32bit project quotas: >> +projid = 1234 >> +projid = 0 >> +xfs_admin returned 0 >> +With 32bit project quota support: >> +projid = 1234 >> +projid = 2123456789 >> +xfsdump returned 0 >> +xfsrestore returned 0 >> +diff returned 0 >> +The restored file system + one additional file: >> +projid = 1234 >> +projid = 2123456789 >> +projid = 2123456789 >> +These two values of 16bit project quota ids shall be the same >> +core.projid_lo = 1234 >> +core.projid_hi = 0 >> +core.projid_lo = 1234 >> +core.projid_hi = 0 >> +These three values of 32bit project quota ids shall be the same >> +core.projid_lo = 24853 >> +core.projid_hi = 32401 >> +core.projid_lo = 24853 >> +core.projid_hi = 32401 >> +core.projid_lo = 24853 >> +core.projid_hi = 32401 >> diff --git a/group b/group >> index 104ed35..bbc74fe 100644 >> --- a/group >> +++ b/group >> @@ -403,3 +403,4 @@ deprecated >> 282 dump ioctl auto quick >> 283 dump ioctl auto quick >> 284 auto >> +285 auto dump quota > > And quick. > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com From sandeen@redhat.com Thu Sep 6 09:19:12 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_52, J_CHICKENPOX_57,TO_NO_BRKTS_PCNT autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q86EJBXd089218 for ; Thu, 6 Sep 2012 09:19:12 -0500 X-ASG-Debug-ID: 1346941211-04cbb02aa2561a0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id k353Hs4tVrDdbHbk for ; Thu, 06 Sep 2012 07:20:11 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q86EK9ip001005 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Thu, 6 Sep 2012 10:20:09 -0400 Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q86EK7ER013450 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Thu, 6 Sep 2012 10:20:08 -0400 Message-ID: <5048B11A.3070709@redhat.com> Date: Thu, 06 Sep 2012 09:20:10 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20120824 Thunderbird/15.0 MIME-Version: 1.0 To: guaneryu@gmail.com CC: xfs-oss , ext4 development Subject: Re: [PATCH] xfstests 285: verify extN statfs f_blocks References: <5047D01E.1070104@redhat.com> X-ASG-Orig-Subj: Re: [PATCH] xfstests 285: verify extN statfs f_blocks In-Reply-To: X-Enigmail-Version: 1.4.4 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1346941211 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com On 9/6/12 3:49 AM, Eryu Guan wrote: > On Thu, Sep 6, 2012 at 6:20 AM, Eric Sandeen wrote: >> extN can report f_blocks in statfs in 2 different ways, based >> on whether or not metadata overhead is counted. This has broken >> in the past, so here's a test for it. >> >> It looks at dumpe2fs output to get total blocks and free blocks >> right after mkfs. The difference should be, by definition, the >> exact amount of metadata overhead. >> >> It then compares this to what's reported via stat -f for f_blocks. >> For "minix" df, it should be exactly equal to the total blocks, >> and for "bsd" df, it should be total blocks less overhead. >> >> It tests that the latter is accurate to within a 1% tolerance. >> >> Today the journal doesn't count as overhead in the statfs call; >> this should be fixed kernelside but for many filesystems it'll be >> within the threshold anyway. >> >> Signed-off-by: Eric Sandeen >> --- >> >> diff --git a/285 b/285 >> new file mode 100755 >> index 0000000..cda8531 >> --- /dev/null >> +++ b/285 >> @@ -0,0 +1,97 @@ >> +#! /bin/bash >> +# FS QA Test No. 286 > > The Test No. should be 285 here? Oh, yes. I figure I'll have to renumber before commit anyway ;) >> +# >> +# Test overhead & df output for extN filesystems >> +# >> +#----------------------------------------------------------------------- >> +# Copyright (c) 2012 Red Hat, Inc. All Rights Reserved. >> +# >> +# This program is free software; you can redistribute it and/or >> +# modify it under the terms of the GNU General Public License as >> +# published by the Free Software Foundation. >> +# >> +# This program is distributed in the hope that it would be useful, >> +# but WITHOUT ANY WARRANTY; without even the implied warranty of >> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the >> +# GNU General Public License for more details. >> +# >> +# You should have received a copy of the GNU General Public License >> +# along with this program; if not, write the Free Software Foundation, >> +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA >> +#----------------------------------------------------------------------- >> +# >> +# creator >> +owner=sandeen@redhat.com >> + >> +seq=`basename $0` >> +echo "QA output created by $seq" >> + >> +here=`pwd` >> +tmp=/tmp/$$ >> +status=1 # failure is the default! >> +trap "_cleanup; exit \$status" 0 1 2 3 15 >> + >> +_cleanup() >> +{ >> + cd / >> + rm -f $tmp.* >> +} >> + >> +# get standard environment, filters and checks >> +. ./common.rc >> +. ./common.filter >> + >> +# real QA test starts here >> + >> +# Modify as appropriate. >> +_supported_fs ext2 ext3 ext4 >> +_supported_os Linux >> +_require_scratch >> + >> +rm -f $seq.full >> + >> +_scratch_mkfs >> $seq.full 2>&1 >> + >> +TOTAL_BLOCKS=`dumpe2fs -h $SCRATCH_DEV 2>/dev/null \ >> + | awk '/Block count:/{print $3}'` >> + >> +FREE_BLOCKS=`dumpe2fs -h $SCRATCH_DEV 2>/dev/null \ >> + | awk '/Free blocks:/{print $3}'` > > I guess TOTAL_BLOCKS and FREE_BLOCKS will be wrong when testing ext4 > on RHEL5 which has a separate dumpe4fs for ext4. dumpe2fs would fail, yes ... I don't know if we really want to special case rhel5's weirdness in xfstests or not ... -Eric > Thanks, > Eryu Guan >> + >> +# nb: kernels today don't count journal blocks as overhead, but should. >> +# For most fileystems this will still be within tolerance. >> +OVERHEAD=$(($TOTAL_BLOCKS-$FREE_BLOCKS)) >> + >> +# bsddf|minixdf >> +# Set the behaviour for the statfs system call. The minixdf >> +# behaviour is to return in the f_blocks field the total number of >> +# blocks of the filesystem, while the bsddf behaviour (which is >> +# the default) is to subtract the overhead blocks used by the ext2 >> +# filesystem and not available for file storage. >> + >> +# stat -f output looks like; we get f_blocks from that, which >> +# varies depending on the df mount options used below: >> + >> +# Filesystem 4K-blocks Used Available Use% Mounted on >> +# /dev/sda8 2405312 2208933 196379 92% / >> + >> +_scratch_mount "-o minixdf" >> +MINIX_F_BLOCKS=`stat -f $SCRATCH_MNT | awk '/^Blocks/{print $3}'` >> +umount $SCRATCH_MNT >> + >> +_scratch_mount "-o bsddf" >> +BSD_F_BLOCKS=`stat -f $SCRATCH_MNT | awk '/^Blocks/{print $3}'` >> +umount $SCRATCH_MNT >> + >> +echo "Overhead is $OVERHEAD out of $TOTAL_BLOCKS" >> $seq.full >> +echo "BSD blocks $BSD_F_BLOCKS" >> $seq.full >> +echo "MINIX blocks $MINIX_F_BLOCKS" >> $seq.full >> + >> +# minix should be exactly equal (hence 0) >> +_within_tolerance "minix f_blocks" $MINIX_F_BLOCKS $TOTAL_BLOCKS 0 -v >> +# bsd should be within ... we'll say 1% >> +_within_tolerance "bsd f_blocks" $BSD_F_BLOCKS $(($TOTAL_BLOCKS-$OVERHEAD)) 1% -v >> + >> +# success, all done >> +status=0 >> +exit >> diff --git a/285.out b/285.out >> new file mode 100644 >> index 0000000..2075e21 >> --- /dev/null >> +++ b/285.out >> @@ -0,0 +1,3 @@ >> +QA output created by 285 >> +minix f_blocks is in range >> +bsd f_blocks is in range >> diff --git a/group b/group >> index 104ed35..0b33178 100644 >> --- a/group >> +++ b/group >> @@ -403,3 +403,4 @@ deprecated >> 282 dump ioctl auto quick >> 283 dump ioctl auto quick >> 284 auto >> +285 auto >> >> -- >> To unsubscribe from this list: send the line "unsubscribe linux-ext4" in >> the body of a message to majordomo@vger.kernel.org >> More majordomo info at http://vger.kernel.org/majordomo-info.html From jack@suse.cz Thu Sep 6 09:56:14 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q86EuEkO097110 for ; Thu, 6 Sep 2012 09:56:14 -0500 X-ASG-Debug-ID: 1346943429-04bdf01ad2611d0001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id 54ViTVFWpmeZEI5C (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 06 Sep 2012 07:57:10 -0700 (PDT) X-Barracuda-Envelope-From: jack@suse.cz X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay1.suse.de (unknown [195.135.220.254]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx2.suse.de (Postfix) with ESMTP id 82CF9A2FD6; Thu, 6 Sep 2012 16:57:09 +0200 (CEST) Received: by quack.suse.cz (Postfix, from userid 1000) id 917582062B; Thu, 6 Sep 2012 16:57:08 +0200 (CEST) Date: Thu, 6 Sep 2012 16:57:08 +0200 From: Jan Kara To: Jeff Layton Cc: xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, Jan Kara Subject: Re: xfs freeze annotation problem on 3.6.0-rc3+ kernel Message-ID: <20120906145708.GB12539@quack.suse.cz> X-ASG-Orig-Subj: Re: xfs freeze annotation problem on 3.6.0-rc3+ kernel References: <20120906063921.749a850a@corrin.poochiereds.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20120906063921.749a850a@corrin.poochiereds.net> User-Agent: Mutt/1.5.20 (2009-06-14) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1346943430 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107783 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu 06-09-12 06:39:21, Jeff Layton wrote: > I got the following xfs-related lockdep pop on a 3.6.0-rc3+ kernel. > I've been able to reproduce this twice now by doing a kernel build on > xfs. > > The last commit from Linus' tree in this kernel is 9acb172. It also has > a pile of my own and Al Viro's patches on top, but I don't think any of > them would affect this. I should be able to test patches for this if > you come up with one, but since I've only seen it twice I'm not sure > how reproducible it is yet. > > [ 4175.887865] > [ 4175.888032] ========================================================= > [ 4175.888032] [ INFO: possible irq lock inversion dependency detected ] > [ 4175.888032] 3.6.0-rc3+ #11 Not tainted > [ 4175.888032] --------------------------------------------------------- > [ 4175.888032] kswapd0/41 just changed the state of lock: > [ 4175.888032] (sb_internal){.+.+.?}, at: [] xfs_trans_alloc+0x2d/0x50 [xfs] > [ 4175.888032] but this lock took another, RECLAIM_FS-unsafe lock in the past: > [ 4175.888032] (&(&ip->i_lock)->mr_lock/1){+.+.+.} > [ 4175.888032] > [ 4175.888032] and interrupts could create inverse lock ordering between them. > [ 4175.888032] > [ 4175.888032] > [ 4175.888032] other info that might help us debug this: > [ 4175.888032] Possible interrupt unsafe locking scenario: > [ 4175.888032] > [ 4175.888032] CPU0 CPU1 > [ 4175.888032] ---- ---- > [ 4175.888032] lock(&(&ip->i_lock)->mr_lock/1); > [ 4175.888032] local_irq_disable(); > [ 4175.888032] lock(sb_internal); > [ 4175.888032] lock(&(&ip->i_lock)->mr_lock/1); > [ 4175.888032] > [ 4175.888032] lock(sb_internal); > [ 4175.888032] > [ 4175.888032] *** DEADLOCK *** This is actually known and has nothing to do with fs freezeing AFAICT. The problem is tham vm_map_ram() can do GFP_KERNEL allocation from deep inside XFS and that can cause deadlocks... It has been discussed here https://lkml.org/lkml/2012/6/13/582, but mm guys have some issues with the simple solution. Honza From tinguely@sgi.com Thu Sep 6 10:07:50 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q86F7oJs099419 for ; Thu, 6 Sep 2012 10:07:50 -0500 Received: from [128.162.232.125] (eagdhcp-232-125.americas.sgi.com [128.162.232.125]) by relay1.corp.sgi.com (Postfix) with ESMTP id 959998F8070; Thu, 6 Sep 2012 08:08:47 -0700 (PDT) Message-ID: <5048BC7F.3060607@sgi.com> Date: Thu, 06 Sep 2012 10:08:47 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 03/13] xfs: rationalise xfs_mount_wq users References: <1346328017-2795-1-git-send-email-david@fromorbit.com> <1346328017-2795-4-git-send-email-david@fromorbit.com> <504622C1.20201@sgi.com> <20120905043000.GE15292@dastard> <504750CB.2090907@sgi.com> <20120906004607.GN15292@dastard> In-Reply-To: <20120906004607.GN15292@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/05/12 19:46, Dave Chinner wrote: > On Wed, Sep 05, 2012 at 08:16:59AM -0500, Mark Tinguely wrote: >> On 09/04/12 23:30, Dave Chinner wrote: >>> On Tue, Sep 04, 2012 at 10:48:17AM -0500, Mark Tinguely wrote: >>>> On 08/30/12 07:00, Dave Chinner wrote: >>>>> - /* >>>>> - * We shouldn't write/force the log if we are in the mount/unmount >>>>> - * process or on a read only filesystem. The workqueue still needs to be >>>>> - * active in both cases, however, because it is used for inode reclaim >>>>> - * during these times. Use the MS_ACTIVE flag to avoid doing anything >>>>> - * during mount. Doing work during unmount is avoided by calling >>>>> - * cancel_delayed_work_sync on this work queue before tearing down >>>>> - * the ail and the log in xfs_log_unmount. >>>>> - */ >>>>> - if (!(mp->m_super->s_flags& MS_ACTIVE)&& >>>>> - !(mp->m_flags& XFS_MOUNT_RDONLY)) { >>>>> + if (!(mp->m_flags& XFS_MOUNT_RDONLY)) { >>>>> /* dgc: errors ignored here */ >>>>> if (mp->m_super->s_writers.frozen == SB_UNFROZEN&& >>>>> xfs_log_need_covered(mp)) >>>>> @@ -408,8 +398,7 @@ xfs_sync_worker( >>>>> else >>>>> xfs_log_force(mp, 0); >>>>> >>>>> - /* start pushing all the metadata that is currently >>>>> - * dirty */ >>>>> + /* start pushing all the metadata that is currently dirty */ >>>>> xfs_ail_push_all(mp->m_ail); >>>>> } >>>>> >>>> >>>> It appears that the removal of the MS_ACTIVE flag is causing the >>>> "atomic_read(&bp->b_hold)> 0," ASSERT. >>> >>> I must be being slow today - I don't see why that would cause any >>> problems. The worker is not started at the end of the mount process >>> after everything is set up (i.e. just before MS_ACTIVE is removed), >>> and the worker is stopped before anything is torn down. That should >>> effectively replicate what the MS_ACTIVE flag is providing in the >>> old code. >>> >>> Can you explain in more detail what lead you to this conclusion? >>> >>> Cheers, >>> >>> Dave. >> >> You are correct, it does not make sense, but with the >> !(mp->m_super->s_flags& MS_ACTIVE) >> test removed, test 107 causes the above assert on >> different machines/architectures. Place the test in, the >> assert does not happen. > > test 107 is not in the auto group. That means it is generally > unreliable as a regression test, so I don't run it. That said, I > don't see anything unusual in that test that would cause problems... > > Cheers, > > Dave. I misspoke, it is xfs test 179. I hit it doing a "check -g auto". My test boxes had CONFIG_XFS_DEBUG=y which may be a factor. The test ran fine on a box without the debug enabled and assert as soon as I added it back. The buffer with zero b_hold count is the freelist buffer (XAGF) for AG0. The buffer is marked STALE, it has already gone through the release code, so there is no transaction pointer nor log item pointer. The xlog_cil_committed() is being called with the XFS_LI_ABORTED flag. The X86_32 machine is now asserting with: XFS: Assertion failed: fs_is_ok, file: /xfs/fs/xfs/xfs_alloc.c, line: 1503 The X86_64 machines are still asserting on the zero b_hold. Adding back the MS_ACTIVE or (it appears) not compiling with the CONFIG_XFS_DEBUG option seems to make the problem go away too. Timing? Does not explain the removal of the XFS_DEBUG. Sorry if this is a wild goose chase. --Mark T. From ranto.boris@gmail.com Thu Sep 6 10:22:39 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.0 required=5.0 tests=BAYES_00,FREEMAIL_FROM, FREEMAIL_REPLY,TVD_SUBJ_NUM_OBFU_MINFP,T_DKIM_INVALID autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q86FMdTE103240 for ; Thu, 6 Sep 2012 10:22:39 -0500 X-ASG-Debug-ID: 1346945018-04cb6c14a55c030001-NocioJ Received: from mail-ob0-f181.google.com (mail-ob0-f181.google.com [209.85.214.181]) by cuda.sgi.com with ESMTP id 0vDRiS38qvNpMh0r (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 06 Sep 2012 08:23:38 -0700 (PDT) X-Barracuda-Envelope-From: ranto.boris@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.214.181 X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.181] Received: by obbwd18 with SMTP id wd18so2747227obb.26 for ; Thu, 06 Sep 2012 08:23:38 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.181] X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.181] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:date:message-id:subject:from:to:cc:content-type; bh=T3d3J6zOVe44q6DSQ7zCr14yZjX76hwKeYDLdqSQuFg=; b=ucnyseHsp+mHnvcXXD3XkPUIbnLlYJrtaptOgf/QQBn6VOTiesv9NNuCLlWwPFXuTM b5dfNfT6+eXw41sQjdMD+/9Br42mZJbIqpxS1V7n5enK9DxpxgflcBLyopEw9LFHMKNs VUybjBkI0CA/WCTrmk54Mt7qLvSkOuxP4rWDb7/XwiLlgBqpVArX6PHpbtNYQaTILBra NlFRAE5PT4m7ve3jccrEzvonE442QCA2wzRpdrAatlhrZ3mCL1rJ0Iy3iUGDRFaTqWRb KpbXsAIijqELsHLT4vn4i46qNnWCaLevxzRHp9njvu7v3R3XEKAo/Adfxe92WDu53QKq K9Sw== MIME-Version: 1.0 Received: by 10.182.212.70 with SMTP id ni6mr2575660obc.44.1346945017956; Thu, 06 Sep 2012 08:23:37 -0700 (PDT) Received: by 10.60.142.162 with HTTP; Thu, 6 Sep 2012 08:23:37 -0700 (PDT) Date: Thu, 6 Sep 2012 17:23:37 +0200 Message-ID: Subject: [PATCH v3] Add test case to test xfs projid32bit functionality a bit more extensively. From: Boris Ranto X-ASG-Orig-Subj: [PATCH v3] Add test case to test xfs projid32bit functionality a bit more extensively. To: xfs-oss Cc: Eric Sandeen , Dave Chinner Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: mail-ob0-f181.google.com[209.85.214.181] X-Barracuda-Start-Time: 1346945018 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107785 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature The test covers several areas including enabling projid32bit functionality dynamically by xfs_admin, dumping, restoring, quota reporting and xfs_db projid values reporting. This test case hits a bug with xfsdump/xfsrestore process on a projid32bit enabled filesystem. Signed-off-by: Boris Ranto --- 285 | 144 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 285.out | 23 ++++++++++ group | 1 + 3 files changed, 168 insertions(+), 0 deletions(-) create mode 100644 285 create mode 100644 285.out diff --git a/285 b/285 new file mode 100644 index 0000000..a1e497d --- /dev/null +++ b/285 @@ -0,0 +1,144 @@ +#! /bin/bash +# FS QA Test No. 285 +# +# Test to verify project quota xfs_admin, xfsdump/xfsrestore and +# xfs_db functionality +# +#----------------------------------------------------------------------- +# Copyright (c) 2012 Red Hat, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +#----------------------------------------------------------------------- +# +# creator +owner=ranto.boris@gmail.com + +seq=`basename $0` +echo "QA output created by $seq" +tmp=/tmp/$$ +here=`pwd` +status=1 # failure is the default! +trap "_cleanup; exit \$status" 0 1 2 3 15 +rm -f $seq.full + +# get standard environment, filters and checks +. ./common.rc +. ./common.quota + +_cleanup() +{ + cd / + umount $SCRATCH_MNT 2>/dev/null + rm -rf $tmp.* +} + +_print_projid() +{ + $XFS_DB_PROG -c "inode $1" \ + -c "print core.projid_lo" \ + -c "print core.projid_hi" \ + $SCRATCH_DEV +} + +# real QA test starts here +_supported_fs xfs +_require_xfs_quota +_require_scratch +_require_projid32bit + +# create xfs fs without projid32bit ability, will be gained by xfs_admin +_scratch_mkfs_xfs -i projid32bit=0 -d size=200m >> $seq.full \ + || _fail "mkfs failed" +_qmount_option "pquota" +_qmount +# require project quotas +_require_prjquota $SCRATCH_DEV + +dir=$SCRATCH_MNT/pquota + +status=1 + +mkdir -p $dir +touch $dir/{16,32}less +inode16a=$(ls -i $dir/16less|cut -d ' ' -f 1) +inode32a=$(ls -i $dir/32less|cut -d ' ' -f 1) +$XFS_QUOTA_PROG -x -c "project -s -p $dir/16less 1234" $SCRATCH_DEV \ + >> $seq.full +$XFS_QUOTA_PROG -x -c "project -s -p $dir/32less 2123456789" $SCRATCH_DEV \ + >> $seq.full 2>&1 + +echo "No 32bit project quotas:" +$XFS_IO_PROG -r -c "lsproj" $dir/16less +$XFS_IO_PROG -r -c "lsproj" $dir/32less + +umount $SCRATCH_MNT + +# Now, enable projid32bit support by xfs_admin +xfs_admin -p $SCRATCH_DEV >> $seq.full 2>&1 || _fail "xfs_admin failed" + +# Now mount the fs, 32bit project quotas shall be supported, now +_qmount_option "pquota" +_qmount +$XFS_QUOTA_PROG -x -c "project -s -p $dir/32less 2123456789" $SCRATCH_DEV \ + >> $seq.full + +# These will be checked by $seq.out +echo "With 32bit project quota support:" +$XFS_IO_PROG -r -c "lsproj" $dir/16less +$XFS_IO_PROG -r -c "lsproj" $dir/32less + +# Dump the fs to a temporary file +rm -f $tmp.dump.img +$XFSDUMP_PROG -f $tmp.dump -L label -M media -l 0 $SCRATCH_MNT >> $seq.full \ + || _fail "dump failed" + +# Prepare the device to restore the dumped file system +restore_dir=$SCRATCH_MNT/restore/pquota + +# Just make the restore dir, the pquota dir will be created by xfsrestore +mkdir -p $SCRATCH_MNT/restore + +# Restore +$XFSRESTORE_PROG -f $tmp.dump $SCRATCH_MNT/restore >> $seq.full 2>&1 \ + || _fail "xfsrestore failed" + +# Check that they are the same +diff -urpN $SCRATCH_MNT/{,restore}/pquota || _fail "diff failed" + +touch $restore_dir/32lessv2 +inode16b=$(ls -i $restore_dir/16less|cut -d ' ' -f 1) +inode32b=$(ls -i $restore_dir/32less|cut -d ' ' -f 1) +inode32v2=$(ls -i $restore_dir/32lessv2|cut -d ' ' -f 1) +$XFS_QUOTA_PROG -x -c "project -s -p $restore_dir/32lessv2 2123456789" \ + $SCRATCH_MNT >> $seq.full +echo "The restored file system + one additional file:" +$XFS_IO_PROG -r -c "lsproj" $restore_dir/16less +$XFS_IO_PROG -r -c "lsproj" $restore_dir/32less +$XFS_IO_PROG -r -c "lsproj" $restore_dir/32lessv2 + +umount $SCRATCH_MNT + +# Now, we can examine the file systems with xfs_db +echo "These two values of 16bit project quota ids shall be the same" +_print_projid $inode16a +_print_projid $inode16b + +echo "These three values of 32bit project quota ids shall be the same" +_print_projid $inode32b +_print_projid $inode32a +_print_projid $inode32v2 + +status=0 +exit diff --git a/285.out b/285.out new file mode 100644 index 0000000..e5cc325 --- /dev/null +++ b/285.out @@ -0,0 +1,23 @@ +QA output created by 285 +No 32bit project quotas: +projid = 1234 +projid = 0 +With 32bit project quota support: +projid = 1234 +projid = 2123456789 +The restored file system + one additional file: +projid = 1234 +projid = 2123456789 +projid = 2123456789 +These two values of 16bit project quota ids shall be the same +core.projid_lo = 1234 +core.projid_hi = 0 +core.projid_lo = 1234 +core.projid_hi = 0 +These three values of 32bit project quota ids shall be the same +core.projid_lo = 24853 +core.projid_hi = 32401 +core.projid_lo = 24853 +core.projid_hi = 32401 +core.projid_lo = 24853 +core.projid_hi = 32401 diff --git a/group b/group index 104ed35..bbc74fe 100644 --- a/group +++ b/group @@ -403,3 +403,4 @@ deprecated 282 dump ioctl auto quick 283 dump ioctl auto quick 284 auto +285 auto dump quota -- 1.7.1 From bpm@sgi.com Thu Sep 6 10:41:02 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q86Ff1xK106762 for ; Thu, 6 Sep 2012 10:41:01 -0500 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay3.corp.sgi.com (Postfix) with ESMTP id 98D4BAC00A; Thu, 6 Sep 2012 08:41:58 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 26B2E4266DC; Thu, 6 Sep 2012 10:41:58 -0500 (CDT) Date: Thu, 6 Sep 2012 10:41:58 -0500 From: Ben Myers To: Alex Elder Cc: xfs@oss.sgi.com Subject: Re: Oops from unlock in xfs_trans_ail_delete_bulk() Message-ID: <20120906154158.GM3274@sgi.com> References: <504891EB.2090202@inktank.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <504891EB.2090202@inktank.com> User-Agent: Mutt/1.5.20 (2009-06-14) Hi Alex, On Thu, Sep 06, 2012 at 07:07:07AM -0500, Alex Elder wrote: > I'm trying to capture something useful here because I need to move > on with what I'm doing. I was running xfstests using a kernel with > this as the latest commit affecting fs/xfs: > > commit a0e881b7c189fa2bd76c024dbff91e79511c971d > Merge: eff0d13 dbc6e02 > Author: Linus Torvalds > Date: Wed Aug 1 10:26:23 2012 -0700 > > Merge branch 'for-linus' of > git://git.kernel.org/pub/scm/linux/kernel/git/vi > > While running test 135 (it had started but its completion time had > not yet been reported) I got an oops whose details I'll include below. > > My console window isn't properly wrapping long lines so some info > has been truncated below. The fault address is at > __ticket_spin_is_locked+0x10, called via xfs_trans_ail_delete_bulk(). > > I may be able to offer a little more information if someone is > interested, and if I find this is repeatable I will certainly > report it. Thanks for the report. This is one we've been struggling with for a little while. Mark has a patch in this thread that seems to work ok: http://oss.sgi.com/archives/xfs/2012-08/msg00463.html And Dave is also working toward a fix in this thread: http://oss.sgi.com/archives/xfs/2012-08/threads.html#00493 I think that this will be resolved soon. For now there are a few options that seem to work around the problem, as described in the first thread. Regards, Ben From rjohnston@sgi.com Thu Sep 6 13:42:40 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q86Igebo143287 for ; Thu, 6 Sep 2012 13:42:40 -0500 Received: from xmail.sgi.com (pv-excas1-dc21.corp.sgi.com [137.38.102.116]) by relay3.corp.sgi.com (Postfix) with ESMTP id 526A0AC00D for ; Thu, 6 Sep 2012 11:43:37 -0700 (PDT) Received: from [128.162.233.55] (128.162.233.55) by xmail.sgi.com (137.38.102.30) with Microsoft SMTP Server (TLS) id 14.1.339.1; Thu, 6 Sep 2012 13:42:49 -0500 Message-ID: <5048EEB4.3030505@sgi.com> Date: Thu, 6 Sep 2012 13:43:00 -0500 From: Rich Johnston User-Agent: Mozilla/5.0 (X11; Linux i686; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 MIME-Version: 1.0 To: Subject: Re: [PATCH 0/5] Use libtool to install apps and remove relative lib paths References: <20120828172605.607853317@sgi.com> <20120904160706.GJ3274@sgi.com> In-Reply-To: <20120904160706.GJ3274@sgi.com> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [128.162.233.55] On Tue, Aug 28, 2012 at 12:26:05PM -0500, Rich Johnston wrote: > This 5 part patchset (for xfstests, dmapi and xfsdump): > > 1. Uses libtool to install the binary from the proper location and display a > warning if any shared library dependancies are not properly installed. > 2. Ensures that a libtool wrapper shell script is not installed in place of > the application when libtool wrappers are being used. > 3. Removes the undocumented feature which allowed xfs developers to build and > run xfstests without having to install the libraries. This can lead to > touble if you expect that xfstests is using the versions of the libraries > installed on the system. > PATCH 1/5 of this series was determined to be unnecessary and was not checked in. PATCHES 2-5 have been checked into the oss.sgi.com repositories. Regards --Rich From david@fromorbit.com Thu Sep 6 18:06:56 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_65 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q86N6uLn203278 for ; Thu, 6 Sep 2012 18:06:56 -0500 X-ASG-Debug-ID: 1346972873-04cbb02aa272110001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id GFrLTDyYeuofaTCq for ; Thu, 06 Sep 2012 16:07:54 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ag4FAMYrSVB5LAKT/2dsb2JhbABFhR62M4EIgiABAQU6HCMQCAMOCi4UJQMhE4gPvAMUin0chikDlVmQHYJ1gUc Received: from ppp121-44-2-147.lns20.syd6.internode.on.net (HELO dastard) ([121.44.2.147]) by ipmail04.adl6.internode.on.net with ESMTP; 07 Sep 2012 08:37:53 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1T9lAs-0003sR-Tp; Fri, 07 Sep 2012 09:07:50 +1000 Date: Fri, 7 Sep 2012 09:07:50 +1000 From: Dave Chinner To: Rich Johnston Cc: xfs@oss.sgi.com Subject: Re: [PATCH 11/10] xfstests: rework large filesystem testing - add golden output Message-ID: <20120906230750.GQ15292@dastard> X-ASG-Orig-Subj: Re: [PATCH 11/10] xfstests: rework large filesystem testing - add golden output References: <20120831194326.741195404@sgi.com> <1343291989-14987-1-git-send-email-david@fromorbit.com> <20120905222641.GJ15292@dastard> <50489DAE.7060904@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50489DAE.7060904@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1346972874 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107815 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Sep 06, 2012 at 07:57:18AM -0500, Rich Johnston wrote: > Thanks for the comments. > > On 09/05/2012 05:26 PM, Dave Chinner wrote: > >On Fri, Aug 31, 2012 at 02:43:27PM -0500, rjohnston@sgi.com wrote: > >>Patch "rework large filesystem testing" introduces a new option --large-fs > >>which creates a new file $SCRATCH_MNT/.use_space. If this 10 part patchset is > >>applied, the following tests will fail: > >> 019 026 027 028 046 047 050 056 059 060 062 063 064 065 066 > > > >That's a lot more tests than I see failing. > > It is very repeatable for me. > > > > >>This patch accounts for the following new output when testing xfs filesystems with > >>the --large-fs option by creating new output file to compare against > >>($seq.largefs.out): > > > >Creating new output files is the absolute last resort. Indeed, what > >happens when you get different output for tests that already select > >an output file based on, say, platform or some other criteria? We > >get a combinatorial explosion of golden output files, and that is > >simply not manageable. > > > >The usual thing to do is update the necessary filters or change the > >way the tests run to avoid trivial output file differences e.g. use > >a subdir rather than SCRATCH_MNT directly. Or, for example the > >filters that munge different standard error messages from different > >platforms to be the same... > > > > OK good to know. > > >>1. The following four lines appear in test 019. > >> File: "./.use_space" > >> Size: 6312890368 Filetype: Regular File > >> Mode: (0600/-rw-------) Uid: (0) Gid: (0) > >> Device: Inode: Links: 1 > > > >This test doesn't really need to be run for large filesystems - > >running it on large filesystems doesn't improve the coverage of or > >our confidence in the code it is testing, so I'd just add a > >_require_no_large_scratch_dev to it. > > > > Works for me. > > >>2. When the nodump attribute is set, the xfsdump -e option will cause the > >> following additional lines to appear. > >> xfsdump: NOTE: pruned 1 files: skip attribute set > >> Only in SCRATCH_MNT: .use_space > >> SCRATCH_MNT/.use_space > > > >Ok, those are the errors I haven't seen - not sure why. I'll have to > >look into that. > > > >However, this is definitely a case of updating the dump output > >filter to remove these messages from the output stream. The > >alternative is to change the common dump code to use a subdirectory > >rather than the root directory so it doesn't see these files at all. > > > > Good suggestion > > >>3. Number of files off by one. > >> xfsrestore: # directories and (off by 1) entries processed > > > >That would be fixed by using a subdir for the dump tests. I don't > >recommend that the number should be filtered, as having dump report > >the correct number of files scanned is important. > > I agree. > > > > >> [ROOT] 0 0 0 00 [--------] (off by 1) 0 0 00 [--------] 0 0 0 00 [--------] > > > >Perhaps the usre/group of the use_space file needs to be changed so > >it doesn't impact on the test results. Alternatively, a filter could > >be written/modified to fix the number appropriately. > > Sounds reasonable. > > > > >>This patch also modifies check and common.quota to use the new output file > >>$seq.largefs.out when the --large-fs option is used (LARGE_SCRATCH_DEV = yes) > >>or $seq.out when the --large-fs option is NOT used (LARGE_SCRATCH_DEV != yes). > >> > >>Signed-off-by: Rich Johnston > >> > >>--- > >> 019.largefs.out | 5 +++ > >> 026.largefs.out | 4 ++- > >> 027.largefs.out | 2 - > >> 028.largefs.out | 5 +++ > >> 046.largefs.out | 3 +- > >> 047.largefs.out | 5 +++ > >> 050.largefs.out | 72 ++++++++++++++++++++++++++++---------------------------- > >> 056.largefs.out | 3 +- > >> 059.largefs.out | 2 + > >> 060.largefs.out | 4 ++- > >> 062.largefs.out | 2 + > >> 063.largefs.out | 3 +- > >> 064.largefs.out | 41 ++++++++++++++++--------------- > >> 065.largefs.out | 29 +++++++++++----------- > >> 066.largefs.out | 3 +- > >> check | 12 +++++++-- > >> common.quota | 20 ++++++++++----- > >> 17 files changed, 128 insertions(+), 87 deletions(-) > > > >FWIW, this patch is supposed to add these *.largefs.out files, right? The > >patch, however: > > > >>Index: b/019.largefs.out > >>=================================================================== > >>--- a/019.largefs.out > >>+++ b/019.largefs.out > >>@@ -9,6 +9,11 @@ Wrote 2048.00Kb (value 0x2c) > >> Mode: (0777/drwxrwxrwx) Uid: (3) Gid: (1) > >> Device: Inode: Links: 3 > >> > >>+ File: "./.use_space" > >>+ Size: 6312890368 Filetype: Regular File > >>+ Mode: (0600/-rw-------) Uid: (0) Gid: (0) > >>+Device: Inode: Links: 1 > >>+ > >> File: "./bigfile" > >> Size: 2097152 Filetype: Regular File > >> Mode: (0666/-rw-rw-rw-) Uid: (3) Gid: (0) > > > >... assumes they already exist... > > > > Yup my bad, I only posted the differences from the original *.out files. > > May I make the suggested changes, or as this is your patchset do you > want to make them? I've got a couple of other fixes to make to the series, so I'll work these in. Thanks for reporting them and prototyping fixes for them. :) Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Sep 6 18:13:07 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q86ND7n4204605 for ; Thu, 6 Sep 2012 18:13:07 -0500 X-ASG-Debug-ID: 1346973243-04cbb02aa372470001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id Q9ycBfpRHCLg1JDU for ; Thu, 06 Sep 2012 16:14:06 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ag0FAN0sSVB5LAKT/2dsb2JhbABFhR62NIEIgiABAQU6HCMQCAMYLhQlAyETiA+8BhSKfYZFA5VZkB2CdQ Received: from ppp121-44-2-147.lns20.syd6.internode.on.net (HELO dastard) ([121.44.2.147]) by ipmail04.adl6.internode.on.net with ESMTP; 07 Sep 2012 08:44:03 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1T9lGs-0003tB-SI; Fri, 07 Sep 2012 09:14:02 +1000 Date: Fri, 7 Sep 2012 09:14:02 +1000 From: Dave Chinner To: Boris Ranto Cc: Boris Ranto , xfs@oss.sgi.com Subject: Re: [PATCH 17/18] xfstests: convert tests to use new results directory Message-ID: <20120906231402.GR15292@dastard> X-ASG-Orig-Subj: Re: [PATCH 17/18] xfstests: convert tests to use new results directory References: <1343294892-20991-1-git-send-email-david@fromorbit.com> <1343294892-20991-18-git-send-email-david@fromorbit.com> <1346846436.1129.20.camel@localhost> <20120905230431.GK15292@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1346973243 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107815 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Sep 06, 2012 at 02:34:12PM +0200, Boris Ranto wrote: > btw: The installation does not seem to work with the posted patches > (it expects the old '[0-9]??' tests to be in the root directory of > xfstests). Do you have/work on any patch for that? I haven't touched the makefiles/install scripts - that's the last thing I planned to do once all the changes are sorted. Thanks for reminding me it needs to be done, though. ;) Cheers Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Sep 6 19:40:49 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q870en2H223114 for ; Thu, 6 Sep 2012 19:40:49 -0500 X-ASG-Debug-ID: 1346978507-04bdf01ad381e80001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id SAmNIzBxPfGaYVg9 for ; Thu, 06 Sep 2012 17:41:48 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ag4FAFZCSVB5LAKT/2dsb2JhbABFhR62NIEIgiABAQQBOhwjBQsIAxguFCUDIROICgUMvAAUin2GRQOVWYk0hmmCdQ Received: from ppp121-44-2-147.lns20.syd6.internode.on.net (HELO dastard) ([121.44.2.147]) by ipmail04.adl6.internode.on.net with ESMTP; 07 Sep 2012 10:11:27 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1T9mdR-00042o-TR; Fri, 07 Sep 2012 10:41:25 +1000 Date: Fri, 7 Sep 2012 10:41:25 +1000 From: Dave Chinner To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: [PATCH 03/13] xfs: rationalise xfs_mount_wq users Message-ID: <20120907004125.GS15292@dastard> X-ASG-Orig-Subj: Re: [PATCH 03/13] xfs: rationalise xfs_mount_wq users References: <1346328017-2795-1-git-send-email-david@fromorbit.com> <1346328017-2795-4-git-send-email-david@fromorbit.com> <504622C1.20201@sgi.com> <20120905043000.GE15292@dastard> <504750CB.2090907@sgi.com> <20120906004607.GN15292@dastard> <5048BC7F.3060607@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5048BC7F.3060607@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1346978507 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107820 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Sep 06, 2012 at 10:08:47AM -0500, Mark Tinguely wrote: > I misspoke, it is xfs test 179. I hit it doing a "check -g auto". > > My test boxes had CONFIG_XFS_DEBUG=y which may be a factor. The > test ran fine on a box without the debug enabled and assert as > soon as I added it back. It is - the assert doesn't exist on a non-DEBUG kernel, so it won't fail. ;) > The buffer with zero b_hold count is the freelist buffer (XAGF) > for AG0. The buffer is marked STALE, it has already gone through > the release code, so there is no transaction pointer nor log item > pointer. The xlog_cil_committed() is being called with the > XFS_LI_ABORTED flag. It looks like another case of this problem: http://oss.sgi.com/archives/xfs/2012-09/msg00021.html Which appears to be another case of the failure that Eric reported he was seeing on test 137: http://oss.sgi.com/archives/xfs/2012-08/msg00019.html http://oss.sgi.com/archives/xfs/2012-09/msg00017.html i.e. what appears to be a double free of a buffer during a forced shutdown. The b_hold assertion that is being hit here is just prior to doing the second free of a buffer. Given that Eric's case was bisected down to the delwri queuing changes, I'd say this is the same cause of this issue. i.e. unrelated to the patch set that was posted. What I can't work out is what reference is going missing, and I can't reproduce it to be able to debug it.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From promotion1000promo@gmail.com Fri Sep 7 05:40:04 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.0 required=5.0 tests=BAYES_99,FREEMAIL_FROM autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q87Ae4PW089094 for ; Fri, 7 Sep 2012 05:40:04 -0500 X-ASG-Debug-ID: 1347014461-04cbb02aa3937b0001-NocioJ Received: from [139.170.1.217] ([139.170.1.217]) by cuda.sgi.com with SMTP id aRbulpqGMq85HMG3 for ; Fri, 07 Sep 2012 03:41:02 -0700 (PDT) X-Barracuda-Envelope-From: promotion1000promo@gmail.com X-Barracuda-Apparent-Source-IP: 139.170.1.217 Message-ID: <049c812d2d07a4d8.xj95x9d1@gmail.com> From: "Formation par Internet" To: Reply-To: "Formation par Internet" Subject: Formation Internet Date: Fri, 7 Sep 2012 18:36:55 +0800 X-ASG-Orig-Subj: Formation Internet Importance: Normal X-Mailer: Microsoft Office Outlook, Build 12.0 MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable EM-Campaign: {8C85DE74-6AA6-4470-A694-74277153A55D} EM-Task: 1 X-Barracuda-Connect: UNKNOWN[139.170.1.217] X-Barracuda-Start-Time: 1347014461 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, RDNS_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107861 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_NONE Delivered to trusted network by a host with no rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 CREEZ=20DES=20SITES-WEB=20ET=20DES=20APPLICATIONS-MOBILES EN=208=20SPECTACULAIRES=20SEANCES=20DE=20FORMATION Avec=20les=20outils=20les=20plus=20populaires=20et=20les=20plus=20en=20dem= ande, soit:=20html5,=20css3,=20php,=20mysql=20et=20jquery. La=20formation=20est=20offerte=20en=20partenariat=20avec=20Jobboom=20 depuis=209=20ans. Prochaine=20formation: Lundi=20le=2010=20Sept.2012 atelier=20php-mysql 450-651-6521 Formation=20Wordpress=20aussi=20disponible. From ranto.boris@gmail.com Fri Sep 7 07:46:08 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_DKIM_INVALID autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q87Ck7PB109915 for ; Fri, 7 Sep 2012 07:46:08 -0500 X-ASG-Debug-ID: 1347022027-04bdf01ad3a8cc0001-NocioJ Received: from mail-ob0-f181.google.com (mail-ob0-f181.google.com [209.85.214.181]) by cuda.sgi.com with ESMTP id 525gdSc8YgDEd012 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 07 Sep 2012 05:47:07 -0700 (PDT) X-Barracuda-Envelope-From: ranto.boris@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.214.181 X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.181] Received: by obbwd18 with SMTP id wd18so4712615obb.26 for ; Fri, 07 Sep 2012 05:47:07 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.181] X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.181] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=x0Xihys7DxP0BYAEc1hc07NrHyWUe1bdcBA8nDqiTDg=; b=FE36s+ByipKEHlWivS6iO11k6aPK5+dPXStIpA8DHeMCzBatlt8rg1x3oaOsEg30yy Sgvvl17PelqUptHYOM2gy1qDAzPDkuT2L41gaXF00qTR1FKnPS0gDvnj2gnJYUUdbv1O +mTdyQLOPwPeNpQD3MemUBUGzZvsueZEguaERmjytU1hAnSamJzDQCWF/HFH3gFhU9XQ /3vZFnq7S87lW5anagSTO4F0eIf60JhkyB4noFqHJEp7qyuPtTpxZ035THbKjCLjbLiG 9j7RyAYoPeqlxwph64VbSkidJqYsiev+h+s8dftT/BUHCJlWz1kArc8fQKk+h3dX1Au0 xCoQ== MIME-Version: 1.0 Received: by 10.182.89.66 with SMTP id bm2mr5764191obb.87.1347022027517; Fri, 07 Sep 2012 05:47:07 -0700 (PDT) Received: by 10.60.142.162 with HTTP; Fri, 7 Sep 2012 05:47:07 -0700 (PDT) In-Reply-To: <20120906231402.GR15292@dastard> References: <1343294892-20991-1-git-send-email-david@fromorbit.com> <1343294892-20991-18-git-send-email-david@fromorbit.com> <1346846436.1129.20.camel@localhost> <20120905230431.GK15292@dastard> <20120906231402.GR15292@dastard> Date: Fri, 7 Sep 2012 14:47:07 +0200 Message-ID: Subject: Re: [PATCH 17/18] xfstests: convert tests to use new results directory From: Boris Ranto X-ASG-Orig-Subj: Re: [PATCH 17/18] xfstests: convert tests to use new results directory To: Dave Chinner Cc: xfs@oss.sgi.com Content-Type: multipart/mixed; boundary=f46d04479f7d746d5404c91c0122 X-Barracuda-Connect: mail-ob0-f181.google.com[209.85.214.181] X-Barracuda-Start-Time: 1347022027 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107869 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature --f46d04479f7d746d5404c91c0122 Content-Type: text/plain; charset=ISO-8859-1 On Fri, Sep 7, 2012 at 1:14 AM, Dave Chinner wrote: > On Thu, Sep 06, 2012 at 02:34:12PM +0200, Boris Ranto wrote: >> btw: The installation does not seem to work with the posted patches >> (it expects the old '[0-9]??' tests to be in the root directory of >> xfstests). Do you have/work on any patch for that? > > I haven't touched the makefiles/install scripts - that's the last > thing I planned to do once all the changes are sorted. Thanks for > reminding me it needs to be done, though. ;) > OK, so I've made it installable with the attached patch. The patch will most probably need to be modified later but now, it might be useful for someone who wants to test your patch series. -Boris > Cheers > > Dave. > -- > Dave Chinner > david@fromorbit.com --f46d04479f7d746d5404c91c0122 Content-Type: application/octet-stream; name="0001-Fix-the-installation-script.patch" Content-Disposition: attachment; filename="0001-Fix-the-installation-script.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_h6t9yt1y0 RnJvbSBiN2ZmMzE5ZWRjNzA0ZDUyODcwM2Y1MzVjMmM1MWEzNTRjZWFiNzEzIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBCb3JpcyBSYW50byA8cmFudG8uYm9yaXNAZ21haWwuY29tPgpE YXRlOiBGcmksIDcgU2VwIDIwMTIgMTQ6MjU6NDIgKzAyMDAKU3ViamVjdDogW1BBVENIXSBGaXgg dGhlIGluc3RhbGxhdGlvbiBzY3JpcHQKIFRoaXMgcGF0Y2ggd2lsbCByZWN1cnNpdmVseSBjYWxs IE1ha2VmaWxlcyBvZiB0ZXN0cyBzdWJkaXJlY3Rvcmllcy4KIEFsbCB0aGUgWzAtOV0/P3ssLip9 IGZpbGVzIGFyZSBpbnN0YWxsZWQgYW5kIGFsbCB0aGUgZ3JvdXAgZmlsZXMgYXJlIGluc3RhbGxl ZAoKLS0tCiBNYWtlZmlsZSAgICAgICAgICAgICAgIHwgICAgOSArKy0tLS0tCiB0ZXN0cy9NYWtl ZmlsZSAgICAgICAgIHwgICA1MCArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysKIHRlc3RzL2J0cmZzL01ha2VmaWxlICAgfCAgIDI3ICsrKysrKysrKysrKysr KysrKysrKysrKysKIHRlc3RzL2V4dDQvTWFrZWZpbGUgICAgfCAgIDI3ICsrKysrKysrKysrKysr KysrKysrKysrKysKIHRlc3RzL2dlbmVyaWMvTWFrZWZpbGUgfCAgIDI3ICsrKysrKysrKysrKysr KysrKysrKysrKysKIHRlc3RzL3NoYXJlZC9NYWtlZmlsZSAgfCAgIDI3ICsrKysrKysrKysrKysr KysrKysrKysrKysKIHRlc3RzL3VkZi9NYWtlZmlsZSAgICAgfCAgIDI3ICsrKysrKysrKysrKysr KysrKysrKysrKysKIHRlc3RzL3hmcy9NYWtlZmlsZSAgICAgfCAgIDI3ICsrKysrKysrKysrKysr KysrKysrKysrKysKIDggZmlsZXMgY2hhbmdlZCwgMjE1IGluc2VydGlvbnMoKyksIDYgZGVsZXRp b25zKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgdGVzdHMvTWFrZWZpbGUKIGNyZWF0ZSBtb2RlIDEw MDY0NCB0ZXN0cy9idHJmcy9NYWtlZmlsZQogY3JlYXRlIG1vZGUgMTAwNjQ0IHRlc3RzL2V4dDQv TWFrZWZpbGUKIGNyZWF0ZSBtb2RlIDEwMDY0NCB0ZXN0cy9nZW5lcmljL01ha2VmaWxlCiBjcmVh dGUgbW9kZSAxMDA2NDQgdGVzdHMvc2hhcmVkL01ha2VmaWxlCiBjcmVhdGUgbW9kZSAxMDA2NDQg dGVzdHMvdWRmL01ha2VmaWxlCiBjcmVhdGUgbW9kZSAxMDA2NDQgdGVzdHMveGZzL01ha2VmaWxl CgpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUgYi9NYWtlZmlsZQppbmRleCAxNDkwZTIxLi4yMzVlOGVj IDEwMDY0NAotLS0gYS9NYWtlZmlsZQorKysgYi9NYWtlZmlsZQpAQCAtMzksNyArMzksNiBAQCBp ZmVxICgkKEhBVkVfQlVJTERERUZTKSwgeWVzKQogaW5jbHVkZSAkKFRPUERJUikvaW5jbHVkZS9i dWlsZGRlZnMKIGVuZGlmCiAKLVRFU1RTID0gJChzaGVsbCBzZWQgLW4gLWUgJy9eWzAtOV1bMC05 XVswLTldKi9zLyAuKi8vcCcgZ3JvdXApCiBDT05GSUdVUkUgPSBjb25maWd1cmUgaW5jbHVkZS9i dWlsZGRlZnMgaW5jbHVkZS9jb25maWcuaAogTFNSQ0ZJTEVTID0gY29uZmlndXJlIGNvbmZpZ3Vy ZS5pbiBhY2xvY2FsLm00IFJFQURNRSBWRVJTSU9OCiBMRElSVCA9IGNvbmZpZy5sb2cgLmx0ZGVw IC5kZXAgY29uZmlnLnN0YXR1cyBjb25maWcuY2FjaGUgY29uZmRlZnMuaCBcCkBAIC00OCwxMyAr NDcsMTQgQEAgTERJUlQgPSBjb25maWcubG9nIC5sdGRlcCAuZGVwIGNvbmZpZy5zdGF0dXMgY29u ZmlnLmNhY2hlIGNvbmZkZWZzLmggXAogCiBMSUJfU1VCRElSUyA9IGluY2x1ZGUgbGliCiBUT09M X1NVQkRJUlMgPSBsdHAgc3JjIG00CitURVNUU19TVUJESVJTID0gdGVzdHMKIGlmZXEgKCQoSEFW RV9ETUFQSSksIHRydWUpCiBUT09MX1NVQkRJUlMgKz0gZG1hcGkKIGVuZGlmCiAKLVNVQkRJUlMg PSAkKExJQl9TVUJESVJTKSAkKFRPT0xfU1VCRElSUykKK1NVQkRJUlMgPSAkKExJQl9TVUJESVJT KSAkKFRPT0xfU1VCRElSUykgJChURVNUU19TVUJESVJTKQogCi1kZWZhdWx0OiBpbmNsdWRlL2J1 aWxkZGVmcyAkKERNQVBJX01BS0VGSUxFKSAkKFRFU1RTKQorZGVmYXVsdDogaW5jbHVkZS9idWls ZGRlZnMgJChETUFQSV9NQUtFRklMRSkKIGlmZXEgKCQoSEFWRV9CVUlMRERFRlMpLCBubykKIAkk KFEpJChNQUtFKSAkKE1BS0VPUFRTKSAkQAogZWxzZQpAQCAtODcsMTEgKzg3LDggQEAgZGVwZW5k OiBpbmNsdWRlL2J1aWxkZGVmcyAkKGFkZHN1ZmZpeCAtZGVwZW5kLCQoU1VCRElSUykpCiBpbnN0 YWxsOiBkZWZhdWx0ICQoYWRkc3VmZml4IC1pbnN0YWxsLCQoU1VCRElSUykpCiAJJChJTlNUQUxM KSAtbSA3NTUgLWQgJChQS0dfTElCX0RJUikKIAkkKElOU1RBTEwpIC1tIDc1NSBjaGVjayAkKFBL R19MSUJfRElSKQotCSQoSU5TVEFMTCkgLW0gNzU1IFswLTldPz8gJChQS0dfTElCX0RJUikKLQkk KElOU1RBTEwpIC1tIDc1NSBydW4uKiAkKFBLR19MSUJfRElSKQogCSQoSU5TVEFMTCkgLW0gNjQ0 IGdyb3VwICQoUEtHX0xJQl9ESVIpCiAJJChJTlNUQUxMKSAtbSA2NDQgcmFuZG9taXplLmF3ayAk KFBLR19MSUJfRElSKQotCSQoSU5TVEFMTCkgLW0gNjQ0IFswLTldPz8uKiAkKFBLR19MSUJfRElS KQogCSQoSU5TVEFMTCkgLW0gNjQ0IGNvbW1vbiogJChQS0dfTElCX0RJUikKIAogIyBOb3RoaW5n LgpkaWZmIC0tZ2l0IGEvdGVzdHMvTWFrZWZpbGUgYi90ZXN0cy9NYWtlZmlsZQpuZXcgZmlsZSBt b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDM3NGY0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVz dHMvTWFrZWZpbGUKQEAgLTAsMCArMSw1MCBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTIgUmVk IEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJl ZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1 bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1 Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAy IG9mIHRoZQorIyBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9u LgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3 aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4g dGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9S IEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyMgR2VuZXJhbCBQdWJsaWMgTGlj ZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBj b3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMg cHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9u LCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisjIDAy MTEwLTEzMDEsIFVTQS4KKyMKKworVE9QRElSID0gLi4KK2luY2x1ZGUgJChUT1BESVIpL2luY2x1 ZGUvYnVpbGRkZWZzCisKK2lmZXEgKCIkKG9yaWdpbiBWKSIsICJjb21tYW5kIGxpbmUiKQorICBC VUlMRF9WRVJCT1NFID0gJChWKQorZW5kaWYKK2lmbmRlZiBCVUlMRF9WRVJCT1NFCisgIEJVSUxE X1ZFUkJPU0UgPSAwCitlbmRpZgorCitpZmVxICgkKEJVSUxEX1ZFUkJPU0UpLDEpCisgIFEgPQor ZWxzZQorICBRID0gQAorZW5kaWYKKworTUFLRU9QVFMgPSAtLW5vLXByaW50LWRpcmVjdG9yeSBR PSQoUSkKKworU1VCRElSUyA9IGJ0cmZzIGV4dDQgZ2VuZXJpYyBzaGFyZWQgdWRmIHhmcworCisj IE5vdGhpbmcKK2FsbDoKKworIyBKdXN0IGNhbGwgZXZlcnl0aGluZyBpbXBvcnRhbnQKK2luc3Rh bGw6IGRpciAkKGFkZHN1ZmZpeCAtaW5zdGFsbCwkKFNVQkRJUlMpKQorCitkaXI6CisJJChJTlNU QUxMKSAtbSA3NTUgLWQgJChQS0dfTElCX0RJUikvdGVzdHMKKworJS1pbnN0YWxsOgorCSQoTUFL RSkgJChNQUtFT1BUUykgLUMgJCogaW5zdGFsbApkaWZmIC0tZ2l0IGEvdGVzdHMvYnRyZnMvTWFr ZWZpbGUgYi90ZXN0cy9idHJmcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw MDAwMDAwLi44ZDFmOWYyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvYnRyZnMvTWFrZWZpbGUK QEAgLTAsMCArMSwyNyBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTIgUmVkIEhhdCwgSW5jLiBB bGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsg eW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVy bXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0 aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorIyBM aWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlz IHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1 bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQg d2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB UiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9y ZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBH TlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYg bm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBG cmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisjIDAyMTEwLTEzMDEsIFVT QS4KKyMKKworVE9QRElSPS4uLy4uCitpbmNsdWRlICQoVE9QRElSKS9pbmNsdWRlL2J1aWxkZGVm cworCitpbnN0YWxsOgorCSQoSU5TVEFMTCkgLW0gNzU1IC1kICQoUEtHX0xJQl9ESVIpL3Rlc3Rz L2J0cmZzCisJJChJTlNUQUxMKSAtbSA3NTUgWzAtOV0/PyAkKFBLR19MSUJfRElSKS90ZXN0cy9i dHJmcworCSQoSU5TVEFMTCkgLW0gNzU1IFswLTldPz8uKiAkKFBLR19MSUJfRElSKS90ZXN0cy9i dHJmcworCSQoSU5TVEFMTCkgLW0gNzU1IGdyb3VwICQoUEtHX0xJQl9ESVIpL3Rlc3RzL2J0cmZz CmRpZmYgLS1naXQgYS90ZXN0cy9leHQ0L01ha2VmaWxlIGIvdGVzdHMvZXh0NC9NYWtlZmlsZQpu ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTI3NDI1Ci0tLSAvZGV2L251bGwK KysrIGIvdGVzdHMvZXh0NC9NYWtlZmlsZQpAQCAtMCwwICsxLDI3IEBACisjCisjIENvcHlyaWdo dCAoQykgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBUaGlzIHByb2dy YW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1v ZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl IGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIg dmVyc2lvbiAyIG9mIHRoZQorIyBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRl ciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUg dGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRo b3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJ VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyMgR2VuZXJhbCBQ dWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVj ZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3 aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBG b3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24s IE1BCisjIDAyMTEwLTEzMDEsIFVTQS4KKyMKKworVE9QRElSPS4uLy4uLworaW5jbHVkZSAkKFRP UERJUikvaW5jbHVkZS9idWlsZGRlZnMKKworaW5zdGFsbDoKKwkkKElOU1RBTEwpIC1tIDc1NSAt ZCAkKFBLR19MSUJfRElSKS90ZXN0cy9leHQ0CisJJChJTlNUQUxMKSAtbSA3NTUgWzAtOV0/PyAk KFBLR19MSUJfRElSKS90ZXN0cy9leHQ0CisJJChJTlNUQUxMKSAtbSA3NTUgWzAtOV0/Py4qICQo UEtHX0xJQl9ESVIpL3Rlc3RzL2V4dDQKKwkkKElOU1RBTEwpIC1tIDc1NSBncm91cCAkKFBLR19M SUJfRElSKS90ZXN0cy9leHQ0CmRpZmYgLS1naXQgYS90ZXN0cy9nZW5lcmljL01ha2VmaWxlIGIv dGVzdHMvZ2VuZXJpYy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw Li42NTI5MzkzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZ2VuZXJpYy9NYWtlZmlsZQpAQCAt MCwwICsxLDI3IEBACisjCisjIENvcHlyaWdodCAoQykgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRz IFJlc2VydmVkLgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBy ZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhl IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBT b2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorIyBMaWNlbnNlLCBv ciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0g aXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0 IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkg b2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NF LiAgU2VlIHRoZSBHTlUKKyMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxz LgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJh bCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0 ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBT dHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisjIDAyMTEwLTEzMDEsIFVTQS4KKyMKKwor VE9QRElSPS4uLy4uLworaW5jbHVkZSAkKFRPUERJUikvaW5jbHVkZS9idWlsZGRlZnMKKworaW5z dGFsbDoKKwkkKElOU1RBTEwpIC1tIDc1NSAtZCAkKFBLR19MSUJfRElSKS90ZXN0cy9nZW5lcmlj CisJJChJTlNUQUxMKSAtbSA3NTUgWzAtOV0/PyAkKFBLR19MSUJfRElSKS90ZXN0cy9nZW5lcmlj CisJJChJTlNUQUxMKSAtbSA3NTUgWzAtOV0/Py4qICQoUEtHX0xJQl9ESVIpL3Rlc3RzL2dlbmVy aWMKKwkkKElOU1RBTEwpIC1tIDc1NSBncm91cCAkKFBLR19MSUJfRElSKS90ZXN0cy9nZW5lcmlj CmRpZmYgLS1naXQgYS90ZXN0cy9zaGFyZWQvTWFrZWZpbGUgYi90ZXN0cy9zaGFyZWQvTWFrZWZp bGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMyYmE3YwotLS0gL2Rldi9u dWxsCisrKyBiL3Rlc3RzL3NoYXJlZC9NYWtlZmlsZQpAQCAtMCwwICsxLDI3IEBACisjCisjIENv cHlyaWdodCAoQykgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBUaGlz IHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29y CisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBM aWNlbnNlIGFzCisjIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBl aXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorIyBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFu eSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhl IGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZ OyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZ IG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyMgR2Vu ZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhh dmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBh bG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2Fy ZQorIyBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBC b3N0b24sIE1BCisjIDAyMTEwLTEzMDEsIFVTQS4KKyMKKworVE9QRElSPS4uLy4uLworaW5jbHVk ZSAkKFRPUERJUikvaW5jbHVkZS9idWlsZGRlZnMKKworaW5zdGFsbDoKKwkkKElOU1RBTEwpIC1t IDc1NSAtZCAkKFBLR19MSUJfRElSKS90ZXN0cy9zaGFyZWQKKwkkKElOU1RBTEwpIC1tIDc1NSBb MC05XT8/ICQoUEtHX0xJQl9ESVIpL3Rlc3RzL3NoYXJlZAorCSQoSU5TVEFMTCkgLW0gNzU1IFsw LTldPz8uKiAkKFBLR19MSUJfRElSKS90ZXN0cy9zaGFyZWQKKwkkKElOU1RBTEwpIC1tIDc1NSBn cm91cCAkKFBLR19MSUJfRElSKS90ZXN0cy9zaGFyZWQKZGlmZiAtLWdpdCBhL3Rlc3RzL3VkZi9N YWtlZmlsZSBiL3Rlc3RzL3VkZi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw MDAwMDAwLi5iMzRhMTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvdWRmL01ha2VmaWxlCkBA IC0wLDAgKzEsMjcgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSBSZWQgSGF0LCBJbmMuIEFsbCBSaWdo dHMgUmVzZXJ2ZWQuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2Fu IHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0 aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyMgcHVibGlzaGVkIGJ5IHRoZSBGcmVl IFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisjIExpY2Vuc2Us IG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3Jh bSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBi dXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50 eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBP U0UuICBTZWUgdGhlIEdOVQorIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFp bHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5l cmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdy aXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGlu IFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyMgMDIxMTAtMTMwMSwgVVNBLgorIwor CitUT1BESVI9Li4vLi4vCitpbmNsdWRlICQoVE9QRElSKS9pbmNsdWRlL2J1aWxkZGVmcworCitp bnN0YWxsOgorCSQoSU5TVEFMTCkgLW0gNzU1IC1kICQoUEtHX0xJQl9ESVIpL3Rlc3RzL3VkZgor CSQoSU5TVEFMTCkgLW0gNzU1IFswLTldPz8gJChQS0dfTElCX0RJUikvdGVzdHMvdWRmCisJJChJ TlNUQUxMKSAtbSA3NTUgWzAtOV0/Py4qICQoUEtHX0xJQl9ESVIpL3Rlc3RzL3VkZgorCSQoSU5T VEFMTCkgLW0gNzU1IGdyb3VwICQoUEtHX0xJQl9ESVIpL3Rlc3RzL3VkZgpkaWZmIC0tZ2l0IGEv dGVzdHMveGZzL01ha2VmaWxlIGIvdGVzdHMveGZzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAw NjQ0CmluZGV4IDAwMDAwMDAuLmRjNDc3OGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy94ZnMv TWFrZWZpbGUKQEAgLTAsMCArMSwyNyBAQAorIworIyBDb3B5cmlnaHQgKEMpIFJlZCBIYXQsIElu Yy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdh cmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorIyBtb2RpZnkgaXQgdW5kZXIgdGhl IHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQg YnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUK KyMgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMg VGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1 c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBs aWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJ Q1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisjIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9y IG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0 aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07 IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwg NTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorIyAwMjExMC0xMzAx LCBVU0EuCisjCisKK1RPUERJUj0uLi8uLi8KK2luY2x1ZGUgJChUT1BESVIpL2luY2x1ZGUvYnVp bGRkZWZzCisKK2luc3RhbGw6CisJJChJTlNUQUxMKSAtbSA3NTUgLWQgJChQS0dfTElCX0RJUikv dGVzdHMveGZzCisJJChJTlNUQUxMKSAtbSA3NTUgWzAtOV0/PyAkKFBLR19MSUJfRElSKS90ZXN0 cy94ZnMKKwkkKElOU1RBTEwpIC1tIDc1NSBbMC05XT8/LiogJChQS0dfTElCX0RJUikvdGVzdHMv eGZzCisJJChJTlNUQUxMKSAtbSA3NTUgZ3JvdXAgJChQS0dfTElCX0RJUikvdGVzdHMveGZzCi0t IAoxLjcuMQoK --f46d04479f7d746d5404c91c0122-- From sandeen@sandeen.net Fri Sep 7 14:54:07 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q87Js69o191036 for ; Fri, 7 Sep 2012 14:54:06 -0500 X-ASG-Debug-ID: 1347047706-04bdf01ad5c5680001-NocioJ Received: from mail.sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id dsiMMHtypg4e22KB for ; Fri, 07 Sep 2012 12:55:06 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) (Authenticated sender: sandeen) by mail.sandeen.net (Postfix) with ESMTP id 0493F4963294; Fri, 7 Sep 2012 14:55:06 -0500 (CDT) Message-ID: <504A511A.8090209@sandeen.net> Date: Fri, 07 Sep 2012 14:55:06 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20120824 Thunderbird/15.0 MIME-Version: 1.0 To: Tao Ma CC: Dave Chinner , xfs@oss.sgi.com Subject: Re: [PATCH] xfstests: make 275 xfs specific. References: <1336230429-2939-1-git-send-email-tm@tao.ma> <20120505233744.GE25351@dastard> <4FA692B7.9040006@tao.ma> X-ASG-Orig-Subj: Re: [PATCH] xfstests: make 275 xfs specific. In-Reply-To: <4FA692B7.9040006@tao.ma> X-Enigmail-Version: 1.4.4 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1347047706 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107899 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 5/6/12 10:03 AM, Tao Ma wrote: > On 05/06/2012 07:37 AM, Dave Chinner wrote: >> On Sat, May 05, 2012 at 11:07:09PM +0800, Tao Ma wrote: >>> From: Tao Ma >>> >>> In my test with ext4, 275 can't pass because ext4 >>> can create a 8k file in the end not like what xfs >>> does. So make this test case xfs only for now. >> >> It's not an XFS specific test - it's a test that is supposed to test >> POSIX write behaviour. i.e. if the filesystem is full, and then you >> free 4k of space, then an 8k write should only be able to write 4k, >> yes? > Yes, but it doesn't work as expected for ext4. Came across this thread again. I had patches on the list a while ago to fix it up. [PATCH V2] xfstests: make 275 pass But it never got fully reviewed or merged. :( -Eric >> So doesn't a failure on ext4 indicate that there's something wrong >> with ext4 (either it's ENOSPC detection or the short write >> handling), not the test? > Actually in my test, ext4 can create the file with 8K file size, not a > short write. I haven't looked into it yet. But AFAICS, if we have an > ext4 volume with 8k cluster size, a 4k file can occupy a 8k cluster and > the final write of 8k will succeed instead of the short write. > > Thanks > Tao > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From sandeen@sandeen.net Fri Sep 7 14:55:38 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_54 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q87Jtc3Z191370 for ; Fri, 7 Sep 2012 14:55:38 -0500 X-ASG-Debug-ID: 1347047798-04cbb02aa4b4030001-NocioJ Received: from mail.sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id B7KsqyzViaE2PYjl for ; Fri, 07 Sep 2012 12:56:38 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) (Authenticated sender: sandeen) by mail.sandeen.net (Postfix) with ESMTP id 42FED4963294; Fri, 7 Sep 2012 14:56:38 -0500 (CDT) Message-ID: <504A5176.5020302@sandeen.net> Date: Fri, 07 Sep 2012 14:56:38 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20120824 Thunderbird/15.0 MIME-Version: 1.0 To: Dave Chinner CC: Eric Sandeen , ext4 development , Eryu Guan , xfs-oss , Zach Brown Subject: Re: [PATCH V3] xfstests: make 275 pass References: <4F04A6E6.1090304@redhat.com> <4F04BC81.1000207@redhat.com> <20120104231725.GB24466@dastard> <4F207079.6050401@sandeen.net> X-ASG-Orig-Subj: Re: [PATCH V3] xfstests: make 275 pass In-Reply-To: <4F207079.6050401@sandeen.net> X-Enigmail-Version: 1.4.4 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1347047798 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107899 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 1/25/12 3:13 PM, Eric Sandeen wrote: > Ok, this is a significant rework of 275, which made too many > assumptions about details of space usage and failed on several > filesystems (it passed on xfs, but only by accident). > > This new version tries to leave about 256k free, then tries > a single 1M IO, and fails only if 0 bytes are written. > > It also sends a lot more to $seq.full for debugging on failure > and fixes a few other stylistic things. > > Signed-off-by: Eric Sandeen > --- Poor Zach ran into this one again. Can I get a review of this version, and I'll merge it if it looks good? Thanks, -Eric > V2: bunch of fixups from V1 ;) > V3: use ls for size check, and 2g fs size > > diff --git a/275 b/275 > index 214262e..69b2895 100755 > --- a/275 > +++ b/275 > @@ -1,8 +1,8 @@ > #! /bin/bash > # FS QA Test No. 275 > # > -# The posix write test. when write size is larger than disk free size, > -# should write as more as possible > +# The posix write test. When write size is larger than disk free size, > +# should write as much as possible until ENOSPC. > # > #----------------------------------------------------------------------- > # Copyright (c) 2011-2012 Fujitsu, Inc. All Rights Reserved. > @@ -30,13 +30,12 @@ echo "QA output created by $seq" > > here=`pwd` > tmp=/tmp/$$ > -status=0 # success is the default! > +status=1 # failure is the default! > trap "_cleanup; exit \$status" 0 1 2 3 15 > > _cleanup() > { > cd / > - rm -f $SCRATCH_MNT/* $tmp.* > _scratch_unmount > } > > @@ -49,41 +48,48 @@ _supported_os IRIX Linux > _require_scratch > > echo "------------------------------" > -echo "write lack test" > +echo "write until ENOSPC test" > echo "------------------------------" > > rm -f $seq.full > > umount $SCRATCH_DEV 2>/dev/null > -_scratch_mkfs_sized $((1 * 1024 * 1024 * 1024)) >>$seq.full 2>&1 > +_scratch_mkfs_sized $((2 * 1024 * 1024 * 1024)) >>$seq.full 2>&1 > _scratch_mount > > rm -rf $SCRATCH_MNT/* > -cd $SCRATCH_MNT > > -dd if=/dev/zero of=tmp1 bs=4K count=1 >/dev/null 2>&1 > -if [ $? -ne 0 ] > -then > - echo "create file err" > - status=1 > - exit > -fi > +dd if=/dev/zero of=$SCRATCH_MNT/tmp1 bs=256K count=1 >>$seq.full 2>&1 > +[ $? -ne 0 ] && _fail "Error creating file" > > -dd if=/dev/zero of=tmp2 bs=1M >/dev/null 2>&1 > -dd if=/dev/zero of=tmp3 bs=4K >/dev/null 2>&1 > +# Attempt to completely fill fs > +dd if=/dev/zero of=$SCRATCH_MNT/tmp2 bs=1M >>$seq.full 2>&1 > sync > +dd if=/dev/zero of=$SCRATCH_MNT/tmp3 bs=4K >>$seq.full 2>&1 > +sync > +# Last effort, use O_SYNC > +dd if=/dev/zero of=$SCRATCH_MNT/tmp4 bs=4K oflag=sync >>$seq.full 2>&1 > +# Save space usage info to the full file > +echo "Pre rm space:" >> $seq.full > +df $SCRATCH_MNT >>$seq.full 2>&1 > > -rm -f tmp1 > +# Should leave approx 256k free > +rm -f $SCRATCH_MNT/tmp1 > sync > +echo "Post rm space:" >> $seq.full > +df $SCRATCH_MNT >>$seq.full 2>&1 > +_freespace=`df -k $SCRATCH_MNT | tail -n 1 | awk '{print $4}'` > +[ $_freespace -gt 1024 ] && _fail "could not sufficiently fill filesystem" > + > +# Try a write larger than available space > +dd if=/dev/zero of=$SCRATCH_MNT/tmp1 bs=1M count=1 >>$seq.full 2>&1 > +echo "Bytes written until ENOSPC:" >>$seq.full > +du $SCRATCH_MNT/tmp1 >>$seq.full > > -dd if=/dev/zero of=tmp1 bs=8K count=1 >/dev/null 2>&1 > -_filesize=`du tmp1 | awk '{print $1}'` > -if [ $_filesize -ne 4 ] > -then > - echo "write file err" > - status=1 > - exit > -fi > +# And at least some of it should succeed. > +_filesize=`ls -l $SCRATCH_MNT/tmp1 | awk '{print $5}'` > +[ $_filesize -eq 0 ] && _fail "write file err: Partial write until enospc failed; wrote 0 bytes." > > echo "done" > +status=0 > exit > diff --git a/275.out b/275.out > index 30af43c..69b9d52 100644 > --- a/275.out > +++ b/275.out > @@ -1,5 +1,5 @@ > QA output created by 275 > ------------------------------ > -write lack test > +write until ENOSPC test > ------------------------------ > done > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From raghu.prabhu13@gmail.com Fri Sep 7 16:58:15 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_DKIM_INVALID,T_TO_NO_BRKTS_FREEMAIL autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q87LwFLh216049 for ; Fri, 7 Sep 2012 16:58:15 -0500 X-ASG-Debug-ID: 1347055155-04cbb02aa2ba360001-NocioJ Received: from mail-pb0-f53.google.com (mail-pb0-f53.google.com [209.85.160.53]) by cuda.sgi.com with ESMTP id P4dAFTNPdpjQ9Mb6 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 07 Sep 2012 14:59:15 -0700 (PDT) X-Barracuda-Envelope-From: raghu.prabhu13@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.160.53 X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.53] Received: by pbbro2 with SMTP id ro2so271954pbb.26 for ; Fri, 07 Sep 2012 14:59:15 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.53] X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.53] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:x-mailer; bh=gcO9gQfOXuegDkYiuML94JniEGs7tBgVwxy7nyH3ggk=; b=YH6Veat+JqyLaOUYKm8h6oYK9qIICCkEYbAWlo46SESzG6D6lx9m6/5NxFM7GXbklk NxbSLQShHwgESzLRr7dtickqdp5TCZeVsfS3YN2ssRFlCEkrCf6EghlPXkAnwLWV2NBh nnG5srxQZmXWHG6Uwrhh2UJRR2Ue+50IJXDB7/SSFkdIbi1s7gVNAW5rfQ5uy94xYIBs 0AEml6z8iB+xa5fHeNej858EEToqSECY4mABblGLgbel2swFNz2ZIAIDqelZUhqKLlLH lKYm2rl3CCFyybRef3Tw/uZeNJu3MKvqEWQgVwIdByoGm5gxXVsw6ilX+Wrv+eGsLCss V71w== Received: by 10.68.200.8 with SMTP id jo8mr11482997pbc.148.1347055155074; Fri, 07 Sep 2012 14:59:15 -0700 (PDT) Received: from localhost ([115.241.42.24]) by mx.google.com with ESMTPS id tw5sm3836664pbc.48.2012.09.07.14.59.12 (version=TLSv1/SSLv3 cipher=OTHER); Fri, 07 Sep 2012 14:59:14 -0700 (PDT) From: raghu.prabhu13@gmail.com To: xfs@oss.sgi.com Cc: Raghavendra D Prabhu Subject: [PATCH v5] Stop xfs_do_force_shutdown / messages fron xfs_log_force if filesystem is already shutdown. Date: Sat, 8 Sep 2012 03:28:11 +0530 X-ASG-Orig-Subj: [PATCH v5] Stop xfs_do_force_shutdown / messages fron xfs_log_force if filesystem is already shutdown. Message-Id: <76577fa31ab2aa750994c1bc6a1b6f44beb03116.1347002369.git.rprabhu@wnohang.net> X-Mailer: git-send-email 1.7.12 X-Barracuda-Connect: mail-pb0-f53.google.com[209.85.160.53] X-Barracuda-Start-Time: 1347055155 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107906 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature From: Raghavendra D Prabhu This is to prevent xfs_log_force from printing error message continuously (due to xfs_sync and others) till umount if the disk has been forcefully unplugged. This is to prevent messages like these from being displayed repeatedly. [ 3873.009329] XFS (sdb3): xfs_log_force: error 5 returned. Note, that even after xfs_do_force_shutdown has been called, xfs_log_force doesn't stop till the filesystem has been unmounted (and it keeps printing "error 5 returned" to kernel log). Also, xfs_do_force_shutdown is called repeatedly on an already shutdown filesystem through xfs_fs_sync_fs. To fix this, added condition over XFS_FORCED_SHUTDOWN to xfs_log_force and xfs_fs_sync_fs. To simulate it, mount an xfs filesystem located on external disk, and then pull the power to the disk. Now, the dmesg looks, [ 268.307303] XFS (sdb2): xfs_do_force_shutdown(0x1) called from line 1031 of file fs/xfs/xfs_buf.c. Return address = 0xffffffff8127c13a [ 268.307318] XFS (sdb2): I/O Error Detected. Shutting down filesystem [ 268.307323] XFS (sdb2): Please umount the filesystem and rectify the problem(s) --- Version 1: Removed calling xfs_syncd_stop from xfs_sync_worker. Version 2: Removed calling xfs_fs_writable in xfs_sync_worker and xfs_flush_worker. Version 3: Removed calling xfs_syncd_stop in xfs_bwrite. Version 4: Added return statements to xfs_log_force and xfs_fs_sync_fs. Version 5: As per suggestion, added xfs_warn to xfs_fs_sync_fs and removed EIO return in xfs_log_force Signed-off-by: Raghavendra D Prabhu Tested-by: Raghavendra D Prabhu --- fs/xfs/xfs_log.c | 5 ++++- fs/xfs/xfs_super.c | 5 +++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 7f4f937..161c925 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -3002,7 +3002,10 @@ xfs_log_force( trace_xfs_log_force(mp, 0); error = _xfs_log_force(mp, flags, NULL); - if (error) + /* + * Avoid warning when the filesystem has already shutdown. + */ + if (error && !XFS_FORCED_SHUTDOWN(mp)) xfs_warn(mp, "%s: error %d returned.", __func__, error); } diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index bdaf4cb..ebafc99 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -943,6 +943,11 @@ xfs_fs_sync_fs( if (!wait) return 0; + if (XFS_FORCED_SHUTDOWN(mp)) { + xfs_warn(mp, "Sync called: filesystem already shutdown"); + return XFS_ERROR(EIO); + } + error = xfs_quiesce_data(mp); if (error) return -error; -- 1.7.12 From david@fromorbit.com Fri Sep 7 19:08:57 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8808v7S248929 for ; Fri, 7 Sep 2012 19:08:57 -0500 X-ASG-Debug-ID: 1347062996-04bdf01ad5d3be0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id yIlh1xqa2SOTvGh4 for ; Fri, 07 Sep 2012 17:09:56 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AjQKAMuLSlB5LOmP/2dsb2JhbABFhR61KAOBB4EIgiABAQU6HCMQCAMYLhQlAyETiA+7NRSKfnGFQwOVXJAdgnY Received: from ppp121-44-233-143.lns20.syd7.internode.on.net (HELO dastard) ([121.44.233.143]) by ipmail06.adl6.internode.on.net with ESMTP; 08 Sep 2012 09:39:55 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TA8cU-0006fs-4s; Sat, 08 Sep 2012 10:09:54 +1000 Date: Sat, 8 Sep 2012 10:09:54 +1000 From: Dave Chinner To: Eric Sandeen Cc: Eric Sandeen , ext4 development , Eryu Guan , xfs-oss , Zach Brown Subject: Re: [PATCH V3] xfstests: make 275 pass Message-ID: <20120908000954.GW15292@dastard> X-ASG-Orig-Subj: Re: [PATCH V3] xfstests: make 275 pass References: <4F04A6E6.1090304@redhat.com> <4F04BC81.1000207@redhat.com> <20120104231725.GB24466@dastard> <4F207079.6050401@sandeen.net> <504A5176.5020302@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <504A5176.5020302@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1347062996 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107911 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Sep 07, 2012 at 02:56:38PM -0500, Eric Sandeen wrote: > On 1/25/12 3:13 PM, Eric Sandeen wrote: > > Ok, this is a significant rework of 275, which made too many > > assumptions about details of space usage and failed on several > > filesystems (it passed on xfs, but only by accident). > > > > This new version tries to leave about 256k free, then tries > > a single 1M IO, and fails only if 0 bytes are written. > > > > It also sends a lot more to $seq.full for debugging on failure > > and fixes a few other stylistic things. > > > > Signed-off-by: Eric Sandeen > > --- > > Poor Zach ran into this one again. Can I get a review of this > version, and I'll merge it if it looks good? Looks OK. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From xfs-owner@oss.sgi.com Sat Sep 8 11:41:53 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.5 required=5.0 tests=BAYES_50,URIBL_DBL_SPAM autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q88Gfqhj162604 for ; Sat, 8 Sep 2012 11:41:52 -0500 X-ASG-Debug-ID: 1347122572-04cbb02aa5fb8a0001-w1Z2WR Received: from server1.yotiseando.com (digitalserver.alestiva.net [173.236.58.198]) by cuda.sgi.com with ESMTP id wRuSVbqsEG7H6gBd (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 08 Sep 2012 09:42:52 -0700 (PDT) X-Barracuda-Envelope-From: noresponder@yotiseando.com X-Barracuda-Apparent-Source-IP: 173.236.58.198 Received: from yotiseando.com (localhost.localdomain [127.0.0.1]) by server1.yotiseando.com (8.13.8/8.13.8) with ESMTP id q88GgquI015925 for ; Sat, 8 Sep 2012 20:42:52 +0400 Date: Sat, 8 Sep 2012 12:42:52 -0400 To: linux-xfs@oss.sgi.com From: Claudia Rodriguez Subject: Evento de Hacking y Seguridad Informatica Message-ID: X-ASG-Orig-Subj: Evento de Hacking y Seguridad Informatica X-Priority: 3 X-Mailer: PHPMailer [version 1.73] MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset="iso-8859-1" X-Barracuda-Connect: digitalserver.alestiva.net[173.236.58.198] X-Barracuda-Start-Time: 1347122572 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.107977 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- ---------------------------------------------- AUDIHACK www.audihack.com Evento Internacional de Hacking Etico y Seguridad Informatica Consultas a: ------------------------ E-mails: info@audihack.com, capacitacion@cosimti.com Telefonos: (3)3201395 - (3)3507385 ---------------------------------------------- Organizado por la empresa Cosim TI Santa Cruz - Bolivia ---------------------------------------------- TEMATICA ---------------------------------------------- - Exploiting Web Services - Hacking and Cheating Online Games - Herramientas Post-Hacking - Atacando Dispositivos Android con Metasploit - Auditoria Técnica OSSTMM (Data Networks Security Testing) - Seguridad en Redes NGN (Next Generation Networks) - OSSTMM vs ISO 27001 - Advanced Antiforensics Techniques and Prevention Countermeasures - OSSTMM 101 - Mini-auditoria OSSTMM (Práctico) - Desarrollo seguro - Test de Penetración y Análisis de Vulnerabilidades OWASP para PCI Compliance ---------------------------------------------- LUGAR Y FECHA DEL EVENTO ---------------------------------------------- Fecha: 25 Y 26 de Octubre 2012 Lugar: UTEPSA (Universidad Tecnologica Privada de Santa Cruz) (Santa Cruz / Bolivia) Horario: 8.30 am - 18.00 pm ---------------------------------------------- INSCRIPCIONES ---------------------------------------------- Oficinas de Cosim TI Av. Roca y Coronado calle siriono nro. 250 (frente fexpocruz) Email: info@audihack.com, capacitacion@cosimti.com, black_fire_dark@hotmail.com Telefonos: (3)3201395 - (3)3507385 ---------------------------------------------- INVERSION ---------------------------------------------- Estudiantes: 350 Bs. Profesionales: 450 Bs. ---------------------------------------------- MAS DETALLES ---------------------------------------------- www.audihack.com - www.cosimti.com Si desea remover su correo de nuestras listas, ingresar a http://www.yotiseando.com/admin/remover_correo.php?email=linux-xfs@oss.sgi.com From xfs-owner@oss.sgi.com Sat Sep 8 21:39:46 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.3 required=5.0 tests=BAYES_80,MIME_8BIT_HEADER autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q892dkse260485 for ; Sat, 8 Sep 2012 21:39:46 -0500 X-ASG-Debug-ID: 1347158446-04cb6c14a6111610001-w1Z2WR Received: from smtp2.bpm.it (smtp2.bpm.it [81.21.130.16]) by cuda.sgi.com with ESMTP id lFnybZC4KcYc086J for ; Sat, 08 Sep 2012 19:40:47 -0700 (PDT) X-Barracuda-Envelope-From: prvs=5922f8c24=gavl@ocmf.com X-Barracuda-Apparent-Source-IP: 81.21.130.16 Received: from unknown (HELO wbsmtp02.webank.it) ([10.13.100.194]) by smtp2.bpm.it with ESMTP; 09 Sep 2012 04:40:45 +0200 Received: from rlgonpr (unknown [10.13.202.217]) by wbsmtp02.webank.it (Postfix) with ESMTP id 3917724174 for ; Sun, 9 Sep 2012 04:40:45 +0200 (CEST) From: "Lhwf" Subject: =?gb2312?B?tqm1pTgzSw==?= To: linux-xfs@oss.sgi.com X-ASG-Orig-Subj: =?gb2312?B?tqm1pTgzSw==?= Content-Type: text/plain; charset="gb2312" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Date: Sun, 9 Sep 2012 10:41:36 +0800 X-Priority: 1 Message-Id: <20120909024045.3917724174@wbsmtp02.webank.it> X-Barracuda-Connect: smtp2.bpm.it[81.21.130.16] X-Barracuda-Start-Time: 1347158447 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108017 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- NjUNCg0KxPq6wzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIC4uLi4uLi4uLi4uLi4uLi4uIC5uDQoNCs/W09AgyKu4w9X9uea3onnG sXK/ybT6v6qhoyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uLi4uLi4uLi4uLi4uLi4g IC4waQ0KDQrK1SAwLjUtLTEuNaOly7AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1IDQoNCrXnaLuwICCi saKzoriisqK0orOisqK5orKisaKxIMH1KL6twO0pICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiAgLjMNCg0KUSBRICAyorWjsKKyorKjsKK2OKK2 OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1EDQoNCg0KDQogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgDQoNCg0KLg0KLg0KLg0KLg0KLg0KLg0KDQoNCg0KICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4gLjgzLjIyOC4xMTAuMQ0KDQouNTcuMjQ4LjIz OC4yNDENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW51eC14ZnMuJQ0KbGludXgteGZz QG9zcy5zZ2kuY29tDQoNCg0KDQoNCqjMqM2ozqjPqNCo0ajSqNOo1KjVqNao16jYqNmo2qjbqNyk uKS5pLqku6S8pL2kvjg4LjIxNC4yMTAuMTQ5DQo= From b.candler@pobox.com Sun Sep 9 04:46:58 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_DKIM_INVALID autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q899kwn6091340 for ; Sun, 9 Sep 2012 04:46:58 -0500 X-ASG-Debug-ID: 1347184075-04bdf01ad3139890001-NocioJ Received: from smtp.pobox.com (b-pb-sasl-quonix.pobox.com [208.72.237.35]) by cuda.sgi.com with ESMTP id tj9IanInGCUYvTW6 for ; Sun, 09 Sep 2012 02:47:58 -0700 (PDT) X-Barracuda-Envelope-From: b.candler@pobox.com X-Barracuda-Apparent-Source-IP: 208.72.237.35 Received: from smtp.pobox.com (unknown [127.0.0.1]) by b-sasl-quonix.pobox.com (Postfix) with ESMTP id 4820D77E9; Sun, 9 Sep 2012 05:47:55 -0400 (EDT) DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=pobox.com; h=date:from:to :cc:subject:message-id:references:mime-version:content-type :in-reply-to; s=sasl; bh=J9SPdQj8yWkB5hlrsEea+jgBTyk=; b=ZbnhS7V HIq43xaGUiRTyaScCEFf9Qd+e5BKCJmNdI+mWbVWbQ+yiYbI+xxGv1x02awbfpQ/ n8idjJi6UU9PiO3Fe9381IoE+wP8e8mflcW6+RdafCYq92NUXsLvjJbJfpp6UW7n cfaQT/vB3zyjBlCCFlNtHfmnl4VhBiQH0x4Q= DomainKey-Signature: a=rsa-sha1; c=nofws; d=pobox.com; h=date:from:to:cc :subject:message-id:references:mime-version:content-type :in-reply-to; q=dns; s=sasl; b=E20KcEdfZUU5Yega+BTf+k9i5WMojMGUp HnWJ1XGPYOfKCGJ5n9GwF3FSp2V86L68w7mzD5mN6zd8CwzMcHGTUlkd0KdrumD+ nv/JMdHcgJI14hPuJStHIe9RLANdVl+r2m50qMgEuTLa53xH59VWCf2rSUTBRvOV zjeynNL6VU= Received: from b-pb-sasl-quonix.pobox.com (unknown [127.0.0.1]) by b-sasl-quonix.pobox.com (Postfix) with ESMTP id 34A5677E8; Sun, 9 Sep 2012 05:47:55 -0400 (EDT) Received: from Brians-MacBook-Air.local (unknown [91.125.97.140]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by b-sasl-quonix.pobox.com (Postfix) with ESMTPSA id 30A4F77E7; Sun, 9 Sep 2012 05:47:54 -0400 (EDT) Received: from brian by Brians-MacBook-Air.local with local (Exim 4.77) (envelope-from ) id MA2TVW-000AJ6-7V; Sun, 09 Sep 2012 10:47:56 +0100 Date: Sun, 9 Sep 2012 10:47:56 +0100 From: Brian Candler To: Dave Chinner Cc: Stan Hoeppner , xfs@oss.sgi.com Subject: Re: Storage server, hung tasks and tracebacks Message-ID: <20120909094756.GB13530@nsrc.org> X-ASG-Orig-Subj: Re: Storage server, hung tasks and tracebacks References: <20120502184450.GA2557@nsrc.org> <4FA27EF8.6040002@hardwarefreak.com> <20120503204157.GC4387@nsrc.org> <4FA3047D.8060908@hardwarefreak.com> <20120504163237.GA6128@nsrc.org> <4FA4C321.2070105@hardwarefreak.com> <20120515140237.GA3630@nsrc.org> <20120520235903.GB25351@dastard> <20120521095830.GC8283@nsrc.org> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="24zk1gE8NUlDmwG9" Content-Disposition: inline In-Reply-To: <20120521095830.GC8283@nsrc.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Pobox-Relay-ID: 6D682514-FA63-11E1-B8D8-BAB72E706CDE-28021239!b-pb-sasl-quonix.pobox.com X-Barracuda-Connect: b-pb-sasl-quonix.pobox.com[208.72.237.35] X-Barracuda-Start-Time: 1347184077 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108045 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature --24zk1gE8NUlDmwG9 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Mon, May 21, 2012 at 10:58:30AM +0100, Brian Candler wrote: > On Mon, May 21, 2012 at 09:59:03AM +1000, Dave Chinner wrote: > > You need to provide the output of sysrq-W at this point ('echo w > > > /proc/sysrq-trigger') so we can see where these are hung. the entire > > dmesg would also be useful.... > > Thank you for this advice Dave. > > Attached is the full dmesg output after another hang. The sysrq output is > near the end, at timestamp 250695. It has recently been pointed out to me that the original attachment was incomplete and didn't include the sysrq output. Attached is the dmesg file *with* the sysrq data at the given timestamp. Unfortunately, I have been trying to reproduce this problem on an identical box and over 5 days the problem didn't reoccur. (Aside: that was until one of the RAID0 drives failed, which is turning out to be a common occurrence with Seagates; but that's not the failure I was seeing before, which I used to be able to replicate in less than an hour. In this case XFS shut down gracefully in the face of I/O errors) This isn't one of the three actual boxes which had locked up before, but it's another box with identical chassis and motherboard bought from same supplier. This however has an up-to-date Ubuntu 12.04 kernel on it, so it's possible there has been some driver fix since my original tests. I will continue to investigate. Regards, Brian. --24zk1gE8NUlDmwG9 Content-Type: application/x-gunzip Content-Disposition: attachment; filename="storage3-sysreq.txt.gz" Content-Transfer-Encoding: base64 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 X56uf/T35y/+A77jqFxcbwIA --24zk1gE8NUlDmwG9-- From 3HatNUBEGAzITcQig_WbbcjOhWcbree.QcalTgcgg.gUW.Qca@photos-server.bounces.google.com Mon Sep 10 03:54:58 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.3 required=5.0 tests=BAYES_95,FREEMAIL_FROM, MIME_8BIT_HEADER,T_TO_NO_BRKTS_FREEMAIL autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8A8sv3S091743 for ; Mon, 10 Sep 2012 03:54:57 -0500 X-ASG-Debug-ID: 1347267357-04bdf0067e2f4b0001-NocioJ Received: from mail-iy0-f201.google.com (mail-iy0-f201.google.com [209.85.210.201]) by cuda.sgi.com with ESMTP id mXZRJIJr7Tr8zq96 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 10 Sep 2012 01:55:57 -0700 (PDT) X-Barracuda-Envelope-From: 3HatNUBEGAzITcQig_WbbcjOhWcbree.QcalTgcgg.gUW.Qca@photos-server.bounces.google.com X-Barracuda-Apparent-Source-IP: 209.85.210.201 X-Barracuda-IPDD: Level1 [photos-server.bounces.google.com/209.85.210.201] Received: by iadx2 with SMTP id x2so390545iad.2 for ; Mon, 10 Sep 2012 01:55:57 -0700 (PDT) X-Barracuda-IPDD: Level1 [photos-server.bounces.google.com/209.85.210.201] X-Barracuda-IPDD: Level1 [photos-server.bounces.google.com/209.85.210.201] MIME-Version: 1.0 Received: by 10.42.78.194 with SMTP id o2mt10805747ick.12.1347267357266; Mon, 10 Sep 2012 01:55:57 -0700 (PDT) Reply-To: Hat Supply Message-ID: <20cf3010eb233f545704c95520fa@google.com> Date: Mon, 10 Sep 2012 08:55:57 +0000 Subject: =?GB2312?B?SGF0IFN1cHBsedPrxPq5ss/twcvV1cas?= From: Hat Supply X-ASG-Orig-Subj: =?GB2312?B?SGF0IFN1cHBsedPrxPq5ss/twcvV1cas?= To: xfs@oss.sgi.com Content-Type: multipart/mixed; boundary=20cf3010eb233fa2df04c9552021 X-Barracuda-Connect: mail-iy0-f201.google.com[209.85.210.201] X-Barracuda-Start-Time: 1347267357 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108137 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --20cf3010eb233fa2df04c9552021 Content-Type: text/plain; charset=GB2312; format=flowed; delsp=yes Content-Transfer-Encoding: base64 RGVhciBNYW5hZ2VyLA0KV2UgaGF2ZSBhIGhhdCBmYWN0b3J5IGluIENoaW5hLg0KRG8geW91IG5l ZWQgdXMgdG8gaGVscCB5b3UgdG8gZ2FpbiBtb3JlIGFuZCBtb3JlIG1hcmtldCBvbiB5b3VyIGNv dW50cnk/DQpPaywgaWYgc28sIHBscyBsZXQgdXMga25vdywgd2Ugd2lsbCBiZSBoYXBweSB0byBo ZWxwIHlvdSB0byBwcm92aWRlIG91ciAgDQpuZXdlc3Qgc3R5bGVzIHNlbGxpbmcgd2VsbCBvbiBt YXJrZXQhDQpPdXIgY29udGFjdCBpbmZvcm1hdGlvbjoNCkZvY3VzIElubm92YXRpb24gR2lmdHMg Q29tcGFueQ0KQmVzdCBSZWdhcmRzLA0KDQpIZWxlbg0KV2FybWx5IFRpcHOjuiBPdXIgTU9RIGlz IDUwMHBjcywgaWYgeW91IGFyZSBsb29raW5nIGZvciBhIG1hbnVmYWN0dXJlciB0byAgDQpwcm92 aWRlIGN1c3RvbWVyIGRlc2lnbnMgaGF0cyBhbmQgdGhlIHF1YW50aXR5IGNhbiByZWFjaCBvdXIg TU9RLCB3aHkgbm90ICANCmNvbnRhY3Qgd2l0IHVzPw0K --20cf3010eb233fa2df04c9552021 Content-Type: image/jpeg; name="F3275.jpg" Content-Disposition: attachment; filename="F3275.jpg" Content-Transfer-Encoding: base64 /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsK CwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQU FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAEEAWIDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD7y/ZG bf8As9eFD6/a/wD0rmr2GvGv2Pjn9nTwkfe8/wDSyevZaACiiigAooooAKKKKACiiigAooooAKKK KACiiigArD8VeM9J8HWRudTuli4+SIcu/wBBXLfFP4u2fgSNbC123etzrlIAciMf3m9P6183a/q9 94gu5LzUrlp5n5LOeFHoBWNSpyLzNYQ5tXsd74y/aC1PWWkh0tf7OtOm5TmRh7nt+FeYXviG7vHa SRmlc9XdixP4msi71NPMMVsnnOOp/hH1qqYJbj/XSFh/cXgVx+1m+pvyxWyLs+pmbgzkH+7HzXPa 3qGrW/y2VnHPGSMF3wxP5VuxwpCBtXFVr+UCMtkfL835VLlfdjOb0i+1aaSQ6jb/AGU9FVHzWqbi 5TDKSwHfORT57geewqBnHUHafUVSm1sRY6Xw38Q9W8M3CSWN7PZsD/A2UP1U8V9BfDv9pG31Ly7T xEiW8hwq3sHMZ/3l6j9a+VZJSBll8weo61FvDIWhf8M4rpjX6SM3E/R+2uob2BJ4JUmhcblkjbKs PY1LXwn8LPjzq3wx1FILhpL3RXb97bMclP8AaX39q+1fCvirTfGeiW+q6VcLc2kwyGU8qe4I7EV0 Jp6oyasa9FFFMQUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAHjP7Hn/JufhL63n/AKWT 17NXjP7Hn/JufhL63n/pZPXs1ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABXn3xi+Kdv8NtBLRlZ dVuAVt4Seh/vH2Fdh4g1208M6Nd6nfSCK1tozI57nHYe56CvhvxX4qvfiX4wuNSvGIRm+SMHiOMd FFJuyuyoq7LFreXF5PdavqUzXF9dNveSQ8nP+f5VlXt9Lq0jJG5WAHDMO/sKXWLreyWkJ256kdh3 ohRIIlRBgDpXkzm5u7OvZWCGBIECIoAA6DtUoXAphlWCNpG5x2Heq9pqLXMStJCYHKglC2dp9M1B Jacgis+/jLQSY7qat+arA96rXLgxMPY1SJuZcikyB/UUzac1KrfJEf8AZH8qQkEmrRDZCxI6c1Vl BDb0+Vx+tT3t6tmikxPIzMFATHc4zUW8TxK4BXd2NFguUbh1ulJxiReorufgt8Zbr4S+IV3yPNo1 0wW7teoA/vqPUVwl3FsbzVzkdQO4rOveQGHWumlKzsxPU/UDR9XtNe0y21CxmWe1uEEkciHIINXa +Pv2R/jC2l6n/wAIdqs+bS5ObF3P+rk/uZ9D296+wa7DNhRRRQIKKKKACiiigAooooAKKKKACiii gAooooAKKKKAPGf2PP8Ak3Pwl9bz/wBLJ69mrxn9jz/k3Pwl9bz/ANLJ69moAKKKKACiiigAoooo AKKKKACiiigAooqhrurw6Do17qM5AitoWlbPsOlAHzj+1d8QzJc23hW0k+RMT3e09T/Cp/n+ArxT RQLSwaduC3Ofas/xFrM/i3xLeajOxeW7mLknsCeP0qfW7kW2nCKLuNormrysuXudNJdSOyn+0ySX BBBc4XP90f8A181e3nFZds3kQqmfugCpfP8AfivPNGX2kV1w3IqIuiZCjAqo1x71GZgaEjNlpptt RSzb1OKwPFfiq28LaNPfXGWCDCxjqzHoK83+GHxln8beIbmxuAqR8+WVGOeuB+ANbRpylFyWxm5J Ox6wJsRQ8fwD+VL53btXnnxN+IjeBdItpo0SWZx8qv6Ac1b+HPxFtPH2k/aIsR3MYHmxDoM5wR7H B/I1XI+XmtoTfWx20jqeGGfrTGdQmFGKrO+Oc1G0+OM81IEkxDLjNYk42sUPTsfatB5c5rNvSTIp 6Z4prQZVtb6bTb6Ke3do54XDo6nBUg8Gv0f+C/xEj+Jvw/07V8j7Zt8m7Qfwyrw359R7EV+caQLI d7H8K+if2O/G50Txfd+HZn22uop5kQJ4Eq/1Ix+VeindXIZ9m0UUUxBRRRQAUUUUAFFFFABRRRQA UUUUAFFFFABRRRQB4z+x5/ybn4S+t5/6WT17NXjP7Hn/ACbn4S+t5/6WT17NQAUUUUAFFFFABRRR QAUUUUAFFFFABXjf7U3ig6H8OfsMb7ZtTmEWAedi/M367fzr2Svkn9r/AF43fi/StKVspaWvmkZ6 M7EH9EH50AeH6ef35f8Auil1e48yaBB2IP5VPoaKyyFiD0FZl1J5mqn0UZrgrO8rHXDSJdD8AUpk AqLNG7jNc42P8w1U1O8kstPuZ4k8ySOMsqepAqfp2psigqQeQaasZs+StW+Jl/rnia5s9Wkd4ZDg xbiAMjsOgx+fGO9YnhfU38F+N0e2YvD5okjIPXB5X8Rx+NO+KWkRJ45eGNjCA8gLoMnILN/7N+lc /dX3kQqLhDDqEDq8b44kGcZ/rXuxjFxSXU4m31O/+Nfi5vGGr21lYN5luyJHGw746n88j8Ko6f4k u/hLc2ttZzsjTeWsiYBH94A5H+3nj1PoKT4bWLeMvGcM7QrDCgCiJTkAAAv/AENZXie3fxB8S4IG O5WnZSR2/esAf1H5VPKl+7fQd+p9YeG9fXxDoVpqAQp56bip7GrsjjqKoaXp66XpltaxAKkSBQB+ tTsxryHa+huhXk61UumyoPoanYVWnPyH6UFIdb4JIPWui8Ga0/hrxRpmqQtsktZ1fd7Z5/TNcxDJ g8GrUMrMMY/E13U/hM3ufqLpt9Hqen2t5EcxXESyr9GAI/nVmvOv2fdePiH4S6FM775oYzbyH3Un H6Yr0WtBBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB4z+x5/ybn4S+t5/wClk9ezV4z+x5/y bn4S+t5/6WT17NQAUUUUAFFFFABRRRQAUUUUAFFFFABXwj+0RqX9o/FvXWyGWJkiX2AjXP6k193V +d3xbujcfEbxG2ck3sgJ+hx/SmtQMWydvsJeM/OGzj1qiJx/aLK3DbefzqbT5tkZVjjOSBTLi28y +Zhzxnj6151ZWmzrj8KLiEGngVVj3xnFWUk3VhcbHFT+FQX06WdrLPIdqIpYn0xVnPA5rA8cabca v4Z1C1tpCk7x/KR3I5xVR1aTMpbHyjr91/wkfxJiMfzZlwT/ALxOP/QlFeofGn4eac+kW+oKohnW Mg7Rj5ghOf0rivhP4Qurz4jMbuMhoHMj5HG0HJ/EME/WvS/2gtVFp4djtlwS6uzeoBUqP/HiK9Wc rVIRizlS91tnhPw88X3Hg/U1m2bYnkYo7D5XzwRn8KuWt4svxEsLzBSOZzIFPvMTj8uat/Dfwda+ OLOeylcpMN4iGTtLAluR9CKwPEOgax4R1u3trtZMQMyxEjOQewP+etdT5ZVGupC0SPshAJYlYHgg EU14utZngt7pvCumm9BW6MK7wf0/TFa0jcGvCas2jpRVlAUHJqlKw5FW5lL84qu8BIpodyis4jUE 8Zq1bzg5waxNaLwRxFR/F1qzYytcRpIvGeo9K7qa90zb1Pun9jLVDdfDzU7MtuNtfFx7B0H/AMSa +ga+Wf2GbotY+Lbcn7r2zgH3Euf5CvqatACiiigAooooAKKKKACiiigAooooAKKKKACiiigDxn9j z/k3Pwl9bz/0snr2avGf2PP+Tc/CX1vP/SyevZqACiiigAooooAKKKKACiiigAooooAK/OP4n5Hx F8SBhgi/m/8AQzX6OV+efxxsjp3xX8RxYxm43/8AfShv6iqjuIxNCsXmRJoAjSRE5Vx94EHirEFx bvO63cEljKTjMi/L+B6VD4KuT9veDPDLn8q7t7KKeMiRA4PZhXn4l2mdMHocpJo+9N8biRexU5qm 9k0J+6RXUSeFbdpC9vJJasf+ebcflUE2h6jGMRzxXI9JV2muVFtnNYxTGII6Vqz6ffoxEumlv9qJ waqSQsv39Pu1+kZNMzbMiPSrWC4knit445ZPvuqgFvqa5jx58KbT4gxxia8ktXRdpKLkMuQcfmBX bv5K/et7xeP+eDf4VTn1mysMsyXK+7REVpGbi7ohpPQ4PwT8HNM8ASpdQXctxKylgGAAUkAE+/AF dPe6HZai8cl1aQ3DxnKtIgJFTwatb3+0rFcthRwsR4q2km77theH6x4/nVSnKT5mRZLQreVhQBwB xgUvkgjJzVsJdsfk0t/+ByKP60jafqUx+5b2y+oJY1CGZ7x7FyenqazprwyEpaxG6k6fL90fU10J 8PK+DczPcEdQeF/KrAs47dQsaBR6AVVxnnut2d5BZGW7WNsMCoQnC0zQZgyyKRjnPFdR4vt/M0ab HbB49jXLeH4jsdyMZOBXo0dYGMtz7D/Yay3/AAl7Y4H2Uf8Ao2vq2vmj9iLT/I8N+JbvHE1zCmf9 1W/+Kr6XqmUtgooopDCiiigAooooAKKKKACiiigAooooAKKKKAPGf2PP+Tc/CX1vP/SyevZq8Z/Y 8/5Nz8JfW8/9LJ69moAKKKKACiiigAooooAKKKKACiiigAr4p/aq8Pm1+Jt1Oq7TeW8dwG9SAU/9 kr7Wr5z/AGvPDjTWWia1EhJjZ7aVh74ZP5NTTsJny54MTHiSHJxhWBB+lem54xXn+gwKniC3lI2v hgff5TXoMY3AHHNefidZm9PYkT3GOaC2MdaUqc/keKcYic46jkVyFshcFj0pjpjqKt+UWIP50jwb u1FiGzLkTk8VXktww5AI9xWu9txjGage3OMYyapEsxntVBJAA/CoTFjNbMlrweKrNbE0yTJZME1A 6cZrSkhwTmqssQFMZnTAc84NQOd2TircsZB57mqzpx+dWkBj69b+fpVygHJQ4+tcxp1r5UKqvPrX Y6gv+hS/7prC0y1eeSOJAC8jBVHuelehQ+FmE3qj7h/ZK0Q6R8JYpmGGvbuS4BPcYVR/6Ca9prnP hzoI8M+BdD0wLtMFqm4ejEbm/UmujrRlrYKKKKQwooooAKKKKACiiigAooooAKKKKACiiigDxn9j z/k3Pwl9bz/0snr2avGf2PP+Tc/CX1vP/SyevZqACiiigAooooAKKKKACiiigAooooAK4z4v+GT4 s+H2rWaLmdI/Pi9mXn+WR+NdnSEBgQRkHgigD84NPRrbWoC5IcPtIPYnivQ4EyFPaovjp4IbwN4/ neNCtnPILqD0xnJH4H+dT2i+ZbqRzx1rjxC1TLpvSxMibuO/SpViyfl+8o6UiJg5P3T39DUxGMcF v9petcZdytIADkhkbvgUoUMv32+uKlbB/jYfUU4AgcOT+FIi5D5eRwXP0FMa3B/vVaJ46t+VM+8c nfTJZTkgAx8rE1VltxgExkfjWm6BxwG+uaqzRccpn6mmIy5bfnhBj3NVJoTyMItaskO7+Bc/Wqrx 4J4QGmBjyW+Tx87e3QVRmt+G49q25VABXcPooqrLHuI42gcBa0QXOc1GPbZS+mDXQ/s/eDW8YfEb SbZo99tA32mb02r/APXxWZ4hhEOnyADnbgV9Mfsi/D9tC8KT+ILqPbc6idsO4ciJeAfxOfwxXdR0 izOWskfQAGBgdKWiitDQKKKKACiiigAooooAKKKKACiiigAooooAKKKKAPGf2PP+Tc/CX1vP/Sye vZq8Z/Y8/wCTc/CX1vP/AEsnr2agAooooAKKw/EfjbQfCMJk1jVrWwGMhZZAHP0XqfwFeT+IP2vv BumMyafDfasw6PFEEQ/99kH9KAPdKK+Vr79tefcRaeF029mmu8H8gp/nWf8A8Ns6sjZbw3asPQXR H/stA7H1zRXyzpv7cdqzAah4YliXuba4En/oQWvRPC/7V3gDxI6Ry382kTNwEv4So/76XKj8TQI9 ioqppmrWWtWq3On3kF9bt0lt5BIp/EGrdABRRRQB5n8efhyPHvg+V7eMNqdiDNBgcuMfMn4j9cV8 xeFr3zbTyZBtlhPlurdcivumvlT9oj4aXfgjV38YaDbGawnP+mWicbW9R9azqQ542QJ2dzAMeeV/ FfWkVQucK6H26Vynhz4maJ4gJjhvUiul4e2mOyRD6FTz/Suthu0kAKupHbnrXlvTRmoDv87flSkj by7fgKl8xTxuH50F0J+8o/GggrnJP3npMez1YaWMD/WL+dRPdW6Ll50X6mgRCVwMBWx/vVWmUnPy H/vqor3xFpdqSJdQgi/3pAP51j3XxB8M2oPma5YIR2a5T/GmI1HiOT+7X8TVd4j/AHEx9K56f4r+ Eoj82vWP4XCH+tV3+LvhAKT/AG5aEe0gNUrhY6F436ZVR7Cq/lKjEk7j6muF1T9oLwTYE7tYRj6L G5/XGK5iL46y+ONUh0jwXpNxqV7PIIlndcRqTwD3z9K2jCTeiE9NWez+FPCMvxI8b2Hh+3z5ZYS3 Uq8+VEDya+6tO0+DSrC3srWMQ21vGsUca9FUDAH5V5b+zp8Gj8KfCQk1KUXniTUAJb65PY/3F9hX rddsVyqwkuoUUUVRQUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAeM/sef8m5+Evref+lk9ezV 4z+x5/ybn4S+t5/6WT123xM+Jem/DPQHv70iW4bK29qpw0rensPegDV8W+MtJ8E6VJqGr3aWsC9A x+Zz6AdzXyx8Sf2qta115bTw6p0ixOR9oP8ArnHr/s15f4+8f6v8Q9ak1DVbgyEk+XCpxHEv91R2 ql4e8ONqMgmnBFuvb+9/9as5TUVdmkY3IRYan4lma6uppZ2c5M07E5P40+TwrtH+sJ+grspdkaBE AAUYAHaqrrgf4158sRNvQ6HCKOObw/GOG3k/WmSaHbRoWZTgep610mpXkmnQb4rU3JPYVk6XDe6p NJcX0Qt4+iRDk4qfazfUlpdDl7iwa5lKwR7Yx3xVK50q6h/5Zlh6gV6Q8MUa4jjAA68U1vLdThM4 rWFWUd9TJ2OK8LeNPEXgm+W60bU7mxlBGVjchW9iO4r6p+E37XkGpvBp3jGJLK4bCjUIhiMn/bH8 P16V88XtlHKrbolU+oFc/JarbSEHpXXCop6GbR+nlrdw31vHPbypNDIAyyIchge4NTV8M/BH4+33 w3v4tNvpHvPD8jYeJjkwZ7p6e4r7b0nVbTXNOt7+xmW4tLhA8ciHIINbCLdVtR0+31WymtLqJZre VSjo4yCDVmigD4V/aK/Zeg0e8kv7aBzp0pJiu4eHhP8AdYj9K+Y9V8I/EDw2znQ/EE8kIPyxyOQa /X6+sLfU7SW1uoUuLeVdrxyDIYfSvmv4qfs3zWTy6j4dQ3VpyzWZOXj/AN31HtV+7LSSMWpQ1gz8 59W8ffF/RlxJLcMF/iUk1yOo/Gr4pAsr3t7ER6Zr7F1LQPLmeGaExupwUdcEfhWNc+FbSYHfbRtn 1UU/YUnsR7ea3R8YX3xZ+Id5kT6retnjDE1i3Pi3xjfHEl/etn/aavtKbwHprNk2MRJ/2RTf+Ffa WmT9ih/75q/q8SfrL7Hw1MPEF1ITJLeSMfVmpYvDuvXRwIbp8+ua+4R4E00Hd9ii/wC+at23hWzi b5bSJfooqlRXcX1l9j4osfhl4lv2AS1m5/vE11+j/s9eI74qZ5DAh67mNfWsekJEcIgX6Cuq8GfD vVvF9+ltpdm9xITgtj5F9ye1UqcFuS69R7I+b/B37M1n9phS6M2oTuwCxDJDH0xX6L/sy/syad8M bOHWdQsYo9VZf3EG0Yt1I6/7x/Suw+EfwD0z4fLHf3wTUNbI/wBaw+SH2Qevv1r1mspzW0TaEJP3 psKKKKxOgKKKKACiiigAoprusalnYKo6ljgCsTUfG2i6Xnzr+Mt/djO4/pQBu0V51f8Axu0a1YCK C4nycZwFrOf4/WKMR/ZUxHr5o/wp2Y7M9WoryqH9ojQPOSO4tbqAt3UB8fyrqtG+KHhrXGVLfU4k kP8Ayzm+Q0WYjq6KbHIkqB0ZXU9GU5Bp1IAooooAKKKKAPDv2UtVttD/AGX/AA5qF5IIra2S9lkc 9gLuevmn4q/EW8+Ivii41GditsrFLaHPCJnj8TXQ2njhtJ/ZO8CeHrd9suoyXsk2D/yyS8m4P1Yj /vmvPtN0d77944IiH61MpKKuy4xcnZEWh6a+rXwQ5ES8u3tXc3V5BptuELKiKMBRVCBBplsI7aLM z9hSwaOhl86+lEkvXZnha8urUdR+R1qPIrEcd/cXzYt4Sq/3m71oW9gV+a4fc3XaKmjkyRHboB7+ lP8ALCsI9249WasCGVrqMDHyjHp6VX61d1CRYYgP4jVCHc5B6CtEjBsZLDwSKpOAHBHGOtaky5Hu azbiEg5700TchvpFaLAPNc3ex+cWAGcDPFbFw45rEvbhLdyXPy9x61afUZnjKkr719E/sqfF2TQ9 XXwnqc+dPvGJtGc/6qXuv0b+Y96+c2uUnb5OKvWEslndW9zC5jmhYSI46gg5Br0acuZEtWP0/orl fhf4rXxr4F0nVQcySxBZR6OODXVVoIKKKKAOO8ZfCfw743RmvbMQ3RHFzb4V/wAex/GvDvFf7Ler 2ReTRruHUYeojk/dyfTuD+Yr6ioqlJohwT3Pg3VvhV4p0Zytzol6oB6pEZB+a5rGm8PajF8r2Fyp 9DEw/pX6FMARzgj3rB1fxJ4d0Yt9vu7KFx1Ryu78utWpsydJHwra+EtXuWxDpd5MT0CW7H+QrrdC +BHjDXnUx6O9tGf+Wt0wjA+o6/pX1A/xg8GWjYF8in1SBj/IVbsvi94RvnCprVvGT/z2Pl/zxT9o w9iup5f4P/ZRsrV47jxDqBunHJtbQbU/FjyfyFe36F4c0zwzZLa6ZZRWcCjG2NcZ+p6n8atWd/ba hCs1tPHcRN0eNgwP4irFZuTe5tGKjsFFFFSUFFFFABRRRQAV5t8Rvjho3gcSWtuRqeqjjyIm+WM/ 7bdvoMmuJ+OPx1/syafw/oM3+kLlLm6Q/cPdVPr6183z3zTOzu5d2OSzHJJoKSO18Y/F/wAR+MJH F1evb2xPFvbMUUflyfxrkYtevrX/AFN3KuOxbP8AOs958nrTIVe6mWKMbnY44ovYs2k8YasXCiTz Tngba0I9V1udSzrHGD/eFLZWkGjw84knbqar3VxLcsfm2j0Fcc8S72iacqjuLLe3iyBppoRjqQKz dS8X21hMITcDzOOsZNSSWm7nmqlzawrbs7IGYHgkVm61R9Re6dj4b+MHirwkyyWN0Li3B5glJKMP oen4V7/8Mf2jtE8bzR6dqYGi6w3Ajmb91Kf9lvX2P618rlCtqpXjjpWddWfnANnEi8hl4I961hWf 2iGl0P0Zor5b+A37Qc9je2/hfxVcb4nIjs9QkPT0Rz/WvqMHIyK6k76mbVhaKKKYj8x/Dt3Jq/hj wtYgkra20sWPTN1O5/8AQ672KFLe3woAVB0FcF8LYCdPtmYceW5X/v4w/oa7y9bZaPjvxXm4iTcu U7qKtG5WN+68IMM3UjrSrKVkCsrMzcliePYVCrKiDj5qfD5lxcKAOAe1cppJG7aqLeHcSMmmiZY1 Z+rHvVW9nFtCFJ+as+TUBIQoOMUJHPMtyE3D5f1qRU28A4qjHMxJ5zUGoXt1awgwxiSVmUDdnCrn k8dTitDmNUqoySc1RlXc3FSWplMG+Ubc9jVW4vY0ztNNCMzUYymWHQda5DVke7u0hQ8HrXUT3pm3 qwwOlYBxb3bO/wAqjoTV7FJle/tYtIsN+cyGnwXBaGM9yozWfq2t6bdzpbtf27S54iEgzU8cnlYH AJ6D2rpoPoKWx9ofsbau934J1WwZsi0ugyg9t4P/AMTX0FXzH+xKrtp3ihyDt82AZ98PX05XWSgo oooGFc14u8dWHhO3YynzrnGVgQ8/j6VR+IPjpfDVp9ntSr38gwO4jHqa8M1a8mvY555pGlmfLM7H JJp2A2fFPxL1nxAxX7S1pasP9TAdoI9z1Nef6gx8tiTn61oE7oIm9VrNvTvikH1qgM64OVzWbOeD Vm/vYbOy8+eQRxKuSzV5nrXxOfznSyjVIhx5kgyT+HasalWNLc0jBz2PRNK8Tap4buhcaZfz2UnX MLlc/X1r2jwB+07++isvFMYAbCi+iXH/AH0P8K+StM+IlwZR9pWKZD2ZcV0T6raaqq/Z12S94y3X 3FYxxMJuz0LlSlFXP0Usb+31O0iurSZLi3lUMkkZyCKsV8YfBn4val8PNRWzvDJPoUjYkhc8wn+8 v9RX2Npuo22r2MF5aSrPbTKHSRTkEGukwLNFFFABXlvx9+JjeAvC5t7KTZq18DHCQeY17v8Ah298 V6lXw/8AHLxY/iz4g6hKH3W1s32eEZ42jv8AjQNHAS3Du5ZmLMTkk9zUZlNIylmphWgrmHGQkZHF UtM+IOm6brVxZbgZLdC91O5wsC+mfU1DrerDR7Bpdu+QkJFH/fc8KPzr5pZ7+6sbm+1CWR/7RuWC W0J+a6fPf0UUnDnVmJTcdT7LtdSTUoIrmNxJFModGHQgjINOe4ZJlQJuU9W9KwPDDGDw3pkbx/Z3 S2jUxf3DtHFagu8DGa8q1matmgz56VR1EfukQdyKUXYJHNV5L2N7gM5+ROapIzuT3MoiiEfcioPP DLnoelZ95cG9EhDmPPAYdRSWSGYgbiQvc96u2grlLWwjjJfy3TlWHY19d/stfF1/HXhhtF1OXfrG lqFDseZoeit7kYwfwr4s8QXjX+srYwchT87DtXdfBjxO3gT4i6RfRuVhMotpwD95GODn6HB/Cumk +g3sfobRTY3WVFdTlWAIPqKK6CD84/DWnHRPA/gfU2G2DUrS6Td2LpeTg/oVrfvzvsiR7V3fhj4f N43/AGLfDM9rHv1HTGvLmLaPmKfa594H4YP/AAGvnIfFdfDqmy1pHCZ2pMBx+NcVem2+aJ10ZpLl Z6Aod5Ao78Vfu9Qh8P2e9yDMRn6Vl2uu2yW0dwjCQuoKkVz2urc6xL5hc7T0FcNjWTsV9R8bNcSs cnGajtPFKu2Se9Qx+Gxt+dd2aRPC4Z22AiqsYtp7nQW/iWOMZJ4rd03xHb3i444rh18H3jsAp+Wt iz8Lz2CK5Y5HNFzNxR1N5OZl2oeDWXNYSkDaMmktbzyf9awAHrVsarFIp2sAuMlj6VaMHdHIeNfE dh4F0KTUdScAKdqIOrt2UDvXy146+LereM55lSVrG0bIWOI4OPc1Y+OnxCfxx4unjhc/2bYkwwKD wSPvN+J/lXmk9z9nt2kPO0dK76VNJXYyt4UvZE8b2QuLqQBZRlyx9a+o9I8UtqOomVT/AKOreWnp gcGvnn4ZfCnU/G1+L+UNZ6cjZa5YY3ey+tfSHgLwMNb8WaN4O0CNnZ5AhYHcxLHLux9gM1qrc6Jk 7o/Q39j/AEF9M+GDX8i7X1G4Mg90UYU/qa90rI8I+HYPCXhnTdHtgFhs4FiGO+ByfzzWvVsa0QVi +LvFFp4Q0K41K8kCIgwoP8THoK2q+cP2jPFJ1HXLfRon/cWY8yQA8GQ+v0H86Qzn9U8bWWpXdxcz 3nmSyvuJ2t/hWTceLLAxsgZmyCOBj+dcVKAD0zVaSQAdcU7laHVv4ss4YVQRyPtGM8CsybxdC4Yf Z2AJySWFc1JcDnaC5/Ssm/vJIIZhJtYMMBQMAVhOvGK31KUbmX448QvrMu1SY7SPiOP19zXnlzIh uxCZF3nnGelbut3xt4jIfmlfhBWToen+dfp5qiRmyzk148m53k2dcGo2QJpS3MmWkO0DgZrUghlt 0xHLjb2J6Ul5pDW7loGI/wBntVZQ8vDEq47iubmb0Oyy3R6P4Q1SfXLSeyupC11Eu+GTPJXuD9P6 179+zD8V5rLVm8J6tMTBcE/Y3kP3JAMlPoQCR7j3r5x+HtvNHqNteuNtsrtG8h6ZC5I/lXTXcn2D X7S+0+cAyOskMyH7sikFT+eK9CjVlFJy2OCrGLm1E/Q+iuf8A+Jo/GHhHTdVQjM8QLr/AHW7iugr 1zjKGvXZsNC1G6BwYbaSQH6KT/Svz4v3NxdzSE5MkjMSfc5r9APFsJuPCusxL957KZR9ShFfAslq /nMgUlgSMCgDPZcU63s576QRwRmRvYcD610OneFpLgh7jMaf3e5rpba1gsYgkKBAPQda5p14x0Wr NYwb3PIPij4dvrLwq4s4DdahJIkaMgz5Ic7C/wCAYmvG/gn4dku/F19FqH71dBLQRI44Dljk19Va 9bvKwcf6vvjtXHRaLaaTc3U1tbJDLcv5krouC7eprJV24tPqNxV00SNIVGKga4xRLMO9U3lH1rFC ZZF2VJOeAKofa2klOeRRLJiNm9arxHA6fMapIhmkZhtwo4q/HILPTpJSMcVk2lu8koJOF71W1jW2 MywwxmWND82O9VuIj0uwNv51zKP3smWJNJBdESBgcMDkEdjSat4kgj05m2mOQLja3Ws3TLgTQowO SRXVSje7E33P0P8ADfj0v4d0tjgk2sRJ/wCACiuX8M6Fc/8ACN6T+7P/AB6Rdv8AYFFbAT/sfIsn 7OHhNWAZT9sBB6EfbJ6+X/2yP2eX8NXVxqum2xfQr5y3yjP2dzyVPse1fUP7Hn/JufhL63n/AKWT 16vrmhWPiTSrjTdStku7K4QpJFIMgg0Afl34Cgkg8PWdtdMTOi4BPde1dbbosUg3YKHr7V33x/8A 2dtX+HNu+r+HYpdS0mJi4KDMkK+jAdR7j9K8P0XxvBqAMbN5c68FG4rz61Np8y2OmMlJWZ6SBbiM EDP0FSWlqjAyEBR15rj4fEvlEA8io9T8byNF5UK7eMVy2YmrHa3ev2elqdzDNcjrXxFRtywjJ7Vy jfatVcl3JBq5b+G4cb5TnFaKKW5FzOuvFFxdS5eQqmeQBXMfEj4sr4f8OXFpby41C7Qxpg/cU8E1 295p0fl7UhCrnANeUeL/AIPr4t8a/bbu7MWnxxqohj6tjrk9q2go31Jb0PE9OsL3XLtbbTrWS+uH ONsYzj6ntXsngr4Cw2aJqPil1mZfmSxRvkH+8e/0r0jSrfRfAmkeXY28FrGow0rYX82PWuXuNd1X x9qkel+HIJ7l5W2eckZJYnsijkmuvmlPSKMm7bljW/EhE8ejaLAhm4RI41wsY+g/lX3N+xZ+zY3w 40qTxf4giL+IdST9yko+aCI85PozcfQAeprN/Zc/Yyg8Ei28R+L4Fl1TiSGwch/LP96Q9C3t2r66 AAAAGAOwrVRUFZbiV3qxaKKKCyOeVbeCSVvuopY/QCvifxfqMuteJNRvXO5pZ2OfbOB+gr7E8YXJ s/C2qzL1W3fH5Yr4olny3JJJNAFC5PlDJ5J6Cqa20tyckYH0rVWzM8u5ua0LexBHAry6tVydlsbR VjDGnrDEzsCdvr3rl9egO8I3b5mr0e8ssRgehyfwrz3xJG8kMirkPM2M+1c1r6Bzannd2jXt207c xg4T6ev41peHLBjes4B2qvJA6Vo/2SFAUDgV3HhDTPMsJCFQYbbjb1GK29m5LlQlUs7nKXmlmSMl SGHqKwLnTmSZdoy2enrXrN94ajcFkBt5fVR8p/CsvT/DwS/M98qpbW48ySUcrgfrXI6Uk7HXCura hrFj/wAIv8ObVRAxllVmkkUZZC/P4cBRXn3hC7kihlnYStAZcxKW+7juPr/SvV4vEln4j05xHcxO fmLxkcY9MH0GB+FcQDFYI6pCqq7EogHArubShys5INuTZ9dfsl+I/wC0fC+qacQUFtceZGhPRW5P 617zXyv+yPctB4l1O3PSa0DY9wwr6or01sjIbLGs0bxuMqwKkeoNfG+q+Hh4d8Q6taSLiaK4YAn0 zkV9lV4B+0T4ZfTNQtPEkKf6LOVtrtgPuN0Rj7E8fUisqqbg7FRdmeVSS7eOtVjJk4JqVo+c+tQF QSeK82xo5jWJPBGaxNR0kyZaDH/XNv6elbbDGME1Gy/nTsZ8xwN7atC+11KN6MP61nTQEc84r0S5 tknTEiBwfUVjXfhmKQEwSNA3p1X8qtMXMcNcliEjAwSakR0jJLMM+lZ/j3xJpfgSzluNVuYxOq/u ooXzJJ9FryG4/aC0xmylheMT3baP61tGLa0C9z2m51VmQxQd+relZs1/Fp0RLOA3cmvHpvj+8gMd lpUrE8DcR/TNZ5vvE/jKXdcv/Z9oeqr1xW0aUmJtLc7nWPESarfiCB/MbOXI7D0r0P4ZaBL4k1zS dNiQu11cLFgf3SeT+WTXmnhPwyluVigQtnl5G6n8a+3P2PfhWXv5fFN1Fi1tB5FnuH35D95h9Bx/ wI+ldiiqcbGPNzS0Pq3T9NisbC2tgqkQxLGOPQAf0oq5RWZseM/sef8AJufhL63n/pZPXs1eM/se f8m5+Evref8ApZPXs1ADZI0mjZJFDowwVYZBFfOPxn/Yo8LfEWWbU9Bk/wCEZ1xst5kC/uZG/wBp R0+or6QooA/MXxX8BPid8LJJF1XQJta0xDxqGmr5yhfVgOV/GuKj1jTpLgrPL5DqcbJBtIP41+t9 cx4o+GHhDxruOveGdJ1d248y8so5HH0YjIrCVJPbQvmZ+aMOq6dFDva/t4kH+2M1T1Dxto9mArah Dnr94V91a1+w98F9dZmuPByREnOLW8uIR+SOBWIv/BPL4HeZubwtcyezard//HahUF1YrnwjqvxR 0O2X575XxztQ5rl4fFniTx5qv2Lwpod3fSOcJ5cLMx/AV+n/AIf/AGNPgz4akV7XwFpszL0+3Bro flKWr1fQ/DWkeGbUW2j6XZaVbDpDZW6QoPwUAVrGnFbkn5vfDL9gj4i/EO5gvvG11/Yen5DeTOcy 49AnY/WvuX4Rfs8eD/g3Zouj2Cy3wXD304DSH6eg9hXp1FbX0sibdQooopFBRRRQBgePEMng3WFX qbdq+MVt2LgEdTX3Fq1r9t0u8t8Z82F0x9Qa+MzYPDrDW7DDRylCD7HFKXwsV9Rbex6ZFaNvZ4HS tOPTsYzVqO0AHSvEdzoRz1/akI4x/ATXAa/a4eBMYxz+ler31sSSvZlxXCeJ9PZBHLg8HB9quO5n I49LNScla73wxZtcabEY1SMByGAXGa5VYT/CNxNdZo2ox6LpGbmdYUViSzDH5V1Rko7mLua81mlv E0kxCoOpauC1/wAQWVzBLb2shFuCQ7Iww5/wrL8bePZNdDWdm7x2YPzPnBk/wFcgC8hHIG3gY4FO UubUtIe1hbRags8LmIfxbTjcPetqS8trmEI6bSv3WrlNa1Sx0uPzLq8SNsfdJ5P0FY+geI5vE+rx wwZW1j5A9fc1MYupJdjX4VqfYP7KaGXxleuvKraHJ/GvquvnH9kfRmij1nUGXjasAb1719HV6LMI 7BVHW9Fs/EWk3Wm6hAtxZ3MZiljccMpGDV6ikUfFvjvw7qHwl8QDS9YZpdInYjT9UYfLIvZHPZx0 9+tU9wmAZWBXrxX2R4o8LaX4z0W40nWbKK/sJ12vFKuR9R6H3r5R8f8A7M3iPwHJLd+EdTnutHyS LWb96YR6YPOPpiueVBS1iS3Ywip9MUxjgckD61yTDxbGxjlmsldeDmFgR+G6snUfD3iHWAUudflt 4jwUskWP9cZ/WoWHmZuaOh8UeOtD8JWb3OqajBaxr/fcZPsBXz147/aW13xE0lj4G0edoz8v9o3E ZC/VQa9It/gxoUNybm4tTf3XUz3rmZz+LE10MPhi2tohHHAiKOihRiumGGgtZu5Dqv7KPnTwP8L9 P8WTTXvxC13Vo7923KbWNZFI988itC8+EXh20vpRZSz3dqGIjeZMOV7ZHrXvw8PQFubeP67RUyaD BGBiBAfUKK7VyLZGDlUetzwzTvANvCQLSxLEfxbc102meAbh3Bm/dr/dxzXqMemtuCJGWyeiivWf hr+z3qniuSK61JX03S+CWcfvHH+yO31NDmlsOKbe55z8HvgddeOdYjtbaNoNPjYG5uSOFHpn1Nfe Ph/QbPwxo1ppdhEIbS2QIij+Z9z1qPw14Z07wlpUOnaXbJbW0Y6L1Y+pPc+5rVrmk7nZGPKgoooq Szxn9jz/AJNz8JfW8/8ASyevZq8a/Y+GP2dPCX1vP/SyevZaACiiigAooooAKKKKACiiigAooooA KKKKACiiigAr5r8eeGDo/wAR7nCYgmBuIzjjngj8/wCdfSleO/tPeDda8QfD251LwzNJDrumqZox EcNLH/Gn9fwqZJuLSDqcKyLGCzkIo6ljgCuZ1j4o+D/D7Ml54isFlXrFFL50g/4CmT+lfAvj7xx4 /ubuW31SW8baxBS6dnx9OledXl5rd4CJ55mX+6OMVyLD9zTm7H3l4u/a78E6KrJaQ3epyDOHIWBB 9d5D/khrxXxV+2i+pStFHFa6fbkHP2e3a7JH+8zRYP8AwE18yto97ctny5XJ7kEmp4fA2qXTfu7G eTPcIa1VGKJcu59O6L+01p3iLEVrepYuBjZOio5/E8flV+98cC8xJPctP3BLgivmAfCXXXAf+zpl HXO2rMHw18QKQnl3Sqe2Tih0bbCvF9T36++I+j2KFri8jjx/CG3MfoBXE6z8Xbm9kMelwvHEePNl 4J+grC8OfBvVbhlLWzZP8T8mvU/DfwHnEiPcocdcYwKn2DbuyvaQgjznRNB1TxXfb38yV3PMj84r 6G+Hfw9Tw9aK7DdMw5Jrp/DPgG00aFQkI3D0FesfC3wC3irxLbQGM/Y4CJp27bQen4nAruhBQV2c U6rm7RPevgh4XPhfwBZRyJtuLn9/ICMEZ6A/Su/pscawxqiDCqMAD0p1ZnSlZWCiiigYUdaKKAOQ 8U/Crw74t3PdWQguD/y8W3yP/gfyrynXf2Zb2JmfR9UhnU8iO6UoR7ZGc/pX0LRTTaJcUz5F1H4H eMbJjjSPtK/34ZkI/Ug1mt8JvFvT+wrn/wAd/wAa+zKKrmZHs0fIFl8DfGV6eNIMIP8AFNKgH6Em uw0D9l/U5nV9Y1S3tk7x2ymRsemTtx+tfR9FHMw9nE4fwn8HPDPhIrJBZC7uV/5b3Xzn8B0FduAA MAYA7CloqW7miSWwUUUUhhRRRQB45+yCMfs7+E/ref8ApZNXsdFFABRRRQAUUUUAFFFFABRRRQAU UUUAFFFFABRRRQAUjKGBBGQeCDRRQB8b/G7wZpGm+M76CG0TymO/YwBAJ5OOOleWT+ENHZznT4P+ +BRRXQjzp6SGR+FdKibK2UI/4AKvW+i2URAS3RB7KBRRVozZpRafbhf9UvT0oTSbOQ/Nbxn/AICK KKszRcs7GCLOyJVx6CrohUOuB1ooqGWi/DGuelfTvwd0S00vwfbzwR7Zrr55XPVj2/Ciisp7HRR+ I7qiiisTuCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooA/9k= --20cf3010eb233fa2df04c9552021 Content-Type: image/jpeg; name="F3272.jpg" Content-Disposition: attachment; filename="F3272.jpg" Content-Transfer-Encoding: base64 /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsK CwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQU FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAEHAV0DASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9U6KK KACiiigAooooAKKKZLNHBGXldY0HJZjgCgB9FcD4l+NXhvw8WjWdr+4Xjy7cZGfc15jr/wC0drF2 WXTLOCwjPR3HmP8Arx+lK6HZn0WSFGScD3qpdavY2Slp7uGIDuzgV8fax8RfE+tM32rWbsqeqxSG NfyXArmp3luHLyyNIx6s5yT+NTzFcp9n3HxG8MWpxLrtih9DMKrf8LV8JD/mPWX/AH9FfEOo+INP 0oYuLuNG/ug5P5CsR/iDZFsR217MB/EsJwa0jCpP4YtmU506fxySPv2L4n+FJThdfsc+hmFaln4o 0jUCBbalbTZ6bJQa/PFfHULD5bC9GPWKg+N7RFDSrNbLn70i7QK3WFxDdvZv7mc7xmFSb9otPNH6 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 xj0VQKkoooAKKKKACiiigAooooAKKKKAP//Z --20cf3010eb233fa2df04c9552021 Content-Type: image/jpeg; name="F3478.jpg" Content-Disposition: attachment; filename="F3478.jpg" Content-Transfer-Encoding: base64 /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsK CwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQU FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAEGAWQDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9U6KK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiq99f2+m27T3UyQRL1dzgVwes /F6ygdo7ELLj/lrIcD8qB2ueiUx5Uj+86r9TivBdc+JN/qaMn9oGIHtCcCuRXXLy1ujcxXkjE/eV 2JDVEpxguaTsilBvRH1L9rgP/LaP/vsVIkiyDKsGHsc18+WfxDtJrIx3CyQTAYGASDTbn4jafp8L SJdSgqMgLnNeXLN8uje9eP3o3WFrPaD+4+h6K+aPCH7TFvqermxW8ZSilitwODg4xntXsOg/FHT9 TCrcEQsf+Wincn59q3wmPwuOjzYeopfn925NXD1aLtUjY7aimQzR3EayRurowyGU5Bp9egc4UUUU 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 7A3Y3YzgZx0FFFFAH//Z --20cf3010eb233fa2df04c9552021 Content-Type: image/jpeg; name="F3469.jpg" Content-Disposition: attachment; filename="F3469.jpg" Content-Transfer-Encoding: base64 /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsK CwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQU FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAD6AVcDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9U6KK KACiiigAooooAKKKKACiiigAooooAKKKKACiiigAqC9vbfTrWS5upkt4IxueSRgqqPcmue8d/EPS fh/phutQlzKw/dWyH55D7e3vXyB8S/jLrPj66f7VObbT1Y+VZQnCL7n1PvXPVrworU7MPhamJlaK 0PbfH/7T9lpskln4cgF9MODdScRg+w6mvnbxl8TPEPi6d31HVZnQniJW2oB6YHFcnPdlmOCfxNUp 5mJVc5rxauKnUVtj6vDZdToNS3J550Z/mkZjVSWaJTnBNQXErKTjiqNxKzA/MAa4G22e3BJJalw3 inIVBS/2iV2ghRg1kqzAH5hUe5pGxuFCk09DWUISWpr3msPC7quODxxWf/wkt5kjdx6CmXcLNKee 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 --20cf3010eb233fa2df04c9552021-- From bfoster@redhat.com Mon Sep 10 13:35:47 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8AIZlZa175860 for ; Mon, 10 Sep 2012 13:35:47 -0500 X-ASG-Debug-ID: 1347302210-04cb6c568751fd0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id VD2r5EED3jEkwoZc for ; Mon, 10 Sep 2012 11:36:50 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8AIaobO006988 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 10 Sep 2012 14:36:50 -0400 Received: from bfoster.bfoster ([10.16.225.83]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id q8AIan1a026127 for ; Mon, 10 Sep 2012 14:36:49 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id E0CFE120611; Mon, 10 Sep 2012 14:37:26 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v2 2/8] xfs: support a tag-based inode_ag_iterator Date: Mon, 10 Sep 2012 14:37:20 -0400 X-ASG-Orig-Subj: [PATCH v2 2/8] xfs: support a tag-based inode_ag_iterator Message-Id: <1347302246-52710-3-git-send-email-bfoster@redhat.com> In-Reply-To: <1347302246-52710-1-git-send-email-bfoster@redhat.com> References: <1347302246-52710-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1347302210 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com Genericize xfs_inode_ag_walk() to support an optional radix tree tag and args argument for the execute function. Create a new wrapper called xfs_inode_ag_iterator_tag() that performs a tag based walk of perag's and inodes. Signed-off-by: Brian Foster --- fs/xfs/xfs_qm_syscalls.c | 5 ++- fs/xfs/xfs_sync.c | 61 +++++++++++++++++++++++++++++++++++++++------- fs/xfs/xfs_sync.h | 7 ++++- 3 files changed, 60 insertions(+), 13 deletions(-) diff --git a/fs/xfs/xfs_qm_syscalls.c b/fs/xfs/xfs_qm_syscalls.c index 858a3b1..848bd8e 100644 --- a/fs/xfs/xfs_qm_syscalls.c +++ b/fs/xfs/xfs_qm_syscalls.c @@ -845,7 +845,8 @@ STATIC int xfs_dqrele_inode( struct xfs_inode *ip, struct xfs_perag *pag, - int flags) + int flags, + void *args) { /* skip quota inodes */ if (ip == ip->i_mount->m_quotainfo->qi_uquotaip || @@ -881,5 +882,5 @@ xfs_qm_dqrele_all_inodes( uint flags) { ASSERT(mp->m_quotainfo); - xfs_inode_ag_iterator(mp, xfs_dqrele_inode, flags); + xfs_inode_ag_iterator(mp, xfs_dqrele_inode, flags, NULL); } diff --git a/fs/xfs/xfs_sync.c b/fs/xfs/xfs_sync.c index 00c6224..0da93c9 100644 --- a/fs/xfs/xfs_sync.c +++ b/fs/xfs/xfs_sync.c @@ -101,8 +101,11 @@ xfs_inode_ag_walk( struct xfs_mount *mp, struct xfs_perag *pag, int (*execute)(struct xfs_inode *ip, - struct xfs_perag *pag, int flags), - int flags) + struct xfs_perag *pag, int flags, + void *args), + int flags, + void *args, + int tag) { uint32_t first_index; int last_error = 0; @@ -121,9 +124,17 @@ restart: int i; rcu_read_lock(); - nr_found = radix_tree_gang_lookup(&pag->pag_ici_root, + + if (tag == -1) + nr_found = radix_tree_gang_lookup(&pag->pag_ici_root, (void **)batch, first_index, XFS_LOOKUP_BATCH); + else + nr_found = radix_tree_gang_lookup_tag( + &pag->pag_ici_root, + (void **) batch, first_index, + XFS_LOOKUP_BATCH, tag); + if (!nr_found) { rcu_read_unlock(); break; @@ -164,7 +175,7 @@ restart: for (i = 0; i < nr_found; i++) { if (!batch[i]) continue; - error = execute(batch[i], pag, flags); + error = execute(batch[i], pag, flags, args); IRELE(batch[i]); if (error == EAGAIN) { skipped++; @@ -193,8 +204,10 @@ int xfs_inode_ag_iterator( struct xfs_mount *mp, int (*execute)(struct xfs_inode *ip, - struct xfs_perag *pag, int flags), - int flags) + struct xfs_perag *pag, int flags, + void *args), + int flags, + void *args) { struct xfs_perag *pag; int error = 0; @@ -204,7 +217,36 @@ xfs_inode_ag_iterator( ag = 0; while ((pag = xfs_perag_get(mp, ag))) { ag = pag->pag_agno + 1; - error = xfs_inode_ag_walk(mp, pag, execute, flags); + error = xfs_inode_ag_walk(mp, pag, execute, flags, args, -1); + xfs_perag_put(pag); + if (error) { + last_error = error; + if (error == EFSCORRUPTED) + break; + } + } + return XFS_ERROR(last_error); +} + +int +xfs_inode_ag_iterator_tag( + struct xfs_mount *mp, + int (*execute)(struct xfs_inode *ip, + struct xfs_perag *pag, int flags, + void *args), + int flags, + void *args, + int tag) +{ + struct xfs_perag *pag; + int error = 0; + int last_error = 0; + xfs_agnumber_t ag; + + ag = 0; + while ((pag = xfs_perag_get_tag(mp, ag, tag))) { + ag = pag->pag_agno + 1; + error = xfs_inode_ag_walk(mp, pag, execute, flags, args, tag); xfs_perag_put(pag); if (error) { last_error = error; @@ -219,7 +261,8 @@ STATIC int xfs_sync_inode_data( struct xfs_inode *ip, struct xfs_perag *pag, - int flags) + int flags, + void *args) { struct inode *inode = VFS_I(ip); struct address_space *mapping = inode->i_mapping; @@ -252,7 +295,7 @@ xfs_sync_data( ASSERT((flags & ~(SYNC_TRYLOCK|SYNC_WAIT)) == 0); - error = xfs_inode_ag_iterator(mp, xfs_sync_inode_data, flags); + error = xfs_inode_ag_iterator(mp, xfs_sync_inode_data, flags, NULL); if (error) return XFS_ERROR(error); diff --git a/fs/xfs/xfs_sync.h b/fs/xfs/xfs_sync.h index 4486491..463ea0a 100644 --- a/fs/xfs/xfs_sync.h +++ b/fs/xfs/xfs_sync.h @@ -48,7 +48,10 @@ void xfs_inode_clear_eofblocks_tag(struct xfs_inode *ip); int xfs_sync_inode_grab(struct xfs_inode *ip); int xfs_inode_ag_iterator(struct xfs_mount *mp, - int (*execute)(struct xfs_inode *ip, struct xfs_perag *pag, int flags), - int flags); + int (*execute)(struct xfs_inode *ip, struct xfs_perag *pag, int flags, void *args), + int flags, void *args); +int xfs_inode_ag_iterator_tag(struct xfs_mount *mp, + int (*execute)(struct xfs_inode *ip, struct xfs_perag *pag, int flags, void *args), + int flags, void *args, int tag); #endif -- 1.7.7.6 From bfoster@redhat.com Mon Sep 10 13:35:47 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8AIZlZ0175861 for ; Mon, 10 Sep 2012 13:35:47 -0500 X-ASG-Debug-ID: 1347302210-04cbb07ce355330001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id W2ARPpQ9sxwGSG5R for ; Mon, 10 Sep 2012 11:36:50 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8AIaoCk020894 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 10 Sep 2012 14:36:50 -0400 Received: from bfoster.bfoster ([10.16.225.83]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q8AIancN027942 for ; Mon, 10 Sep 2012 14:36:50 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 3705D121338; Mon, 10 Sep 2012 14:37:27 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v2 5/8] xfs: create function to scan and clear EOFBLOCKS inodes Date: Mon, 10 Sep 2012 14:37:23 -0400 X-ASG-Orig-Subj: [PATCH v2 5/8] xfs: create function to scan and clear EOFBLOCKS inodes Message-Id: <1347302246-52710-6-git-send-email-bfoster@redhat.com> In-Reply-To: <1347302246-52710-1-git-send-email-bfoster@redhat.com> References: <1347302246-52710-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1347302210 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com xfs_inodes_free_eofblocks() implements scanning functionality for EOFBLOCKS inodes. It uses the AG iterator to walk the tagged inodes and free post-EOF blocks via the xfs_inode_free_eofblocks() execute function. The scan can be invoked in best-effort mode or wait (force) mode. A best-effort scan (default) handles all inodes for which we successfully acquire the io lock via trylock. In wait mode, we continue to cycle through an AG until all inodes are handled. Signed-off-by: Brian Foster --- fs/xfs/xfs_sync.c | 36 ++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_sync.h | 1 + fs/xfs/xfs_trace.h | 1 + 3 files changed, 38 insertions(+), 0 deletions(-) diff --git a/fs/xfs/xfs_sync.c b/fs/xfs/xfs_sync.c index 0da93c9..a248a52 100644 --- a/fs/xfs/xfs_sync.c +++ b/fs/xfs/xfs_sync.c @@ -1014,6 +1014,42 @@ xfs_reclaim_inodes_count( return reclaimable; } +STATIC int +xfs_inode_free_eofblocks( + struct xfs_inode *ip, + struct xfs_perag *pag, + int flags, + void *args) +{ + int ret; + bool force = flags & SYNC_WAIT; + + if (!xfs_can_free_eofblocks(ip, false)) { + /* inode could be preallocated or append-only */ + trace_xfs_inode_free_eofblocks_invalid(ip); + xfs_inode_clear_eofblocks_tag(ip); + return 0; + } + + ret = xfs_free_eofblocks(ip->i_mount, ip, false); + + /* ignore EAGAIN on a best effort scan */ + if (!force && (ret == EAGAIN)) + ret = 0; + + return ret; +} + +int +xfs_inodes_free_eofblocks( + struct xfs_mount *mp, + int flags) +{ + ASSERT((flags & ~(SYNC_TRYLOCK|SYNC_WAIT)) == 0); + return xfs_inode_ag_iterator_tag(mp, xfs_inode_free_eofblocks, flags, + NULL, XFS_ICI_EOFBLOCKS_TAG); +} + void xfs_inode_set_eofblocks_tag( xfs_inode_t *ip) diff --git a/fs/xfs/xfs_sync.h b/fs/xfs/xfs_sync.h index 463ea0a..307654a 100644 --- a/fs/xfs/xfs_sync.h +++ b/fs/xfs/xfs_sync.h @@ -45,6 +45,7 @@ void __xfs_inode_clear_reclaim_tag(struct xfs_mount *mp, struct xfs_perag *pag, void xfs_inode_set_eofblocks_tag(struct xfs_inode *ip); void xfs_inode_clear_eofblocks_tag(struct xfs_inode *ip); +int xfs_inodes_free_eofblocks(struct xfs_mount *, int); int xfs_sync_inode_grab(struct xfs_inode *ip); int xfs_inode_ag_iterator(struct xfs_mount *mp, diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index d081f3e..9c810f7 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -588,6 +588,7 @@ DEFINE_INODE_EVENT(xfs_dquot_dqdetach); DEFINE_INODE_EVENT(xfs_inode_set_eofblocks_tag); DEFINE_INODE_EVENT(xfs_inode_clear_eofblocks_tag); +DEFINE_INODE_EVENT(xfs_inode_free_eofblocks_invalid); DECLARE_EVENT_CLASS(xfs_iref_class, TP_PROTO(struct xfs_inode *ip, unsigned long caller_ip), -- 1.7.7.6 From bfoster@redhat.com Mon Sep 10 13:35:47 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_72 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8AIZl1v175863 for ; Mon, 10 Sep 2012 13:35:47 -0500 X-ASG-Debug-ID: 1347302210-04cbb07ce255330001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 20EfnV58BxqgADtK for ; Mon, 10 Sep 2012 11:36:50 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8AIaoJP024927 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 10 Sep 2012 14:36:50 -0400 Received: from bfoster.bfoster ([10.16.225.83]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id q8AIaod3026141 for ; Mon, 10 Sep 2012 14:36:50 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 4E379121339; Mon, 10 Sep 2012 14:37:27 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v2 8/8] xfs: add background scanning to clear EOFBLOCKS inodes Date: Mon, 10 Sep 2012 14:37:26 -0400 X-ASG-Orig-Subj: [PATCH v2 8/8] xfs: add background scanning to clear EOFBLOCKS inodes Message-Id: <1347302246-52710-9-git-send-email-bfoster@redhat.com> In-Reply-To: <1347302246-52710-1-git-send-email-bfoster@redhat.com> References: <1347302246-52710-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1347302210 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com Create a delayed_work to enable background scanning and freeing of EOFBLOCKS inodes. The scanner kicks in once speculative preallocation occurs and stops requeueing itself when no EOFBLOCKS inodes exist. Scans are queued on the existing syncd workqueue and the interval is based on the new eofb_timer tunable (default to 5m). The background scanner performs unfiltered, best effort scans (which skips inodes under lock contention or with a dirty cache mapping). Signed-off-by: Brian Foster --- fs/xfs/xfs_globals.c | 1 + fs/xfs/xfs_linux.h | 1 + fs/xfs/xfs_mount.h | 2 ++ fs/xfs/xfs_sync.c | 30 ++++++++++++++++++++++++++++++ fs/xfs/xfs_sysctl.c | 9 +++++++++ fs/xfs/xfs_sysctl.h | 1 + 6 files changed, 44 insertions(+), 0 deletions(-) diff --git a/fs/xfs/xfs_globals.c b/fs/xfs/xfs_globals.c index 76e81cf..fda9a66 100644 --- a/fs/xfs/xfs_globals.c +++ b/fs/xfs/xfs_globals.c @@ -40,4 +40,5 @@ xfs_param_t xfs_params = { .rotorstep = { 1, 1, 255 }, .inherit_nodfrg = { 0, 1, 1 }, .fstrm_timer = { 1, 30*100, 3600*100}, + .eofb_timer = { 1*100, 300*100, 7200*100}, }; diff --git a/fs/xfs/xfs_linux.h b/fs/xfs/xfs_linux.h index 828662f..bbad99b 100644 --- a/fs/xfs/xfs_linux.h +++ b/fs/xfs/xfs_linux.h @@ -118,6 +118,7 @@ #define xfs_rotorstep xfs_params.rotorstep.val #define xfs_inherit_nodefrag xfs_params.inherit_nodfrg.val #define xfs_fstrm_centisecs xfs_params.fstrm_timer.val +#define xfs_eofb_centisecs xfs_params.eofb_timer.val #define current_cpu() (raw_smp_processor_id()) #define current_pid() (current->pid) diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 05a05a7..a966bf4 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -204,6 +204,8 @@ typedef struct xfs_mount { struct xfs_mru_cache *m_filestream; /* per-mount filestream data */ struct delayed_work m_sync_work; /* background sync work */ struct delayed_work m_reclaim_work; /* background inode reclaim */ + struct delayed_work m_eofblocks_work; /* background eof blocks + trimming */ struct work_struct m_flush_work; /* background inode flush */ __int64_t m_update_flags; /* sb flags we need to update on the next remount,rw */ diff --git a/fs/xfs/xfs_sync.c b/fs/xfs/xfs_sync.c index 13cd9da..778cf6a 100644 --- a/fs/xfs/xfs_sync.c +++ b/fs/xfs/xfs_sync.c @@ -532,6 +532,31 @@ xfs_flush_worker( xfs_sync_data(mp, SYNC_TRYLOCK | SYNC_WAIT); } +/* + * Background scanning to trim post-EOF preallocated space. This is queued + * based on the 'eofb_centisecs' tunable (5m by default). + */ +STATIC void +xfs_queue_eofblocks( + struct xfs_mount *mp) +{ + rcu_read_lock(); + if (radix_tree_tagged(&mp->m_perag_tree, XFS_ICI_EOFBLOCKS_TAG)) + queue_delayed_work(xfs_syncd_wq, &mp->m_eofblocks_work, + msecs_to_jiffies(xfs_eofb_centisecs * 10)); + rcu_read_unlock(); +} + +STATIC void +xfs_eofblocks_worker( +struct work_struct *work) +{ + struct xfs_mount *mp = container_of(to_delayed_work(work), + struct xfs_mount, m_eofblocks_work); + xfs_inodes_free_eofblocks(mp, SYNC_TRYLOCK, NULL); + xfs_queue_eofblocks(mp); +} + int xfs_syncd_init( struct xfs_mount *mp) @@ -539,6 +564,7 @@ xfs_syncd_init( INIT_WORK(&mp->m_flush_work, xfs_flush_worker); INIT_DELAYED_WORK(&mp->m_sync_work, xfs_sync_worker); INIT_DELAYED_WORK(&mp->m_reclaim_work, xfs_reclaim_worker); + INIT_DELAYED_WORK(&mp->m_eofblocks_work, xfs_eofblocks_worker); xfs_syncd_queue_sync(mp); @@ -551,6 +577,7 @@ xfs_syncd_stop( { cancel_delayed_work_sync(&mp->m_sync_work); cancel_delayed_work_sync(&mp->m_reclaim_work); + cancel_delayed_work_sync(&mp->m_eofblocks_work); cancel_work_sync(&mp->m_flush_work); } @@ -1101,6 +1128,9 @@ xfs_inode_set_eofblocks_tag( XFS_ICI_EOFBLOCKS_TAG); spin_unlock(&ip->i_mount->m_perag_lock); + /* kick off background trimming */ + xfs_queue_eofblocks(ip->i_mount); + trace_xfs_perag_set_eofblocks(ip->i_mount, pag->pag_agno, -1, _RET_IP_); } diff --git a/fs/xfs/xfs_sysctl.c b/fs/xfs/xfs_sysctl.c index ee2d2ad..45d74fc 100644 --- a/fs/xfs/xfs_sysctl.c +++ b/fs/xfs/xfs_sysctl.c @@ -202,6 +202,15 @@ static ctl_table xfs_table[] = { .extra1 = &xfs_params.fstrm_timer.min, .extra2 = &xfs_params.fstrm_timer.max, }, + { + .procname = "eofb_centisecs", + .data = &xfs_params.eofb_timer.val, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = proc_dointvec_minmax, + .extra1 = &xfs_params.eofb_timer.min, + .extra2 = &xfs_params.eofb_timer.max, + }, /* please keep this the last entry */ #ifdef CONFIG_PROC_FS { diff --git a/fs/xfs/xfs_sysctl.h b/fs/xfs/xfs_sysctl.h index b9937d4..bd8e157 100644 --- a/fs/xfs/xfs_sysctl.h +++ b/fs/xfs/xfs_sysctl.h @@ -47,6 +47,7 @@ typedef struct xfs_param { xfs_sysctl_val_t rotorstep; /* inode32 AG rotoring control knob */ xfs_sysctl_val_t inherit_nodfrg;/* Inherit the "nodefrag" inode flag. */ xfs_sysctl_val_t fstrm_timer; /* Filestream dir-AG assoc'n timeout. */ + xfs_sysctl_val_t eofb_timer; /* Interval between eofb scan wakeups */ } xfs_param_t; /* -- 1.7.7.6 From bfoster@redhat.com Mon Sep 10 13:35:47 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.9 required=5.0 tests=BAYES_00,LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8AIZlA6175857 for ; Mon, 10 Sep 2012 13:35:47 -0500 X-ASG-Debug-ID: 1347302210-04cb6c568851fd0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 3THJHmxdC1ex3PHC for ; Mon, 10 Sep 2012 11:36:50 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8AIaoqA021515 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 10 Sep 2012 14:36:50 -0400 Received: from bfoster.bfoster ([10.16.225.83]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q8AIan9K027936 for ; Mon, 10 Sep 2012 14:36:49 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id CC3D5120012; Mon, 10 Sep 2012 14:37:26 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v2 1/8] xfs: add EOFBLOCKS inode tagging/untagging Date: Mon, 10 Sep 2012 14:37:19 -0400 X-ASG-Orig-Subj: [PATCH v2 1/8] xfs: add EOFBLOCKS inode tagging/untagging Message-Id: <1347302246-52710-2-git-send-email-bfoster@redhat.com> In-Reply-To: <1347302246-52710-1-git-send-email-bfoster@redhat.com> References: <1347302246-52710-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1347302210 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com Add the XFS_ICI_EOFBLOCKS_TAG inode tag to identify inodes with speculatively preallocated blocks beyond EOF. An inode is tagged when speculative preallocation occurs and untagged either via truncate down or when post-EOF blocks are freed via release or reclaim. The tag management is intentionally not aggressive to prefer simplicity over the complexity of handling all the corner cases under which post-EOF blocks could be freed (i.e., forward truncation, fallocate, write error conditions, etc.). This means that a tagged inode may or may not have post-EOF blocks after a period of time. The tag is eventually cleared when the inode is released or reclaimed. Signed-off-by: Brian Foster --- fs/xfs/xfs_ag.h | 1 + fs/xfs/xfs_iomap.c | 7 +++++ fs/xfs/xfs_iops.c | 3 ++ fs/xfs/xfs_sync.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_sync.h | 3 ++ fs/xfs/xfs_trace.h | 5 ++++ fs/xfs/xfs_vnodeops.c | 2 + 7 files changed, 83 insertions(+), 0 deletions(-) diff --git a/fs/xfs/xfs_ag.h b/fs/xfs/xfs_ag.h index 44d65c1..22bd4db 100644 --- a/fs/xfs/xfs_ag.h +++ b/fs/xfs/xfs_ag.h @@ -233,6 +233,7 @@ typedef struct xfs_perag { #define XFS_ICI_NO_TAG (-1) /* special flag for an untagged lookup in xfs_inode_ag_iterator */ #define XFS_ICI_RECLAIM_TAG 0 /* inode is to be reclaimed */ +#define XFS_ICI_EOFBLOCKS_TAG 1 /* inode has blocks beyond EOF */ #define XFS_AG_MAXLEVELS(mp) ((mp)->m_ag_maxlevels) #define XFS_MIN_FREELIST_RAW(bl,cl,mp) \ diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index 973dff6..2968ee8 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -459,6 +459,13 @@ retry: if (!(imap[0].br_startblock || XFS_IS_REALTIME_INODE(ip))) return xfs_alert_fsblock_zero(ip, &imap[0]); + /* + * Tag the inode as speculatively preallocated so we can reclaim this + * space on demand, if necessary. + */ + if (prealloc) + xfs_inode_set_eofblocks_tag(ip); + *ret_imap = imap[0]; return 0; } diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index 4e00cf0..dcd1d5f 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -854,6 +854,9 @@ xfs_setattr_size( * and do not wait the usual (long) time for writeout. */ xfs_iflags_set(ip, XFS_ITRUNCATED); + + /* A truncate down always removes post-EOF blocks. */ + xfs_inode_clear_eofblocks_tag(ip); } if (mask & ATTR_CTIME) { diff --git a/fs/xfs/xfs_sync.c b/fs/xfs/xfs_sync.c index 9654817..00c6224 100644 --- a/fs/xfs/xfs_sync.c +++ b/fs/xfs/xfs_sync.c @@ -971,3 +971,65 @@ xfs_reclaim_inodes_count( return reclaimable; } +void +xfs_inode_set_eofblocks_tag( + xfs_inode_t *ip) +{ + struct xfs_mount *mp = ip->i_mount; + struct xfs_perag *pag; + int tagged; + + pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, ip->i_ino)); + spin_lock(&pag->pag_ici_lock); + trace_xfs_inode_set_eofblocks_tag(ip); + + tagged = radix_tree_tagged(&pag->pag_ici_root, + XFS_ICI_EOFBLOCKS_TAG); + radix_tree_tag_set(&pag->pag_ici_root, + XFS_INO_TO_AGINO(ip->i_mount, ip->i_ino), + XFS_ICI_EOFBLOCKS_TAG); + if (!tagged) { + /* propagate the eofblocks tag up into the perag radix tree */ + spin_lock(&ip->i_mount->m_perag_lock); + radix_tree_tag_set(&ip->i_mount->m_perag_tree, + XFS_INO_TO_AGNO(ip->i_mount, ip->i_ino), + XFS_ICI_EOFBLOCKS_TAG); + spin_unlock(&ip->i_mount->m_perag_lock); + + trace_xfs_perag_set_eofblocks(ip->i_mount, pag->pag_agno, + -1, _RET_IP_); + } + + spin_unlock(&pag->pag_ici_lock); + xfs_perag_put(pag); +} + +void +xfs_inode_clear_eofblocks_tag( + xfs_inode_t *ip) +{ + struct xfs_mount *mp = ip->i_mount; + struct xfs_perag *pag; + + pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, ip->i_ino)); + spin_lock(&pag->pag_ici_lock); + trace_xfs_inode_clear_eofblocks_tag(ip); + + radix_tree_tag_clear(&pag->pag_ici_root, + XFS_INO_TO_AGINO(ip->i_mount, ip->i_ino), + XFS_ICI_EOFBLOCKS_TAG); + if (!radix_tree_tagged(&pag->pag_ici_root, XFS_ICI_EOFBLOCKS_TAG)) { + /* clear the eofblocks tag from the perag radix tree */ + spin_lock(&ip->i_mount->m_perag_lock); + radix_tree_tag_clear(&ip->i_mount->m_perag_tree, + XFS_INO_TO_AGNO(ip->i_mount, ip->i_ino), + XFS_ICI_EOFBLOCKS_TAG); + spin_unlock(&ip->i_mount->m_perag_lock); + trace_xfs_perag_clear_eofblocks(ip->i_mount, pag->pag_agno, + -1, _RET_IP_); + } + + spin_unlock(&pag->pag_ici_lock); + xfs_perag_put(pag); +} + diff --git a/fs/xfs/xfs_sync.h b/fs/xfs/xfs_sync.h index 941202e..4486491 100644 --- a/fs/xfs/xfs_sync.h +++ b/fs/xfs/xfs_sync.h @@ -43,6 +43,9 @@ void __xfs_inode_set_reclaim_tag(struct xfs_perag *pag, struct xfs_inode *ip); void __xfs_inode_clear_reclaim_tag(struct xfs_mount *mp, struct xfs_perag *pag, struct xfs_inode *ip); +void xfs_inode_set_eofblocks_tag(struct xfs_inode *ip); +void xfs_inode_clear_eofblocks_tag(struct xfs_inode *ip); + int xfs_sync_inode_grab(struct xfs_inode *ip); int xfs_inode_ag_iterator(struct xfs_mount *mp, int (*execute)(struct xfs_inode *ip, struct xfs_perag *pag, int flags), diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index e5795dd..d081f3e 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -129,6 +129,8 @@ DEFINE_PERAG_REF_EVENT(xfs_perag_get_tag); DEFINE_PERAG_REF_EVENT(xfs_perag_put); DEFINE_PERAG_REF_EVENT(xfs_perag_set_reclaim); DEFINE_PERAG_REF_EVENT(xfs_perag_clear_reclaim); +DEFINE_PERAG_REF_EVENT(xfs_perag_set_eofblocks); +DEFINE_PERAG_REF_EVENT(xfs_perag_clear_eofblocks); TRACE_EVENT(xfs_attr_list_node_descend, TP_PROTO(struct xfs_attr_list_context *ctx, @@ -584,6 +586,9 @@ DEFINE_INODE_EVENT(xfs_update_time); DEFINE_INODE_EVENT(xfs_dquot_dqalloc); DEFINE_INODE_EVENT(xfs_dquot_dqdetach); +DEFINE_INODE_EVENT(xfs_inode_set_eofblocks_tag); +DEFINE_INODE_EVENT(xfs_inode_clear_eofblocks_tag); + DECLARE_EVENT_CLASS(xfs_iref_class, TP_PROTO(struct xfs_inode *ip, unsigned long caller_ip), TP_ARGS(ip, caller_ip), diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c index 2a5c6373..d883881 100644 --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c @@ -237,6 +237,8 @@ xfs_free_eofblocks( } else { error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); + if (!error) + xfs_inode_clear_eofblocks_tag(ip); } xfs_iunlock(ip, XFS_ILOCK_EXCL); -- 1.7.7.6 From bfoster@redhat.com Mon Sep 10 13:35:47 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8AIZkxK175855 for ; Mon, 10 Sep 2012 13:35:47 -0500 X-ASG-Debug-ID: 1347302210-04bdf0067d54d70001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 3vJj9wSSB9nkMrLv for ; Mon, 10 Sep 2012 11:36:50 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8AIaonv024921 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 10 Sep 2012 14:36:50 -0400 Received: from bfoster.bfoster ([10.16.225.83]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id q8AIanXC026130 for ; Mon, 10 Sep 2012 14:36:49 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 17FDC120615; Mon, 10 Sep 2012 14:37:26 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v2 4/8] xfs: export xfs_free_eofblocks() and return EAGAIN on trylock failure Date: Mon, 10 Sep 2012 14:37:22 -0400 X-ASG-Orig-Subj: [PATCH v2 4/8] xfs: export xfs_free_eofblocks() and return EAGAIN on trylock failure Message-Id: <1347302246-52710-5-git-send-email-bfoster@redhat.com> In-Reply-To: <1347302246-52710-1-git-send-email-bfoster@redhat.com> References: <1347302246-52710-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1347302210 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com Turn xfs_free_eofblocks() into a non-static function, return EAGAIN to indicate trylock failure and make sure this error is not propagated in xfs_release(). Signed-off-by: Brian Foster --- fs/xfs/xfs_vnodeops.c | 6 +++--- fs/xfs/xfs_vnodeops.h | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c index 12f5087..a61e852 100644 --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c @@ -150,7 +150,7 @@ xfs_readlink( * when the link count isn't zero and by xfs_dm_punch_hole() when * punching a hole to EOF. */ -STATIC int +int xfs_free_eofblocks( xfs_mount_t *mp, xfs_inode_t *ip, @@ -199,7 +199,7 @@ xfs_free_eofblocks( if (need_iolock) { if (!xfs_ilock_nowait(ip, XFS_IOLOCK_EXCL)) { xfs_trans_cancel(tp, 0); - return 0; + return EAGAIN; } } @@ -462,7 +462,7 @@ xfs_release( return 0; error = xfs_free_eofblocks(mp, ip, true); - if (error) + if (error && error != EAGAIN) return error; /* delalloc blocks after truncation means it really is dirty */ diff --git a/fs/xfs/xfs_vnodeops.h b/fs/xfs/xfs_vnodeops.h index f4e7ec8..97424d4 100644 --- a/fs/xfs/xfs_vnodeops.h +++ b/fs/xfs/xfs_vnodeops.h @@ -78,5 +78,6 @@ int xfs_flush_pages(struct xfs_inode *ip, xfs_off_t first, int xfs_wait_on_pages(struct xfs_inode *ip, xfs_off_t first, xfs_off_t last); int xfs_zero_eof(struct xfs_inode *, xfs_off_t, xfs_fsize_t); +int xfs_free_eofblocks(struct xfs_mount *, struct xfs_inode *, bool); #endif /* _XFS_VNODEOPS_H */ -- 1.7.7.6 From bfoster@redhat.com Mon Sep 10 13:35:47 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8AIZkSW175856 for ; Mon, 10 Sep 2012 13:35:47 -0500 X-ASG-Debug-ID: 1347302210-04bdf0067c54d70001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id E49BFoPfXjD8bbun for ; Mon, 10 Sep 2012 11:36:50 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8AIaoNN006991 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 10 Sep 2012 14:36:50 -0400 Received: from bfoster.bfoster ([10.16.225.83]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q8AIanff018791 for ; Mon, 10 Sep 2012 14:36:50 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 2477F121336; Mon, 10 Sep 2012 14:37:27 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v2 6/8] xfs: add XFS_IOC_FREE_EOFBLOCKS ioctl Date: Mon, 10 Sep 2012 14:37:24 -0400 X-ASG-Orig-Subj: [PATCH v2 6/8] xfs: add XFS_IOC_FREE_EOFBLOCKS ioctl Message-Id: <1347302246-52710-7-git-send-email-bfoster@redhat.com> In-Reply-To: <1347302246-52710-1-git-send-email-bfoster@redhat.com> References: <1347302246-52710-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1347302210 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com The XFS_IOC_FREE_EOFBLOCKS ioctl allows users to invoke an EOFBLOCKS scan. The xfs_eofblocks structure is defined to support the command parameters (scan mode). Signed-off-by: Brian Foster --- fs/xfs/xfs_fs.h | 14 ++++++++++++++ fs/xfs/xfs_ioctl.c | 12 ++++++++++++ 2 files changed, 26 insertions(+), 0 deletions(-) diff --git a/fs/xfs/xfs_fs.h b/fs/xfs/xfs_fs.h index c13fed8..32bb2e8 100644 --- a/fs/xfs/xfs_fs.h +++ b/fs/xfs/xfs_fs.h @@ -339,6 +339,19 @@ typedef struct xfs_error_injection { /* + * Speculative preallocation trimming. + */ +struct xfs_eofblocks { + __u32 eof_flags; + __s32 version; + unsigned char pad[12]; +}; + +/* eof_flags values */ +#define XFS_EOF_FLAGS_FORCE 0x01 /* force/wait mode scan */ + + +/* * The user-level Handle Request interface structure. */ typedef struct xfs_fsop_handlereq { @@ -456,6 +469,7 @@ typedef struct xfs_handle { /* XFS_IOC_GETBIOSIZE ---- deprecated 47 */ #define XFS_IOC_GETBMAPX _IOWR('X', 56, struct getbmap) #define XFS_IOC_ZERO_RANGE _IOW ('X', 57, struct xfs_flock64) +#define XFS_IOC_FREE_EOFBLOCKS _IOR ('X', 58, struct xfs_eofblocks) /* * ioctl commands that replace IRIX syssgi()'s diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index 0e0232c..216ca7a 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -1602,6 +1602,18 @@ xfs_file_ioctl( error = xfs_errortag_clearall(mp, 1); return -error; + case XFS_IOC_FREE_EOFBLOCKS: { + struct xfs_eofblocks eofb; + int flags; + + if (copy_from_user(&eofb, arg, sizeof(eofb))) + return -XFS_ERROR(EFAULT); + + flags = (eofb.eof_flags & XFS_EOF_FLAGS_FORCE) ? SYNC_WAIT : SYNC_TRYLOCK; + error = xfs_inodes_free_eofblocks(mp, flags); + return -error; + } + default: return -ENOTTY; } -- 1.7.7.6 From bfoster@redhat.com Mon Sep 10 13:35:47 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8AIZlGE175859 for ; Mon, 10 Sep 2012 13:35:47 -0500 X-ASG-Debug-ID: 1347302210-04cbb07ce455330001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id jIiUE7FAJTjGmC4o for ; Mon, 10 Sep 2012 11:36:50 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8AIan2x020889 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 10 Sep 2012 14:36:50 -0400 Received: from bfoster.bfoster ([10.16.225.83]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id q8AIanH8026126 for ; Mon, 10 Sep 2012 14:36:49 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id F36F0120614; Mon, 10 Sep 2012 14:37:26 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v2 3/8] xfs: create helper to check whether to free eofblocks on inode Date: Mon, 10 Sep 2012 14:37:21 -0400 X-ASG-Orig-Subj: [PATCH v2 3/8] xfs: create helper to check whether to free eofblocks on inode Message-Id: <1347302246-52710-4-git-send-email-bfoster@redhat.com> In-Reply-To: <1347302246-52710-1-git-send-email-bfoster@redhat.com> References: <1347302246-52710-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1347302210 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com This check is used in multiple places to determine whether we should check for (and potentially free) post EOF blocks on an inode. Add a helper to consolidate the check. Note that when we remove an inode from the cache (xfs_inactive()), we are required to trim post-EOF blocks even if the inode is marked preallocated or append-only to maintain correct space accounting. The 'force' parameter to xfs_can_free_eofblocks() specifies whether we should ignore the prealloc/append-only status of the inode. Signed-off-by: Brian Foster --- fs/xfs/xfs_vnodeops.c | 19 +++++++------------ fs/xfs/xfs_vnodeops.h | 23 ++++++++++++++++++++++- 2 files changed, 29 insertions(+), 13 deletions(-) diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c index d883881..12f5087 100644 --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c @@ -435,11 +435,7 @@ xfs_release( if (ip->i_d.di_nlink == 0) return 0; - if ((S_ISREG(ip->i_d.di_mode) && - (VFS_I(ip)->i_size > 0 || - (VN_CACHED(VFS_I(ip)) > 0 || ip->i_delayed_blks > 0)) && - (ip->i_df.if_flags & XFS_IFEXTENTS)) && - (!(ip->i_d.di_flags & (XFS_DIFLAG_PREALLOC | XFS_DIFLAG_APPEND)))) { + if (xfs_can_free_eofblocks(ip, false)) { /* * If we can't get the iolock just skip truncating the blocks @@ -515,13 +511,12 @@ xfs_inactive( goto out; if (ip->i_d.di_nlink != 0) { - if ((S_ISREG(ip->i_d.di_mode) && - (VFS_I(ip)->i_size > 0 || - (VN_CACHED(VFS_I(ip)) > 0 || ip->i_delayed_blks > 0)) && - (ip->i_df.if_flags & XFS_IFEXTENTS) && - (!(ip->i_d.di_flags & - (XFS_DIFLAG_PREALLOC | XFS_DIFLAG_APPEND)) || - ip->i_delayed_blks != 0))) { + /* + * force is true because we are evicting an inode from the + * cache. Post-eof blocks must be freed, lest we end up with + * broken free space accounting. + */ + if (xfs_can_free_eofblocks(ip, true)) { error = xfs_free_eofblocks(mp, ip, false); if (error) return VN_INACTIVE_CACHE; diff --git a/fs/xfs/xfs_vnodeops.h b/fs/xfs/xfs_vnodeops.h index 447e146..f4e7ec8 100644 --- a/fs/xfs/xfs_vnodeops.h +++ b/fs/xfs/xfs_vnodeops.h @@ -1,6 +1,10 @@ #ifndef _XFS_VNODEOPS_H #define _XFS_VNODEOPS_H 1 +#include "xfs_bmap_btree.h" +#include "xfs_dinode.h" +#include "xfs_inode.h" + struct attrlist_cursor_kern; struct file; struct iattr; @@ -9,8 +13,25 @@ struct iovec; struct kiocb; struct pipe_inode_info; struct uio; -struct xfs_inode; +/* + * Test whether it is appropriate to check an inode for and free post EOF + * blocks. The 'force' parameter determines whether we should also consider + * regular files that are marked preallocated or append-only. + */ +static inline bool +xfs_can_free_eofblocks(struct xfs_inode *ip, bool force) +{ + if (S_ISREG(ip->i_d.di_mode) && + (VFS_I(ip)->i_size > 0 || + (VN_CACHED(VFS_I(ip)) > 0 || ip->i_delayed_blks > 0)) && + (ip->i_df.if_flags & XFS_IFEXTENTS) && + (!(ip->i_d.di_flags & (XFS_DIFLAG_PREALLOC | XFS_DIFLAG_APPEND)) || + (force && ip->i_delayed_blks != 0))) + return true; + + return false; +} int xfs_setattr_nonsize(struct xfs_inode *ip, struct iattr *vap, int flags); int xfs_setattr_size(struct xfs_inode *ip, struct iattr *vap, int flags); -- 1.7.7.6 From bfoster@redhat.com Mon Sep 10 13:35:47 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8AIZllW175864 for ; Mon, 10 Sep 2012 13:35:47 -0500 X-ASG-Debug-ID: 1347302210-04cb6c568651fd0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id NJn1VQ7uNEaQynvG for ; Mon, 10 Sep 2012 11:36:50 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8AIao5N020898 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 10 Sep 2012 14:36:50 -0400 Received: from bfoster.bfoster ([10.16.225.83]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q8AIaoP0011527 for ; Mon, 10 Sep 2012 14:36:50 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 41D29121337; Mon, 10 Sep 2012 14:37:27 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v2 7/8] xfs: add enhanced filtering to EOFBLOCKS scan Date: Mon, 10 Sep 2012 14:37:25 -0400 X-ASG-Orig-Subj: [PATCH v2 7/8] xfs: add enhanced filtering to EOFBLOCKS scan Message-Id: <1347302246-52710-8-git-send-email-bfoster@redhat.com> In-Reply-To: <1347302246-52710-1-git-send-email-bfoster@redhat.com> References: <1347302246-52710-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1347302210 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com Support EOFBLOCKS scan filtering by quota ID or minimum file size. Add the appropriate fields/flags to the xfs_eofblocks structure and pass it down to xfs_inode_free_eofblocks() where filtering functionality is implemented. A (user requested) quota ID based scan requires the associated quota mode be enabled. The best-effort scan logic is enhanced to skip inodes with a dirty cache (i.e., recently updated). Signed-off-by: Brian Foster --- NOTE: On quick review, I think I should have included the dirty cache bit in xfs_inode_free_eofblocks() in the core scan functionality rather than as an add-on. I will plan to do so in the subsequent respin. Brian fs/xfs/xfs_fs.h | 9 +++++++++ fs/xfs/xfs_ioctl.c | 10 +++++++++- fs/xfs/xfs_sync.c | 30 ++++++++++++++++++++++++++++-- fs/xfs/xfs_sync.h | 2 +- 4 files changed, 47 insertions(+), 4 deletions(-) diff --git a/fs/xfs/xfs_fs.h b/fs/xfs/xfs_fs.h index 32bb2e8..54c0f39 100644 --- a/fs/xfs/xfs_fs.h +++ b/fs/xfs/xfs_fs.h @@ -343,12 +343,21 @@ typedef struct xfs_error_injection { */ struct xfs_eofblocks { __u32 eof_flags; + __u32 eof_id; + __u64 eof_min_file_size; __s32 version; unsigned char pad[12]; }; /* eof_flags values */ #define XFS_EOF_FLAGS_FORCE 0x01 /* force/wait mode scan */ +#define XFS_EOF_FLAGS_USRID 0x02 /* filter by user id */ +#define XFS_EOF_FLAGS_GRPID 0x04 /* filter by group id */ +#define XFS_EOF_FLAGS_PROJID 0x08 /* filter by project id */ +#define XFS_EOF_FLAGS_MINFILESIZE 0x10 /* minimum file size */ + +#define XFS_EOF_VALID_QUOTA (XFS_EOF_FLAGS_USRID|XFS_EOF_FLAGS_GRPID| \ + XFS_EOF_FLAGS_PROJID) /* diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index 216ca7a..a7bf847 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -1609,8 +1609,16 @@ xfs_file_ioctl( if (copy_from_user(&eofb, arg, sizeof(eofb))) return -XFS_ERROR(EFAULT); + if (((eofb.eof_flags & XFS_EOF_FLAGS_USRID) && + !XFS_IS_UQUOTA_ON(mp)) || + ((eofb.eof_flags & XFS_EOF_FLAGS_GRPID) && + !XFS_IS_GQUOTA_ON(mp)) || + ((eofb.eof_flags & XFS_EOF_FLAGS_PROJID) && + !XFS_IS_PQUOTA_ON(mp))) + return -XFS_ERROR(EINVAL); + flags = (eofb.eof_flags & XFS_EOF_FLAGS_FORCE) ? SYNC_WAIT : SYNC_TRYLOCK; - error = xfs_inodes_free_eofblocks(mp, flags); + error = xfs_inodes_free_eofblocks(mp, flags, &eofb); return -error; } diff --git a/fs/xfs/xfs_sync.c b/fs/xfs/xfs_sync.c index a248a52..13cd9da 100644 --- a/fs/xfs/xfs_sync.c +++ b/fs/xfs/xfs_sync.c @@ -1015,6 +1015,21 @@ xfs_reclaim_inodes_count( } STATIC int +xfs_inode_match_quota_id( + struct xfs_inode *ip, + struct xfs_eofblocks *eofb) +{ + if (eofb->eof_flags & XFS_EOF_FLAGS_USRID) + return ip->i_d.di_uid == eofb->eof_id; + else if (eofb->eof_flags & XFS_EOF_FLAGS_GRPID) + return ip->i_d.di_gid == eofb->eof_id; + else if (eofb->eof_flags & XFS_EOF_FLAGS_PROJID) + return xfs_get_projid(ip) == eofb->eof_id; + + return 0; +} + +STATIC int xfs_inode_free_eofblocks( struct xfs_inode *ip, struct xfs_perag *pag, @@ -1022,6 +1037,7 @@ xfs_inode_free_eofblocks( void *args) { int ret; + struct xfs_eofblocks *eofb = args; bool force = flags & SYNC_WAIT; if (!xfs_can_free_eofblocks(ip, false)) { @@ -1031,6 +1047,15 @@ xfs_inode_free_eofblocks( return 0; } + if ((eofb && + (((eofb->eof_flags & XFS_EOF_VALID_QUOTA) && + !xfs_inode_match_quota_id(ip, eofb)) || + ((eofb->eof_flags & XFS_EOF_FLAGS_MINFILESIZE) && + (XFS_ISIZE(ip) < eofb->eof_min_file_size)))) || + (!force && mapping_tagged(VFS_I(ip)->i_mapping, + PAGECACHE_TAG_DIRTY))) + return 0; + ret = xfs_free_eofblocks(ip->i_mount, ip, false); /* ignore EAGAIN on a best effort scan */ @@ -1043,11 +1068,12 @@ xfs_inode_free_eofblocks( int xfs_inodes_free_eofblocks( struct xfs_mount *mp, - int flags) + int flags, + struct xfs_eofblocks *eofb) { ASSERT((flags & ~(SYNC_TRYLOCK|SYNC_WAIT)) == 0); return xfs_inode_ag_iterator_tag(mp, xfs_inode_free_eofblocks, flags, - NULL, XFS_ICI_EOFBLOCKS_TAG); + eofb, XFS_ICI_EOFBLOCKS_TAG); } void diff --git a/fs/xfs/xfs_sync.h b/fs/xfs/xfs_sync.h index 307654a..167f06c 100644 --- a/fs/xfs/xfs_sync.h +++ b/fs/xfs/xfs_sync.h @@ -45,7 +45,7 @@ void __xfs_inode_clear_reclaim_tag(struct xfs_mount *mp, struct xfs_perag *pag, void xfs_inode_set_eofblocks_tag(struct xfs_inode *ip); void xfs_inode_clear_eofblocks_tag(struct xfs_inode *ip); -int xfs_inodes_free_eofblocks(struct xfs_mount *, int); +int xfs_inodes_free_eofblocks(struct xfs_mount *, int, struct xfs_eofblocks *); int xfs_sync_inode_grab(struct xfs_inode *ip); int xfs_inode_ag_iterator(struct xfs_mount *mp, -- 1.7.7.6 From bfoster@redhat.com Mon Sep 10 13:35:47 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8AIZk8J175854 for ; Mon, 10 Sep 2012 13:35:47 -0500 X-ASG-Debug-ID: 1347302209-04bdf0067f54d70001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id DOKt7pEPZzcBm8Al for ; Mon, 10 Sep 2012 11:36:50 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8AIanTY021265 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 10 Sep 2012 14:36:49 -0400 Received: from bfoster.bfoster ([10.16.225.83]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q8AIan4n011516 for ; Mon, 10 Sep 2012 14:36:49 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id A7B03120613; Mon, 10 Sep 2012 14:37:26 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v2 0/8] speculative preallocation inode tracking Date: Mon, 10 Sep 2012 14:37:18 -0400 X-ASG-Orig-Subj: [PATCH v2 0/8] speculative preallocation inode tracking Message-Id: <1347302246-52710-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1347302210 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com Hi all, This is v2 of the speculative preallocation inode tracking patchset. This functionality tracks inodes with post-EOF speculative preallocation for the purpose of background and on-demand trimming. Background scanning occurs on a longish interval (5 minutes by default) and in a best-effort mode (i.e., inodes are skipped due to lock contention or dirty cache). The intent is to clear up post-EOF blocks on inodes that might have allocations hanging around due to open-write-close sequences (NFS). On demand scanning is provided via a new ioctl and supports various parameters such as scan mode, filtering by quota id and minimum file size. A pending use case for on demand scanning is for accurate quota accounting via the gluster scale out filesystem (i.e., to free up preallocated space when near a usage limit). Brian v2: - Remove unnecessary inode flag clear helper. - Condense eofblocks set/clear tag functions. - Move clear tag call into xfs_free_eofblocks(). - Modify AG walk infrastructure to support tag-based walk and utilize this functionality for the eofblocks scan (as opposed to the previous code duplicated from reclaim scanning). - Improve ioctl functionality: new data structure fields/flags, validate quota is enabled. - Increase default background scanning interval to 5 minutes, add tunable. Brian Foster (8): xfs: add EOFBLOCKS inode tagging/untagging xfs: support a tag-based inode_ag_iterator xfs: create helper to check whether to free eofblocks on inode xfs: export xfs_free_eofblocks() and return EAGAIN on trylock failure xfs: create function to scan and clear EOFBLOCKS inodes xfs: add XFS_IOC_FREE_EOFBLOCKS ioctl xfs: add enhanced filtering to EOFBLOCKS scan xfs: add background scanning to clear EOFBLOCKS inodes fs/xfs/xfs_ag.h | 1 + fs/xfs/xfs_fs.h | 23 +++++ fs/xfs/xfs_globals.c | 1 + fs/xfs/xfs_ioctl.c | 20 ++++ fs/xfs/xfs_iomap.c | 7 ++ fs/xfs/xfs_iops.c | 3 + fs/xfs/xfs_linux.h | 1 + fs/xfs/xfs_mount.h | 2 + fs/xfs/xfs_qm_syscalls.c | 5 +- fs/xfs/xfs_sync.c | 215 ++++++++++++++++++++++++++++++++++++++++++++-- fs/xfs/xfs_sync.h | 11 ++- fs/xfs/xfs_sysctl.c | 9 ++ fs/xfs/xfs_sysctl.h | 1 + fs/xfs/xfs_trace.h | 6 ++ fs/xfs/xfs_vnodeops.c | 27 +++--- fs/xfs/xfs_vnodeops.h | 24 +++++- 16 files changed, 327 insertions(+), 29 deletions(-) -- 1.7.7.6 From magazine@ns382539.ovh.net Mon Sep 10 17:37:36 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.8 required=5.0 tests=BAYES_80,FREEMAIL_FROM, J_CHICKENPOX_42,J_CHICKENPOX_63,J_CHICKENPOX_72,SUBJ_ALL_CAPS, T_TO_NO_BRKTS_FREEMAIL autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8AMbarC228729 for ; Mon, 10 Sep 2012 17:37:36 -0500 X-ASG-Debug-ID: 1347316717-04cb6c56885ee20001-NocioJ Received: from ns382539.ovh.net (ns382539.ovh.net [46.105.100.74]) by cuda.sgi.com with ESMTP id 3dBKCK5u7RFcqAuu (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 10 Sep 2012 15:38:39 -0700 (PDT) X-Barracuda-Envelope-From: magazine@ns382539.ovh.net X-Barracuda-Apparent-Source-IP: 46.105.100.74 Received: from magazine by ns382539.ovh.net with local (Exim 4.77) (envelope-from ) id 1TBCcl-0001Cu-Qu for xfs@oss.sgi.com; Mon, 10 Sep 2012 22:38:35 +0000 To: xfs@oss.sgi.com Subject: PURCHASING REQUEST From: SHARPLES GROUP LTD X-ASG-Orig-Subj: PURCHASING REQUEST Reply-To: sharplessgroup@aol.com MIME-Version: 1.0 Content-Type: text/plain Content-Transfer-Encoding: 8bit Message-Id: Date: Mon, 10 Sep 2012 22:38:35 +0000 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - ns382539.ovh.net X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [513 511] / [47 12] X-AntiAbuse: Sender Address Domain - ns382539.ovh.net X-Barracuda-Connect: ns382539.ovh.net[46.105.100.74] X-Barracuda-Start-Time: 1347316718 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108191 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hello, I Am Mr Marcus Wellington the CEO of Sharples Group based in Manilla Philippines and we have our procurement service also in the United Kingdom,we are a major supplier of general merchandise to indigenous stores and companys in the Philippines and the Philipinos prefer purchasing goods brought from other continent because of the low production quality of merchandise in the country and that is the major reason why we have decided to source outside of the continent to help our peoples needs. We are will to purchase some products from your Store/Company which is of interest.We came about your company contact via the Internet Service Provider (ISP) directory and we decided to forward a request for purchasing.We will be glad if you could grant our Purchase Request,by so doing kindly get back to us with your Website address or contact person(who will be in the best position to handle our services) so we could look up the goods you stock or can supply us with,so we can advice back with goods needed for purchasing. All goods will be needed in our Head Office in the Philippines and shipping to the Philippines will be handled by a preffered Freight company of our choice who will arrange collection from your location and have goods sent to us via Airfreight on a reasonable price rate. As soon as the goods have been fully paid for by us and confirmed ready for collection by you.The preffered freight company is a global shipping company that as affiliate all around the globe for their shipment. So you dont have to worry about shipping and we will advice you with the contact details of the shipping company when needed. Also our payment term will be by a valid Visa/Master Credit Card which is registered to a United Kingdom Address because that is where our procurement office is situated. I await your prompt and expeditious handling on this purchase request. Yours Sincerely Marcus Wellignton C.E.O/OWNER SHARPLES GROUP LTD 188 Espana Blvd. Sampaloc. Manila Metro Manila Philippines Tel:(0923) 567-9872 Email:sharplessgroup@aol.com From sandeen@sandeen.net Mon Sep 10 21:22:59 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8B2Mxa1256294 for ; Mon, 10 Sep 2012 21:22:59 -0500 X-ASG-Debug-ID: 1347330242-04cb6c56886a270001-NocioJ Received: from mail.sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id mmuWKEWIKDEj0nm5 for ; Mon, 10 Sep 2012 19:24:02 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) (Authenticated sender: sandeen) by mail.sandeen.net (Postfix) with ESMTP id 8F7E44943543; Mon, 10 Sep 2012 21:24:02 -0500 (CDT) Message-ID: <504EA0C2.2060601@sandeen.net> Date: Mon, 10 Sep 2012 21:24:02 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20120824 Thunderbird/15.0 MIME-Version: 1.0 To: Tao Ma CC: xfs@oss.sgi.com Subject: Re: [PATCH] xfstests: make 275 xfs specific. References: <1336230429-2939-1-git-send-email-tm@tao.ma> <20120505233744.GE25351@dastard> <4FA692B7.9040006@tao.ma> <504A511A.8090209@sandeen.net> X-ASG-Orig-Subj: Re: [PATCH] xfstests: make 275 xfs specific. In-Reply-To: <504A511A.8090209@sandeen.net> X-Enigmail-Version: 1.4.4 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1347330242 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108205 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 9/7/12 2:55 PM, Eric Sandeen wrote: > On 5/6/12 10:03 AM, Tao Ma wrote: >> On 05/06/2012 07:37 AM, Dave Chinner wrote: >>> On Sat, May 05, 2012 at 11:07:09PM +0800, Tao Ma wrote: >>>> From: Tao Ma >>>> >>>> In my test with ext4, 275 can't pass because ext4 >>>> can create a 8k file in the end not like what xfs >>>> does. So make this test case xfs only for now. >>> >>> It's not an XFS specific test - it's a test that is supposed to test >>> POSIX write behaviour. i.e. if the filesystem is full, and then you >>> free 4k of space, then an 8k write should only be able to write 4k, >>> yes? >> Yes, but it doesn't work as expected for ext4. > > Came across this thread again. I had patches on the list a while ago > to fix it up. > > [PATCH V2] xfstests: make 275 pass > > But it never got fully reviewed or merged. :( It's reviewed & merged now. Does it fix things for you? (I hope?) -Eric > -Eric > >>> So doesn't a failure on ext4 indicate that there's something wrong >>> with ext4 (either it's ENOSPC detection or the short write >>> handling), not the test? >> Actually in my test, ext4 can create the file with 8K file size, not a >> short write. I haven't looked into it yet. But AFAICS, if we have an >> ext4 volume with 8k cluster size, a 4k file can occupy a 8k cluster and >> the final write of 8k will succeed instead of the short write. >> >> Thanks >> Tao >> >> _______________________________________________ >> xfs mailing list >> xfs@oss.sgi.com >> http://oss.sgi.com/mailman/listinfo/xfs >> > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From sandeen@sandeen.net Mon Sep 10 21:46:01 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=BAYES_00, TVD_SUBJ_NUM_OBFU_MINFP autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8B2k1xD259292 for ; Mon, 10 Sep 2012 21:46:01 -0500 X-ASG-Debug-ID: 1347331623-04cb6c56856b170001-NocioJ Received: from mail.sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id AcA9W5I9Fzeu09jd for ; Mon, 10 Sep 2012 19:47:03 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) (Authenticated sender: sandeen) by mail.sandeen.net (Postfix) with ESMTP id B71344943543; Mon, 10 Sep 2012 21:47:03 -0500 (CDT) Message-ID: <504EA627.2050906@sandeen.net> Date: Mon, 10 Sep 2012 21:47:03 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20120824 Thunderbird/15.0 MIME-Version: 1.0 To: Boris Ranto CC: xfs-oss Subject: Re: [PATCH v3] Add test case to test xfs projid32bit functionality a bit more extensively. References: X-ASG-Orig-Subj: Re: [PATCH v3] Add test case to test xfs projid32bit functionality a bit more extensively. In-Reply-To: X-Enigmail-Version: 1.4.4 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1347331623 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108205 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 9/6/12 10:23 AM, Boris Ranto wrote: > The test covers several areas including enabling projid32bit > functionality dynamically by xfs_admin, dumping, restoring, quota > reporting and xfs_db projid values reporting. > This test case hits a bug with xfsdump/xfsrestore process on a > projid32bit enabled filesystem. > > Signed-off-by: Boris Ranto there are just a couple things below, but I think we can get it checked in unless Dave has further concerns - please see below. > --- > 285 | 144 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > 285.out | 23 ++++++++++ > group | 1 + > 3 files changed, 168 insertions(+), 0 deletions(-) > create mode 100644 285 > create mode 100644 285.out > > diff --git a/285 b/285 > new file mode 100644 > index 0000000..a1e497d > --- /dev/null > +++ b/285 > @@ -0,0 +1,144 @@ > +#! /bin/bash > +# FS QA Test No. 285 > +# > +# Test to verify project quota xfs_admin, xfsdump/xfsrestore and > +# xfs_db functionality > +# > +#----------------------------------------------------------------------- > +# Copyright (c) 2012 Red Hat, Inc. All Rights Reserved. > +# > +# This program is free software; you can redistribute it and/or > +# modify it under the terms of the GNU General Public License as > +# published by the Free Software Foundation. > +# > +# This program is distributed in the hope that it would be useful, > +# but WITHOUT ANY WARRANTY; without even the implied warranty of > +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > +# GNU General Public License for more details. > +# > +# You should have received a copy of the GNU General Public License > +# along with this program; if not, write the Free Software Foundation, > +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > +# > +#----------------------------------------------------------------------- > +# > +# creator > +owner=ranto.boris@gmail.com > + > +seq=`basename $0` > +echo "QA output created by $seq" > +tmp=/tmp/$$ > +here=`pwd` > +status=1 # failure is the default! > +trap "_cleanup; exit \$status" 0 1 2 3 15 > +rm -f $seq.full > + > +# get standard environment, filters and checks > +. ./common.rc > +. ./common.quota > + > +_cleanup() > +{ > + cd / > + umount $SCRATCH_MNT 2>/dev/null > + rm -rf $tmp.* > +} > + > +_print_projid() > +{ > + $XFS_DB_PROG -c "inode $1" \ > + -c "print core.projid_lo" \ > + -c "print core.projid_hi" \ > + $SCRATCH_DEV > +} > + > +# real QA test starts here > +_supported_fs xfs > +_require_xfs_quota > +_require_scratch > +_require_projid32bit > + > +# create xfs fs without projid32bit ability, will be gained by xfs_admin > +_scratch_mkfs_xfs -i projid32bit=0 -d size=200m >> $seq.full \ > + || _fail "mkfs failed" > +_qmount_option "pquota" > +_qmount > +# require project quotas > +_require_prjquota $SCRATCH_DEV > + > +dir=$SCRATCH_MNT/pquota > + > +status=1 > + > +mkdir -p $dir > +touch $dir/{16,32}less Although I understand it ok, I might add a comment here saying: # create files to hold 16 and 32-bit project IDs In retrospect I might use 16bit and 32bit to make more sense. Sorry, should have suggested that earlier. I could just change the names on checkin with a note if that's ok with you. > +inode16a=$(ls -i $dir/16less|cut -d ' ' -f 1) > +inode32a=$(ls -i $dir/32less|cut -d ' ' -f 1) > +$XFS_QUOTA_PROG -x -c "project -s -p $dir/16less 1234" $SCRATCH_DEV \ > + >> $seq.full > +$XFS_QUOTA_PROG -x -c "project -s -p $dir/32less 2123456789" $SCRATCH_DEV \ > + >> $seq.full 2>&1 It's a little weird to set project quota on a regular file, but I guess it works, so I guess it's ok. :) So with those caveats I can do: Reviewed-by: Eric Sandeen and unless Dave has further comments I'll check it in in a bit. Thanks, -Eric > + > +echo "No 32bit project quotas:" > +$XFS_IO_PROG -r -c "lsproj" $dir/16less > +$XFS_IO_PROG -r -c "lsproj" $dir/32less > + > +umount $SCRATCH_MNT > + > +# Now, enable projid32bit support by xfs_admin > +xfs_admin -p $SCRATCH_DEV >> $seq.full 2>&1 || _fail "xfs_admin failed" > + > +# Now mount the fs, 32bit project quotas shall be supported, now > +_qmount_option "pquota" > +_qmount > +$XFS_QUOTA_PROG -x -c "project -s -p $dir/32less 2123456789" $SCRATCH_DEV \ > + >> $seq.full > + > +# These will be checked by $seq.out > +echo "With 32bit project quota support:" > +$XFS_IO_PROG -r -c "lsproj" $dir/16less > +$XFS_IO_PROG -r -c "lsproj" $dir/32less > + > +# Dump the fs to a temporary file > +rm -f $tmp.dump.img > +$XFSDUMP_PROG -f $tmp.dump -L label -M media -l 0 $SCRATCH_MNT >> $seq.full \ > + || _fail "dump failed" > + > +# Prepare the device to restore the dumped file system > +restore_dir=$SCRATCH_MNT/restore/pquota > + > +# Just make the restore dir, the pquota dir will be created by xfsrestore > +mkdir -p $SCRATCH_MNT/restore > + > +# Restore > +$XFSRESTORE_PROG -f $tmp.dump $SCRATCH_MNT/restore >> $seq.full 2>&1 \ > + || _fail "xfsrestore failed" > + > +# Check that they are the same > +diff -urpN $SCRATCH_MNT/{,restore}/pquota || _fail "diff failed" > + > +touch $restore_dir/32lessv2 > +inode16b=$(ls -i $restore_dir/16less|cut -d ' ' -f 1) > +inode32b=$(ls -i $restore_dir/32less|cut -d ' ' -f 1) > +inode32v2=$(ls -i $restore_dir/32lessv2|cut -d ' ' -f 1) > +$XFS_QUOTA_PROG -x -c "project -s -p $restore_dir/32lessv2 2123456789" \ > + $SCRATCH_MNT >> $seq.full > +echo "The restored file system + one additional file:" > +$XFS_IO_PROG -r -c "lsproj" $restore_dir/16less > +$XFS_IO_PROG -r -c "lsproj" $restore_dir/32less > +$XFS_IO_PROG -r -c "lsproj" $restore_dir/32lessv2 > + > +umount $SCRATCH_MNT > + > +# Now, we can examine the file systems with xfs_db > +echo "These two values of 16bit project quota ids shall be the same" > +_print_projid $inode16a > +_print_projid $inode16b > + > +echo "These three values of 32bit project quota ids shall be the same" > +_print_projid $inode32b > +_print_projid $inode32a > +_print_projid $inode32v2 > + > +status=0 > +exit > diff --git a/285.out b/285.out > new file mode 100644 > index 0000000..e5cc325 > --- /dev/null > +++ b/285.out > @@ -0,0 +1,23 @@ > +QA output created by 285 > +No 32bit project quotas: > +projid = 1234 > +projid = 0 > +With 32bit project quota support: > +projid = 1234 > +projid = 2123456789 > +The restored file system + one additional file: > +projid = 1234 > +projid = 2123456789 > +projid = 2123456789 > +These two values of 16bit project quota ids shall be the same > +core.projid_lo = 1234 > +core.projid_hi = 0 > +core.projid_lo = 1234 > +core.projid_hi = 0 > +These three values of 32bit project quota ids shall be the same > +core.projid_lo = 24853 > +core.projid_hi = 32401 > +core.projid_lo = 24853 > +core.projid_hi = 32401 > +core.projid_lo = 24853 > +core.projid_hi = 32401 > diff --git a/group b/group > index 104ed35..bbc74fe 100644 > --- a/group > +++ b/group > @@ -403,3 +403,4 @@ deprecated > 282 dump ioctl auto quick > 283 dump ioctl auto quick > 284 auto > +285 auto dump quota > From sandeen@sandeen.net Mon Sep 10 22:09:52 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=BAYES_00, TVD_SUBJ_NUM_OBFU_MINFP autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8B39qeS262008 for ; Mon, 10 Sep 2012 22:09:52 -0500 X-ASG-Debug-ID: 1347333055-04cbb07ce46dbb0001-NocioJ Received: from mail.sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id g6lGJCprHcUCKKvg for ; Mon, 10 Sep 2012 20:10:55 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) (Authenticated sender: sandeen) by mail.sandeen.net (Postfix) with ESMTP id 74C9C4943543; Mon, 10 Sep 2012 22:10:55 -0500 (CDT) Message-ID: <504EABBF.3080008@sandeen.net> Date: Mon, 10 Sep 2012 22:10:55 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20120824 Thunderbird/15.0 MIME-Version: 1.0 To: Boris Ranto CC: xfs-oss Subject: Re: [PATCH v3] Add test case to test xfs projid32bit functionality a bit more extensively. References: <504EA627.2050906@sandeen.net> X-ASG-Orig-Subj: Re: [PATCH v3] Add test case to test xfs projid32bit functionality a bit more extensively. In-Reply-To: <504EA627.2050906@sandeen.net> X-Enigmail-Version: 1.4.4 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1347333055 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108207 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 9/10/12 9:47 PM, Eric Sandeen wrote: > On 9/6/12 10:23 AM, Boris Ranto wrote: >> The test covers several areas including enabling projid32bit >> functionality dynamically by xfs_admin, dumping, restoring, quota >> reporting and xfs_db projid values reporting. >> This test case hits a bug with xfsdump/xfsrestore process on a >> projid32bit enabled filesystem. >> >> Signed-off-by: Boris Ranto > > there are just a couple things below, but I think we can get it > checked in unless Dave has further concerns - please see below. > >> --- >> 285 | 144 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ >> 285.out | 23 ++++++++++ >> group | 1 + >> 3 files changed, 168 insertions(+), 0 deletions(-) >> create mode 100644 285 >> create mode 100644 285.out >> >> diff --git a/285 b/285 >> new file mode 100644 >> index 0000000..a1e497d >> --- /dev/null >> +++ b/285 >> @@ -0,0 +1,144 @@ >> +#! /bin/bash >> +# FS QA Test No. 285 >> +# >> +# Test to verify project quota xfs_admin, xfsdump/xfsrestore and >> +# xfs_db functionality >> +# >> +#----------------------------------------------------------------------- >> +# Copyright (c) 2012 Red Hat, Inc. All Rights Reserved. >> +# >> +# This program is free software; you can redistribute it and/or >> +# modify it under the terms of the GNU General Public License as >> +# published by the Free Software Foundation. >> +# >> +# This program is distributed in the hope that it would be useful, >> +# but WITHOUT ANY WARRANTY; without even the implied warranty of >> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the >> +# GNU General Public License for more details. >> +# >> +# You should have received a copy of the GNU General Public License >> +# along with this program; if not, write the Free Software Foundation, >> +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA >> +# >> +#----------------------------------------------------------------------- >> +# >> +# creator >> +owner=ranto.boris@gmail.com >> + >> +seq=`basename $0` >> +echo "QA output created by $seq" >> +tmp=/tmp/$$ >> +here=`pwd` >> +status=1 # failure is the default! >> +trap "_cleanup; exit \$status" 0 1 2 3 15 >> +rm -f $seq.full >> + >> +# get standard environment, filters and checks >> +. ./common.rc >> +. ./common.quota >> + >> +_cleanup() >> +{ >> + cd / >> + umount $SCRATCH_MNT 2>/dev/null >> + rm -rf $tmp.* >> +} >> + >> +_print_projid() >> +{ >> + $XFS_DB_PROG -c "inode $1" \ >> + -c "print core.projid_lo" \ >> + -c "print core.projid_hi" \ >> + $SCRATCH_DEV >> +} >> + >> +# real QA test starts here >> +_supported_fs xfs >> +_require_xfs_quota >> +_require_scratch >> +_require_projid32bit >> + >> +# create xfs fs without projid32bit ability, will be gained by xfs_admin >> +_scratch_mkfs_xfs -i projid32bit=0 -d size=200m >> $seq.full \ >> + || _fail "mkfs failed" >> +_qmount_option "pquota" >> +_qmount >> +# require project quotas >> +_require_prjquota $SCRATCH_DEV >> + >> +dir=$SCRATCH_MNT/pquota >> + >> +status=1 >> + >> +mkdir -p $dir >> +touch $dir/{16,32}less > > Although I understand it ok, I might add a comment here saying: > > # create files to hold 16 and 32-bit project IDs > > In retrospect I might use 16bit and 32bit to make more sense. > Sorry, should have suggested that earlier. > > I could just change the names on checkin with a note if that's ok with you. > >> +inode16a=$(ls -i $dir/16less|cut -d ' ' -f 1) >> +inode32a=$(ls -i $dir/32less|cut -d ' ' -f 1) >> +$XFS_QUOTA_PROG -x -c "project -s -p $dir/16less 1234" $SCRATCH_DEV \ >> + >> $seq.full >> +$XFS_QUOTA_PROG -x -c "project -s -p $dir/32less 2123456789" $SCRATCH_DEV \ >> + >> $seq.full 2>&1 > > It's a little weird to set project quota on a regular file, but I guess it works, > so I guess it's ok. :) I take it back, Dave explained why this makes sense, inheritance from a dir isn't the only way to assign a quota to a project.... > So with those caveats I can do: > > Reviewed-by: Eric Sandeen > > and unless Dave has further comments I'll check it in in a bit. > > Thanks, > -Eric > From david@fromorbit.com Mon Sep 10 22:44:11 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=BAYES_00, TVD_SUBJ_NUM_OBFU_MINFP autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8B3iB3V005630 for ; Mon, 10 Sep 2012 22:44:11 -0500 X-ASG-Debug-ID: 1347335113-04cbb07ce36f260001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id AORYEHo54uLActOL for ; Mon, 10 Sep 2012 20:45:14 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AiAKAJCyTlB5LaFX/2dsb2JhbABFhR61LAOBCoEIgiABAQU6HCMQCAMYLhQNGAMhE4d+Aw6ySw2JUxSKFWMcVoRkYAOUCIFUixaFCIJ4gUk Received: from ppp121-45-161-87.lns20.syd6.internode.on.net (HELO dastard) ([121.45.161.87]) by ipmail07.adl2.internode.on.net with ESMTP; 11 Sep 2012 13:15:11 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TBHPS-0005nr-4d; Tue, 11 Sep 2012 13:45:10 +1000 Date: Tue, 11 Sep 2012 13:45:10 +1000 From: Dave Chinner To: Eric Sandeen Cc: Boris Ranto , xfs-oss Subject: Re: [PATCH v3] Add test case to test xfs projid32bit functionality a bit more extensively. Message-ID: <20120911034510.GA11511@dastard> X-ASG-Orig-Subj: Re: [PATCH v3] Add test case to test xfs projid32bit functionality a bit more extensively. References: <504EA627.2050906@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <504EA627.2050906@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1347335113 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108209 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Sep 10, 2012 at 09:47:03PM -0500, Eric Sandeen wrote: > On 9/6/12 10:23 AM, Boris Ranto wrote: > > The test covers several areas including enabling projid32bit > > functionality dynamically by xfs_admin, dumping, restoring, quota > > reporting and xfs_db projid values reporting. > > This test case hits a bug with xfsdump/xfsrestore process on a > > projid32bit enabled filesystem. > > > > Signed-off-by: Boris Ranto > > there are just a couple things below, but I think we can get it > checked in unless Dave has further concerns - please see below. .... > > +dir=$SCRATCH_MNT/pquota > > + > > +status=1 > > + > > +mkdir -p $dir > > +touch $dir/{16,32}less > > Although I understand it ok, I might add a comment here saying: > > # create files to hold 16 and 32-bit project IDs > > In retrospect I might use 16bit and 32bit to make more sense. > Sorry, should have suggested that earlier. > > I could just change the names on checkin with a note if that's ok with you. With that change to 16bit/32bit, it's fine by me. > > @@ -403,3 +403,4 @@ deprecated > > 282 dump ioctl auto quick > > 283 dump ioctl auto quick > > 284 auto > > +285 auto dump quota Like I mentione dfirst time around, it needs to be added to the quick group as well. If you make those changes, Eric, then consider it: Reviewed-by: Dave Chinner Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@sandeen.net Mon Sep 10 22:47:56 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=BAYES_00, TVD_SUBJ_NUM_OBFU_MINFP autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8B3luME006180 for ; Mon, 10 Sep 2012 22:47:56 -0500 X-ASG-Debug-ID: 1347335339-04bdf0067e71b50001-NocioJ Received: from mail.sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id NwiaiWtSY16kT2qh for ; Mon, 10 Sep 2012 20:49:00 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) (Authenticated sender: sandeen) by mail.sandeen.net (Postfix) with ESMTP id 9C9DF4943551; Mon, 10 Sep 2012 22:48:59 -0500 (CDT) Message-ID: <504EB4AB.4050100@sandeen.net> Date: Mon, 10 Sep 2012 22:48:59 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20120824 Thunderbird/15.0 MIME-Version: 1.0 To: Dave Chinner CC: Boris Ranto , xfs-oss Subject: Re: [PATCH v3] Add test case to test xfs projid32bit functionality a bit more extensively. References: <504EA627.2050906@sandeen.net> <20120911034510.GA11511@dastard> X-ASG-Orig-Subj: Re: [PATCH v3] Add test case to test xfs projid32bit functionality a bit more extensively. In-Reply-To: <20120911034510.GA11511@dastard> X-Enigmail-Version: 1.4.4 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1347335339 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108209 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 9/10/12 10:45 PM, Dave Chinner wrote: > On Mon, Sep 10, 2012 at 09:47:03PM -0500, Eric Sandeen wrote: >> On 9/6/12 10:23 AM, Boris Ranto wrote: >>> The test covers several areas including enabling projid32bit >>> functionality dynamically by xfs_admin, dumping, restoring, quota >>> reporting and xfs_db projid values reporting. >>> This test case hits a bug with xfsdump/xfsrestore process on a >>> projid32bit enabled filesystem. >>> >>> Signed-off-by: Boris Ranto >> >> there are just a couple things below, but I think we can get it >> checked in unless Dave has further concerns - please see below. > .... >>> +dir=$SCRATCH_MNT/pquota >>> + >>> +status=1 >>> + >>> +mkdir -p $dir >>> +touch $dir/{16,32}less >> >> Although I understand it ok, I might add a comment here saying: >> >> # create files to hold 16 and 32-bit project IDs >> >> In retrospect I might use 16bit and 32bit to make more sense. >> Sorry, should have suggested that earlier. >> >> I could just change the names on checkin with a note if that's ok with you. > > With that change to 16bit/32bit, it's fine by me. > >>> @@ -403,3 +403,4 @@ deprecated >>> 282 dump ioctl auto quick >>> 283 dump ioctl auto quick >>> 284 auto >>> +285 auto dump quota > > Like I mentione dfirst time around, it needs to be added to the > quick group as well. oops missed that. > If you make those changes, Eric, then consider it: > > Reviewed-by: Dave Chinner I'll fix those up & commit. thanks, -Eric > Cheers, > > Dave. > From david@fromorbit.com Tue Sep 11 00:27:06 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8B5R6hg020767 for ; Tue, 11 Sep 2012 00:27:06 -0500 X-ASG-Debug-ID: 1347341288-04bdf0067c76a70001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id yxDwd8szJv4moqnt for ; Mon, 10 Sep 2012 22:28:08 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AiAKAErLTlB5LaFX/2dsb2JhbABFhR61LAOBCoEIgiABAQUnExwjEAgDDgouFCUDIROID7whFIp4coRkYAOVXJAegng Received: from ppp121-45-161-87.lns20.syd6.internode.on.net (HELO dastard) ([121.45.161.87]) by ipmail07.adl2.internode.on.net with ESMTP; 11 Sep 2012 14:57:45 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TBJ0h-0005yD-Ss; Tue, 11 Sep 2012 15:27:43 +1000 Date: Tue, 11 Sep 2012 15:27:43 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v2 3/8] xfs: create helper to check whether to free eofblocks on inode Message-ID: <20120911052743.GB11511@dastard> X-ASG-Orig-Subj: Re: [PATCH v2 3/8] xfs: create helper to check whether to free eofblocks on inode References: <1347302246-52710-1-git-send-email-bfoster@redhat.com> <1347302246-52710-4-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1347302246-52710-4-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1347341288 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108217 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Mon, Sep 10, 2012 at 02:37:21PM -0400, Brian Foster wrote: > This check is used in multiple places to determine whether we > should check for (and potentially free) post EOF blocks on an > inode. Add a helper to consolidate the check. > > Note that when we remove an inode from the cache (xfs_inactive()), > we are required to trim post-EOF blocks even if the inode is marked > preallocated or append-only to maintain correct space accounting. > The 'force' parameter to xfs_can_free_eofblocks() specifies whether > we should ignore the prealloc/append-only status of the inode. > > Signed-off-by: Brian Foster Just quickly, I'd rewrite this convoluted logic: > +/* > + * Test whether it is appropriate to check an inode for and free post EOF > + * blocks. The 'force' parameter determines whether we should also consider > + * regular files that are marked preallocated or append-only. > + */ > +static inline bool > +xfs_can_free_eofblocks(struct xfs_inode *ip, bool force) > +{ > + if (S_ISREG(ip->i_d.di_mode) && > + (VFS_I(ip)->i_size > 0 || > + (VN_CACHED(VFS_I(ip)) > 0 || ip->i_delayed_blks > 0)) && > + (ip->i_df.if_flags & XFS_IFEXTENTS) && > + (!(ip->i_d.di_flags & (XFS_DIFLAG_PREALLOC | XFS_DIFLAG_APPEND)) || > + (force && ip->i_delayed_blks != 0))) > + return true; > + > + return false; > +} in a manner that can means it no longer has to be analysed from first principles every time it is read. e.g.: static inline bool xfs_can_free_eofblocks(struct xfs_inode *ip, bool force) { /* prealloc/delalloc exists only on regular files */ if (!S_ISREG(ip->i_d.di_mode)) return false; /* * Zero sized files with no cached page or delalloc blocks will not have * any speculative prealloc/delalloc to remove. */ if (VFS_I(ip)->i_size == 0 && VFS_I(ip)->i_mapping->nr_pages == 0 && ip->i_delayed_blks == 0) return false; /* If we haven't read in the extent list, then don't do it now. */ if (!(ip->i_df.if_flags & XFS_IFEXTENTS)) return false; /* * Real preallocation or append only files do not get EOF blocks freed * unless there are also delalloc blocks and we are forced to remove * them. */ if ((ip->i_d.di_flags & (XFS_DIFLAG_PREALLOC | XFS_DIFLAG_APPEND)) { if (!ip->i_delayed_blks) return false; if (!force) return false; } return true; } -- Dave Chinner david@fromorbit.com From difrost.kernel@gmail.com Tue Sep 11 02:46:47 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_DKIM_INVALID,T_TO_NO_BRKTS_FREEMAIL autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8B7kl4u046874 for ; Tue, 11 Sep 2012 02:46:47 -0500 X-ASG-Debug-ID: 1347349669-04bdf0067f7e420001-NocioJ Received: from mail-ee0-f53.google.com (mail-ee0-f53.google.com [74.125.83.53]) by cuda.sgi.com with ESMTP id csM7OeBX2IYR4CwS (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 11 Sep 2012 00:47:50 -0700 (PDT) X-Barracuda-Envelope-From: difrost.kernel@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.83.53 Received: by eekb47 with SMTP id b47so144452eek.26 for ; Tue, 11 Sep 2012 00:47:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:date:message-id:subject:from:to:content-type; bh=X36rZ4SRuPrjY7Fa6bglW7nXKCB4FtL5m4UslWipLZ4=; b=yhjTpfuQEFaZKp9pSj0uCZp6ziG4m+zsJ7GzoYwDZ+pAoIJN/AbXX//tlNH+oFSyuJ 2qCj9uObZsuGqLesddaFF0AIRKyBSzr9ov0pCY1j6lrEX+UCJq+NmJaElajovfE/rgz0 +UGZpK5aI25TlJUvUvxTuL7Gtem67ZCtvQKJiSWXCOAnohXFZHHvHyPB++XfUMhBqHmR bsxPEzlQGbj8u5Gf1TQ+UqmGNXK/Tb+ItzI9Hdb9U1Jy1Bx3gOSBQn3GtyyX6Y2Hecy7 85QOaCXNoex0jUkhcq1MUQ9nHmzUB4P9TCkkKilrYwtAsmHJH5yGJOfaEk+pFqyC2+bJ kQKg== MIME-Version: 1.0 Received: by 10.14.175.7 with SMTP id y7mr23791639eel.29.1347349669425; Tue, 11 Sep 2012 00:47:49 -0700 (PDT) Received: by 10.14.127.12 with HTTP; Tue, 11 Sep 2012 00:47:49 -0700 (PDT) Date: Tue, 11 Sep 2012 09:47:49 +0200 Message-ID: Subject: Internal error xfs_trans_cancel at line 1467 of file fs/xfs/xfs_trans.c From: Jacek Luczak X-ASG-Orig-Subj: Internal error xfs_trans_cancel at line 1467 of file fs/xfs/xfs_trans.c To: xfs@oss.sgi.com Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: mail-ee0-f53.google.com[74.125.83.53] X-Barracuda-Start-Time: 1347349670 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108218 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hi All, got this during heavy IO (parallel checkout of few large projects from SVN): XFS (dm-8): Corruption detected. Unmount and run xfs_repair XFS (dm-8): Internal error xfs_trans_cancel at line 1467 of file fs/xfs/xfs_trans.c. Caller 0xffffffffa03c9974 Pid: 11930, comm: svn Not tainted 3.4.10-1 #1 Call Trace: [] ? xfs_trans_cancel+0x56/0xd7 [xfs] [] ? xfs_create+0x467/0x4cf [xfs] [] ? xfs_vn_mknod+0xcb/0x160 [xfs] [] ? vfs_create+0x6e/0xc7 [] ? do_last+0x3a5/0x745 [] ? path_openat+0xce/0x35f [] ? do_filp_open+0x2c/0x72 [] ? xfs_release+0x1ac/0x1cc [xfs] [] ? alloc_fd+0x69/0xf2 [] ? do_sys_open+0x107/0x18e [] ? system_call_fastpath+0x16/0x1b XFS (dm-8): xfs_do_force_shutdown(0x8) called from line 1468 of file fs/xfs/xfs_trans.c. Return address = 0xffffffffa03f75a4 XFS (dm-8): Corruption of in-memory data detected. Shutting down filesystem XFS (dm-8): Please umount the filesystem and rectify the problem(s) XFS (dm-8): xfs_log_force: error 5 returned. XFS (dm-8): xfs_log_force: error 5 returned. XFS (dm-8): xfs_log_force: error 5 returned. XFS (dm-8): xfs_log_force: error 5 returned. XFS (dm-8): xfs_log_force: error 5 returned. XFS (dm-8): xfs_log_force: error 5 returned. XFS (dm-8): xfs_log_force: error 5 returned. XFS (dm-8): xfs_log_force: error 5 returned. XFS (dm-8): xfs_log_force: error 5 returned. XFS (dm-8): xfs_log_force: error 5 returned. XFS (dm-8): xfs_log_force: error 5 returned. XFS (dm-8): xfs_log_force: error 5 returned. XFS (dm-8): xfs_log_force: error 5 returned. XFS (dm-8): xfs_log_force: error 5 returned. XFS (dm-8): xfs_log_force: error 5 returned. XFS (dm-8): xfs_log_force: error 5 returned. XFS (dm-8): xfs_log_force: error 5 returned. XFS (dm-8): xfs_log_force: error 5 returned. XFS (dm-8): xfs_log_force: error 5 returned. XFS (dm-8): xfs_log_force: error 5 returned. XFS (dm-8): xfs_log_force: error 5 returned. XFS (dm-8): xfs_log_force: error 5 returned. XFS (dm-8): xfs_log_force: error 5 returned. XFS (dm-8): xfs_log_force: error 5 returned. XFS (dm-8): xfs_log_force: error 5 returned. XFS (dm-8): xfs_log_force: error 5 returned. XFS (dm-8): xfs_log_force: error 5 returned. XFS (dm-8): xfs_log_force: error 5 returned. XFS (dm-8): xfs_log_force: error 5 returned. XFS (dm-8): xfs_log_force: error 5 returned. XFS (dm-8): xfs_log_force: error 5 returned. XFS (dm-8): xfs_log_force: error 5 returned. XFS (dm-8): xfs_do_force_shutdown(0x1) called from line 1031 of file fs/xfs/xfs_buf.c. Return address = 0xffffffffa03b9f45 XFS (dm-8): xfs_log_force: error 5 returned. XFS (dm-8): xfs_log_force: error 5 returned. XFS (dm-8): Mounting Filesystem XFS (dm-8): Starting recovery (logdev: internal) XFS (dm-8): Ending recovery (logdev: internal) Is it a known issue? I have not - yet - enabled this host in CI thus can't tell if this can be reproduced. I've done repair but did not saved output. Cheers, -Jacek From colin.king@canonical.com Tue Sep 11 04:47:23 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_43 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8B9lNLh064560 for ; Tue, 11 Sep 2012 04:47:23 -0500 X-ASG-Debug-ID: 1347356906-04bdf0067c83a80001-NocioJ Received: from youngberry.canonical.com (youngberry.canonical.com [91.189.89.112]) by cuda.sgi.com with ESMTP id 1eCxcikUGeKZ2tiu for ; Tue, 11 Sep 2012 02:48:26 -0700 (PDT) X-Barracuda-Envelope-From: colin.king@canonical.com X-Barracuda-Apparent-Source-IP: 91.189.89.112 Received: from cpc3-craw6-2-0-cust180.croy.cable.virginmedia.com ([77.100.248.181] helo=[192.168.0.5]) by youngberry.canonical.com with esmtpsa (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1TBN4z-0005yd-Mr; Tue, 11 Sep 2012 09:48:25 +0000 Message-ID: <504F08E8.6020500@canonical.com> Date: Tue, 11 Sep 2012 10:48:24 +0100 From: Colin Ian King User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:15.0) Gecko/20120827 Thunderbird/15.0 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: slow xfs writes on loopback mounted xfs with dd + seek Content-Type: text/plain; charset=ISO-8859-1; format=flowed X-ASG-Orig-Subj: slow xfs writes on loopback mounted xfs with dd + seek Content-Transfer-Encoding: 7bit X-Barracuda-Connect: youngberry.canonical.com[91.189.89.112] X-Barracuda-Start-Time: 1347356906 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108225 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi, I've seeing really slow I/O writes on xfs when doing a dd with a seek offset to a file on an xfs file system which is loop mounted. Reproduced on Linux 3.6.0-rc5 and 3.4 How to reproduce: dd if=/dev/zero of=xfs.img bs=1M count=1024 mkfs.xfs -f xfs.img sudo mount -o loop -t xfs xfs.img /mnt/test First create a large file, write performance is excellent: sudo dd if=/dev/zero of=/mnt/test/big bs=1M count=500 500+0 records in 500+0 records out 524288000 bytes (524 MB) copied, 1.69451 s, 309 MB/s ..next seek and write some more blocks, write performance is poor: sudo dd if=/dev/zero of=/mnt/test/big obs=4K count=8192 seek=131072 8192+0 records in 1024+0 records out 4194304 bytes (4.2 MB) copied, 47.0644 s, 89.1 kB/s Using blktrace and seektracer I've captured the I/O on the block device containing the xfs.img and I'm seeing ~55-70 seeks per second during the slow writes, which seems excessive. I can reproduce this on hardware with 1, 4 or 8 CPUs. I've testing this with other file systems I and don't see this issue, so it looks like an xfs + loop mounted issue. Is this a known performance "feature"? Colin From bfoster@redhat.com Tue Sep 11 09:52:55 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_43 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8BEqtCq108130 for ; Tue, 11 Sep 2012 09:52:55 -0500 X-ASG-Debug-ID: 1347375237-04cb6c56888e160001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id srK3w4a1duOSIClV for ; Tue, 11 Sep 2012 07:53:57 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8BErsdU000820 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 11 Sep 2012 10:53:54 -0400 Received: from laptop.bfoster (vpn-10-141.rdu.redhat.com [10.11.10.141]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q8BErqKa025990 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Tue, 11 Sep 2012 10:53:53 -0400 Message-ID: <504F5027.9080503@redhat.com> Date: Tue, 11 Sep 2012 10:52:23 -0400 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:15.0) Gecko/20120827 Thunderbird/15.0 MIME-Version: 1.0 To: Colin Ian King CC: xfs@oss.sgi.com Subject: Re: slow xfs writes on loopback mounted xfs with dd + seek References: <504F08E8.6020500@canonical.com> X-ASG-Orig-Subj: Re: slow xfs writes on loopback mounted xfs with dd + seek In-Reply-To: <504F08E8.6020500@canonical.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1347375237 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com On 09/11/2012 05:48 AM, Colin Ian King wrote: > Hi, > > I've seeing really slow I/O writes on xfs when doing a dd with a seek > offset to a file on an xfs file system which is loop mounted. > > Reproduced on Linux 3.6.0-rc5 and 3.4 > > How to reproduce: > > dd if=/dev/zero of=xfs.img bs=1M count=1024 > mkfs.xfs -f xfs.img > sudo mount -o loop -t xfs xfs.img /mnt/test > > First create a large file, write performance is excellent: > > sudo dd if=/dev/zero of=/mnt/test/big bs=1M count=500 > 500+0 records in > 500+0 records out > 524288000 bytes (524 MB) copied, 1.69451 s, 309 MB/s > > ..next seek and write some more blocks, write performance is poor: > > sudo dd if=/dev/zero of=/mnt/test/big obs=4K count=8192 seek=131072 > 8192+0 records in > 1024+0 records out > 4194304 bytes (4.2 MB) copied, 47.0644 s, 89.1 kB/s > Hi Colin, I reproduced this behavior with a 1GB filesystem on a loop device. I think the problem you're seeing could be circumstantial to the fact that you're writing to a point where you are close to filling the fs. Taking a look at the tracepoint data when running your second dd alone vs. in succession to the first, I see a fairly clean buffered_write->get_blocks pattern vs. a buffered_write->enospc->log_force->get_blocks pattern. In other words, you're triggering an internal space allocation failure and flush sequence intended to free up space. Somebody else might be able to chime in and more ably explain why that occurs following a truncate (perhaps the space isn't freed until the change hits the log), but regardless this doesn't seem to occur if you increase the size of the fs. Brian > Using blktrace and seektracer I've captured the I/O on the block device > containing the xfs.img and I'm seeing ~55-70 seeks per second during the > slow writes, which seems excessive. > > I can reproduce this on hardware with 1, 4 or 8 CPUs. > > I've testing this with other file systems I and don't see this issue, so > it looks like an xfs + loop mounted issue. > > Is this a known performance "feature"? > > Colin > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From xfs-owner@oss.sgi.com Tue Sep 11 11:32:55 2012 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8BGWrAE121143 for ; Tue, 11 Sep 2012 11:32:54 -0500 X-ASG-Debug-ID: 1347381229-04bdf0067c9cc10001-w1Z2WR Received: from ns1.haiha12.com (v-36-55-233-197.ub-freebit.net [36.55.233.197]) by cuda.sgi.com with ESMTP id 90ZBVnOQPS2GvrJQ (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO); Tue, 11 Sep 2012 09:33:52 -0700 (PDT) X-Barracuda-Envelope-From: interlottoconsultant@gmail.com X-Barracuda-Apparent-Source-IP: 36.55.233.197 Received: from [212.225.187.115] (port=38436 helo=User) by ns1.haiha12.com with esmtpa (Exim 4.77) (envelope-from ) id 1TBPCI-0000N6-Em; Tue, 11 Sep 2012 21:05:11 +0900 Reply-To: From: "Ceserez Isabelle" Subject: OFFIZIELLE GEWINNBENACHRITIGUNG Date: Tue, 11 Sep 2012 14:04:44 +0200 X-ASG-Orig-Subj: OFFIZIELLE GEWINNBENACHRITIGUNG MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_0094_01C2A9A6.0F775E36" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 6.00.2600.0000 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2600.0000 X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - ns1.haiha12.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - gmail.com X-Barracuda-Connect: v-36-55-233-197.ub-freebit.net[36.55.233.197] X-Barracuda-Start-Time: 1347381231 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: -1001.00 X-Barracuda-Spam-Status: No, SCORE=-1001.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 Message-Id: <20120911163358.81274A4211F@cuda.sgi.com> To: undisclosed-recipients:; This is a multi-part message in MIME format. ------=_NextPart_000_0094_01C2A9A6.0F775E36 Content-Type: text/plain; charset="Windows-1251" Content-Transfer-Encoding: 7bit Aufmerksamkeit: Unser gesch?tzter Sieger, Bitte finden freundlich Ihre gewinnende Mitteilung in der angebrachten pdf Akte. Gl?ckw?nsche!!!!! Mir freundlichen Gr?ssen Prof. R, Ceserez Isabelle ------=_NextPart_000_0094_01C2A9A6.0F775E36 Content-Type: application/octet-stream; name="FOR_MATE.pdf" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="FOR_MATE.pdf" JVBERi0xLjMKJeLjz9MKMiAwIG9iago8PAovQ3JlYXRpb25EYXRlIChEOjIw MTIwODA3MDQzMTI2LTA3JzAwJykKL01vZERhdGUgKEQ6MjAxMjA4MDcwNDMx MjYtMDcnMDAnKQovUHJvZHVjZXIgKEJDTCBlYXN5UERGIDYuMDIgXCgwMzQy XCkpCi9DcmVhdG9yIChlYXN5UERGIFNESyA2LjApCj4+CmVuZG9iagoKOCAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltOAovV2lkdGggMTYKL0hlaWdodCAxNgovQml0c1BlckNvbXBvbmVudCAx Ci9JbWFnZU1hc2sgdHJ1ZQovRGVjb2RlIFswIDFdCi9EZWNvZGVQYXJtcyA8 PCAvSyAtMSAvQ29sdW1ucyAxNiA+PgovTGVuZ3RoIDk5Ci9GaWx0ZXIgL0ND SVRURmF4RGVjb2RlCj4+CnN0cmVhbQojojojojojojoEEqERERGyhzDlDlDh KhERGyhyhyhyhyhyhwlQiIiI5xzDmHCWIiNlDlDlDlDlDlDhKhERERsocw5Q 5Q4SoRERsococococococJUIiIiOccw5hwliIjABABAKZW5kc3RyZWFtCmVu ZG9iagoKNyAwIG9iago8PAovVHlwZSAvUGF0dGVybgovUGF0dGVyblR5cGUg MQovUGFpbnRUeXBlIDEKL1RpbGluZ1R5cGUgMQovQkJveCBbMCAwIDEgMV0K L1hTdGVwIDEuMDAxCi9ZU3RlcCAxLjAwMQovTWF0cml4IFsxLjUgMCAwIDEu NSAwIDBdCi9SZXNvdXJjZXMgPDwgL1Byb2NTZXQgWy9QREYgL0ltYWdlQ10g L1hPYmplY3QgPDwgL0ltOCA4IDAgUiA+PiA+PgovTGVuZ3RoIDI3Ci9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42jPQM7O0UDBAIovSufQ9cy0U XPK5AFleBk0KZW5kc3RyZWFtCmVuZG9iagoKMTAgMCBvYmoKPDwKL1R5cGUg L1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTEwCi9XaWR0aCAx NgovSGVpZ2h0IDE2Ci9CaXRzUGVyQ29tcG9uZW50IDEKL0ltYWdlTWFzayB0 cnVlCi9EZWNvZGUgWzAgMV0KL0RlY29kZVBhcm1zIDw8IC9LIC0xIC9Db2x1 bW5zIDE2ID4+Ci9MZW5ndGggMTAxCi9GaWx0ZXIgL0NDSVRURmF4RGVjb2Rl Cj4+CnN0cmVhbQomqI6I6I6I6I6I6CWIiIiLlDlDmHKHKHWIiIuUOUOUOUOU OUOCCWIiIiLmHMOYdYiLlDlDlDlDlDlDggliIiIi5Q5Q5hyhyh1iIiLlDlDl DlDlDlDggliIiIi5hzDmHWIiwAQAQAplbmRzdHJlYW0KZW5kb2JqCgo5IDAg b2JqCjw8Ci9UeXBlIC9QYXR0ZXJuCi9QYXR0ZXJuVHlwZSAxCi9QYWludFR5 cGUgMQovVGlsaW5nVHlwZSAxCi9CQm94IFswIDAgMSAxXQovWFN0ZXAgMS4w MDEKL1lTdGVwIDEuMDAxCi9NYXRyaXggWzEuNSAwIDAgMS41IDAgMF0KL1Jl c291cmNlcyA8PCAvUHJvY1NldCBbL1BERiAvSW1hZ2VDXSAvWE9iamVjdCA8 PCAvSW0xMCAxMCAwIFIgPj4gPj4KL0xlbmd0aCAyOAovRmlsdGVyIC9GbGF0 ZURlY29kZQo+PgpzdHJlYW0KeNoz0DOztFAwQCKL0rn0PXMNDRRc8rkAX5QG dgplbmRzdHJlYW0KZW5kb2JqCgoxMiAwIG9iago8PAovVHlwZSAvWE9iamVj dAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTIKL1dpZHRoIDE2Ci9IZWln aHQgMTYKL0JpdHNQZXJDb21wb25lbnQgMQovSW1hZ2VNYXNrIHRydWUKL0Rl Y29kZSBbMCAxXQovRGVjb2RlUGFybXMgPDwgL0sgLTEgL0NvbHVtbnMgMTYg Pj4KL0xlbmd0aCA5NwovRmlsdGVyIC9DQ0lUVEZheERlY29kZQo+PgpzdHJl YW0KI6I6I6I6I6I6BBKhERERsococw5Q5Q9CIiNlDlDlDlDlDlDhKhERERsw 5hzD0IjZQ5Q5Q5Q5Q5Q4SoREREbKHKHMOUOUPQiIjZQ5Q5Q5Q5Q5Q4SoRERE bMOYcw9CIwAQAQplbmRzdHJlYW0KZW5kb2JqCgoxMSAwIG9iago8PAovVHlw ZSAvUGF0dGVybgovUGF0dGVyblR5cGUgMQovUGFpbnRUeXBlIDEKL1RpbGlu Z1R5cGUgMQovQkJveCBbMCAwIDEgMV0KL1hTdGVwIDEuMDAxCi9ZU3RlcCAx LjAwMQovTWF0cml4IFsxLjUgMCAwIDEuNSAwIDBdCi9SZXNvdXJjZXMgPDwg L1Byb2NTZXQgWy9QREYgL0ltYWdlQ10gL1hPYmplY3QgPDwgL0ltMTIgMTIg MCBSID4+ID4+Ci9MZW5ndGggMjgKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4K c3RyZWFtCnjaM9Azs7RQMEAii9K59D1zDY0UXPK5AF+eBngKZW5kc3RyZWFt CmVuZG9iagoKMTQgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTE0Ci9XaWR0aCAxNgovSGVpZ2h0IDE2Ci9CaXRz UGVyQ29tcG9uZW50IDEKL0ltYWdlTWFzayB0cnVlCi9EZWNvZGUgWzAgMV0K L0RlY29kZVBhcm1zIDw8IC9LIC0xIC9Db2x1bW5zIDE2ID4+Ci9MZW5ndGgg MTA3Ci9GaWx0ZXIgL0NDSVRURmF4RGVjb2RlCj4+CnN0cmVhbQomqI6I6I6I 6I6I6CWIiIiLlDlDlDmHKHBBYiIiOUOUOUOUOUOUOCCWIiIiLlDmHMOCCxER yhyhyhyhyhyhwQSxERERcocococw5Q4ILERERyhyhyhyhyhyhwQSxERERcoc w5hwQWIiMAEAEAplbmRzdHJlYW0KZW5kb2JqCgoxMyAwIG9iago8PAovVHlw ZSAvUGF0dGVybgovUGF0dGVyblR5cGUgMQovUGFpbnRUeXBlIDEKL1RpbGlu Z1R5cGUgMQovQkJveCBbMCAwIDEgMV0KL1hTdGVwIDEuMDAxCi9ZU3RlcCAx LjAwMQovTWF0cml4IFsxLjUgMCAwIDEuNSAwIDBdCi9SZXNvdXJjZXMgPDwg L1Byb2NTZXQgWy9QREYgL0ltYWdlQ10gL1hPYmplY3QgPDwgL0ltMTQgMTQg MCBSID4+ID4+Ci9MZW5ndGggMjgKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4K c3RyZWFtCnjaM9Azs7RQMEAii9K59D1zDU0UXPK5AF+oBnoKZW5kc3RyZWFt CmVuZG9iagoKMTYgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTE2Ci9XaWR0aCAxNgovSGVpZ2h0IDE2Ci9CaXRz UGVyQ29tcG9uZW50IDEKL0ltYWdlTWFzayB0cnVlCi9EZWNvZGUgWzAgMV0K L0RlY29kZVBhcm1zIDw8IC9LIC0xIC9Db2x1bW5zIDE2ID4+Ci9MZW5ndGgg MTAyCi9GaWx0ZXIgL0NDSVRURmF4RGVjb2RlCj4+CnN0cmVhbQojojojojoj ojoEEqERERHOOUOUOYcocJYiIiNlDlDlDlDlDlDhKhERERzjmHMOEsREbKHK HKHKHKHKHCVCIiIjnHKHKHMOUOEsRERGyhyhyhyhyhyhwlQiIiI5xzDmHCWI iMAEAEAKZW5kc3RyZWFtCmVuZG9iagoKMTUgMCBvYmoKPDwKL1R5cGUgL1Bh dHRlcm4KL1BhdHRlcm5UeXBlIDEKL1BhaW50VHlwZSAxCi9UaWxpbmdUeXBl IDEKL0JCb3ggWzAgMCAxIDFdCi9YU3RlcCAxLjAwMQovWVN0ZXAgMS4wMDEK L01hdHJpeCBbMS41IDAgMCAxLjUgMCAwXQovUmVzb3VyY2VzIDw8IC9Qcm9j U2V0IFsvUERGIC9JbWFnZUNdIC9YT2JqZWN0IDw8IC9JbTE2IDE2IDAgUiA+ PiA+PgovTGVuZ3RoIDI4Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVh bQp42jPQM7O0UDBAIovSufQ9cw3NFFzyuQBfsgZ8CmVuZHN0cmVhbQplbmRv YmoKCjE4IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFn ZQovTmFtZSAvSW0xOAovV2lkdGggMTYKL0hlaWdodCAxNgovQml0c1BlckNv bXBvbmVudCAxCi9JbWFnZU1hc2sgdHJ1ZQovRGVjb2RlIFswIDFdCi9EZWNv ZGVQYXJtcyA8PCAvSyAtMSAvQ29sdW1ucyAxNiA+PgovTGVuZ3RoIDEwMQov RmlsdGVyIC9DQ0lUVEZheERlY29kZQo+PgpzdHJlYW0KJqiOiOiOiOiOiOgl iIiIi5hyhyhzDggliIiLlDlDlDlDlDlDggliIiIi5hzDmHWIi5Q5Q5Q5Q5Q5 Q4IJYiIiIuYcococw4IJYiIi5Q5Q5Q5Q5Q5Q4IJYiIiIuYcw5h1iIsAEAEAK ZW5kc3RyZWFtCmVuZG9iagoKMTcgMCBvYmoKPDwKL1R5cGUgL1BhdHRlcm4K L1BhdHRlcm5UeXBlIDEKL1BhaW50VHlwZSAxCi9UaWxpbmdUeXBlIDEKL0JC b3ggWzAgMCAxIDFdCi9YU3RlcCAxLjAwMQovWVN0ZXAgMS4wMDEKL01hdHJp eCBbMS41IDAgMCAxLjUgMCAwXQovUmVzb3VyY2VzIDw8IC9Qcm9jU2V0IFsv UERGIC9JbWFnZUNdIC9YT2JqZWN0IDw8IC9JbTE4IDE4IDAgUiA+PiA+Pgov TGVuZ3RoIDI4Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42jPQ M7O0UDBAIovSufQ9cw0tFFzyuQBfvAZ+CmVuZHN0cmVhbQplbmRvYmoKCjIw IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFt ZSAvSW0yMAovV2lkdGggMTYKL0hlaWdodCAxNgovQml0c1BlckNvbXBvbmVu dCAxCi9JbWFnZU1hc2sgdHJ1ZQovRGVjb2RlIFswIDFdCi9EZWNvZGVQYXJt cyA8PCAvSyAtMSAvQ29sdW1ucyAxNiA+PgovTGVuZ3RoIDk2Ci9GaWx0ZXIg L0NDSVRURmF4RGVjb2RlCj4+CnN0cmVhbQojojojojojojoEEqERERGzDlDl DmHCVCIiNlDlDlDlDlDlDhKhERERsw5hzD0IjZQ5Q5Q5Q5Q5Q4SoREREbMOU OUOYcJUIiI2UOUOUOUOUOUOEqERERGzDmHMPQiMAEAEKZW5kc3RyZWFtCmVu ZG9iagoKMTkgMCBvYmoKPDwKL1R5cGUgL1BhdHRlcm4KL1BhdHRlcm5UeXBl IDEKL1BhaW50VHlwZSAxCi9UaWxpbmdUeXBlIDEKL0JCb3ggWzAgMCAxIDFd Ci9YU3RlcCAxLjAwMQovWVN0ZXAgMS4wMDEKL01hdHJpeCBbMS41IDAgMCAx LjUgMCAwXQovUmVzb3VyY2VzIDw8IC9Qcm9jU2V0IFsvUERGIC9JbWFnZUNd IC9YT2JqZWN0IDw8IC9JbTIwIDIwIDAgUiA+PiA+PgovTGVuZ3RoIDI4Ci9G aWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42jPQM7O0UDBAIovSufQ9 c40MFFzyuQBfmgZ3CmVuZHN0cmVhbQplbmRvYmoKCjIyIDAgb2JqCjw8Ci9U eXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMgovV2lk dGggMTYKL0hlaWdodCAxNgovQml0c1BlckNvbXBvbmVudCAxCi9JbWFnZU1h c2sgdHJ1ZQovRGVjb2RlIFswIDFdCi9EZWNvZGVQYXJtcyA8PCAvSyAtMSAv Q29sdW1ucyAxNiA+PgovTGVuZ3RoIDEwNAovRmlsdGVyIC9DQ0lUVEZheERl Y29kZQo+PgpzdHJlYW0KJqiOiOiOiOiOiOgliIiIi5Q5hyhyhwQSxERFyhyh yhyhyhyhwQSxERERcocw5hwQWIiOUOUOUOUOUOUOCCWIiIiLlDmHKHKHBBLE REXKHKHKHKHKHKHBBLERERFyhzDmHBBYiIwAQAQKZW5kc3RyZWFtCmVuZG9i agoKMjEgMCBvYmoKPDwKL1R5cGUgL1BhdHRlcm4KL1BhdHRlcm5UeXBlIDEK L1BhaW50VHlwZSAxCi9UaWxpbmdUeXBlIDEKL0JCb3ggWzAgMCAxIDFdCi9Y U3RlcCAxLjAwMQovWVN0ZXAgMS4wMDEKL01hdHJpeCBbMS41IDAgMCAxLjUg MCAwXQovUmVzb3VyY2VzIDw8IC9Qcm9jU2V0IFsvUERGIC9JbWFnZUNdIC9Y T2JqZWN0IDw8IC9JbTIyIDIyIDAgUiA+PiA+PgovTGVuZ3RoIDI4Ci9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42jPQM7O0UDBAIovSufQ9c42M FFzyuQBfpAZ5CmVuZHN0cmVhbQplbmRvYmoKCjI0IDAgb2JqCjw8Ci9UeXBl IC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yNAovV2lkdGgg MTYKL0hlaWdodCAxNgovQml0c1BlckNvbXBvbmVudCAxCi9JbWFnZU1hc2sg dHJ1ZQovRGVjb2RlIFswIDFdCi9EZWNvZGVQYXJtcyA8PCAvSyAtMSAvQ29s dW1ucyAxNiA+PgovTGVuZ3RoIDEwNAovRmlsdGVyIC9DQ0lUVEZheERlY29k ZQo+PgpzdHJlYW0KJqC8ococococococEEsREREXKHMOUOUOCCWIiIuUOUOU OUOUOUOCCWIiIiLlDmHMOCCxERyhyhyhyhyhyhwQSxERERcocw5Q5Q4IJYiI i5Q5Q5Q5Q5Q5Q4IJYiIiIuUOYcw4IKACACAKZW5kc3RyZWFtCmVuZG9iagoK MjMgMCBvYmoKPDwKL1R5cGUgL1BhdHRlcm4KL1BhdHRlcm5UeXBlIDEKL1Bh aW50VHlwZSAxCi9UaWxpbmdUeXBlIDEKL0JCb3ggWzAgMCAxIDFdCi9YU3Rl cCAxLjAwMQovWVN0ZXAgMS4wMDEKL01hdHJpeCBbMS41IDAgMCAxLjUgMCAw XQovUmVzb3VyY2VzIDw8IC9Qcm9jU2V0IFsvUERGIC9JbWFnZUNdIC9YT2Jq ZWN0IDw8IC9JbTI0IDI0IDAgUiA+PiA+PgovTGVuZ3RoIDI4Ci9GaWx0ZXIg L0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42jPQM7O0UDBAIovSufQ9c41MFFzy uQBfrgZ7CmVuZHN0cmVhbQplbmRvYmoKCjI2IDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yNgovV2lkdGggMTYK L0hlaWdodCAxNgovQml0c1BlckNvbXBvbmVudCAxCi9JbWFnZU1hc2sgdHJ1 ZQovRGVjb2RlIFswIDFdCi9EZWNvZGVQYXJtcyA8PCAvSyAtMSAvQ29sdW1u cyAxNiA+PgovTGVuZ3RoIDk5Ci9GaWx0ZXIgL0NDSVRURmF4RGVjb2RlCj4+ CnN0cmVhbQomoLsococococococJUIiIiNlDmHKHKHCVCIiNlDlDlDlDlDlD hKhERERzjmHMOEsREbKHKHKHKHKHKHCVCIiIjZQ5hyhyhwlQiIjZQ5Q5Q5Q5 Q5Q4SoREREc45hzDhKACACAKZW5kc3RyZWFtCmVuZG9iagoKMjUgMCBvYmoK PDwKL1R5cGUgL1BhdHRlcm4KL1BhdHRlcm5UeXBlIDEKL1BhaW50VHlwZSAx Ci9UaWxpbmdUeXBlIDEKL0JCb3ggWzAgMCAxIDFdCi9YU3RlcCAxLjAwMQov WVN0ZXAgMS4wMDEKL01hdHJpeCBbMS41IDAgMCAxLjUgMCAwXQovUmVzb3Vy Y2VzIDw8IC9Qcm9jU2V0IFsvUERGIC9JbWFnZUNdIC9YT2JqZWN0IDw8IC9J bTI2IDI2IDAgUiA+PiA+PgovTGVuZ3RoIDI4Ci9GaWx0ZXIgL0ZsYXRlRGVj b2RlCj4+CnN0cmVhbQp42jPQM7O0UDBAIovSufQ9c43MFFzyuQBfuAZ9CmVu ZHN0cmVhbQplbmRvYmoKCjI4IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9T dWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yOAovV2lkdGggMTYKL0hlaWdodCAx NgovQml0c1BlckNvbXBvbmVudCAxCi9JbWFnZU1hc2sgdHJ1ZQovRGVjb2Rl IFswIDFdCi9EZWNvZGVQYXJtcyA8PCAvSyAtMSAvQ29sdW1ucyAxNiA+Pgov TGVuZ3RoIDEwMQovRmlsdGVyIC9DQ0lUVEZheERlY29kZQo+PgpzdHJlYW0K JqC8ococococococEEsREREXKHKHMOUOUOsRERcococococococEEsREREXM OYcw6xEXKHKHKHKHKHKHBBLERERFyhyhzDlDlDrEREXKHKHKHKHKHKHBBLER ERFzDmHMOoAIAIAKZW5kc3RyZWFtCmVuZG9iagoKMjcgMCBvYmoKPDwKL1R5 cGUgL1BhdHRlcm4KL1BhdHRlcm5UeXBlIDEKL1BhaW50VHlwZSAxCi9UaWxp bmdUeXBlIDEKL0JCb3ggWzAgMCAxIDFdCi9YU3RlcCAxLjAwMQovWVN0ZXAg MS4wMDEKL01hdHJpeCBbMS41IDAgMCAxLjUgMCAwXQovUmVzb3VyY2VzIDw8 IC9Qcm9jU2V0IFsvUERGIC9JbWFnZUNdIC9YT2JqZWN0IDw8IC9JbTI4IDI4 IDAgUiA+PiA+PgovTGVuZ3RoIDI4Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+ CnN0cmVhbQp42jPQM7O0UDBAIovSufQ9c40sFFzyuQBfwgZ/CmVuZHN0cmVh bQplbmRvYmoKCjMwIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBl IC9JbWFnZQovTmFtZSAvSW0zMAovV2lkdGggMTYKL0hlaWdodCAxNgovQml0 c1BlckNvbXBvbmVudCAxCi9JbWFnZU1hc2sgdHJ1ZQovRGVjb2RlIFswIDFd Ci9EZWNvZGVQYXJtcyA8PCAvSyAtMSAvQ29sdW1ucyAxNiA+PgovTGVuZ3Ro IDk4Ci9GaWx0ZXIgL0NDSVRURmF4RGVjb2RlCj4+CnN0cmVhbQomoLsococo cocococJUIiIiNlDlDmHKHKHoRERsococococococJUIiIiNmHMOYehEbKHK HKHKHKHKHCVCIiIjZQ5Q5hyhyh6EREbKHKHKHKHKHKHCVCIiIjZhzDmHgAgA gAplbmRzdHJlYW0KZW5kb2JqCgoyOSAwIG9iago8PAovVHlwZSAvUGF0dGVy bgovUGF0dGVyblR5cGUgMQovUGFpbnRUeXBlIDEKL1RpbGluZ1R5cGUgMQov QkJveCBbMCAwIDEgMV0KL1hTdGVwIDEuMDAxCi9ZU3RlcCAxLjAwMQovTWF0 cml4IFsxLjUgMCAwIDEuNSAwIDBdCi9SZXNvdXJjZXMgPDwgL1Byb2NTZXQg Wy9QREYgL0ltYWdlQ10gL1hPYmplY3QgPDwgL0ltMzAgMzAgMCBSID4+ID4+ Ci9MZW5ndGggMjgKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja M9Azs7RQMEAii9K59D1zjQ0UXPK5AF+gBngKZW5kc3RyZWFtCmVuZG9iagoK MzIgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9O YW1lIC9JbTMyCi9XaWR0aCAxNgovSGVpZ2h0IDE2Ci9CaXRzUGVyQ29tcG9u ZW50IDEKL0ltYWdlTWFzayB0cnVlCi9EZWNvZGUgWzAgMV0KL0RlY29kZVBh cm1zIDw8IC9LIC0xIC9Db2x1bW5zIDE2ID4+Ci9MZW5ndGggMTA3Ci9GaWx0 ZXIgL0NDSVRURmF4RGVjb2RlCj4+CnN0cmVhbQomoLyhyhyhyhyhyhwQSxER ERcocococw5Q4ILERERyhyhyhyhyhyhwQSxERERcocw5hwQWIiOUOUOUOUOU OUOCCWIiIiLlDlDlDmHKHBBYiIiOUOUOUOUOUOUOCCWIiIiLlDmHMOCCgAgA gAplbmRzdHJlYW0KZW5kb2JqCgozMSAwIG9iago8PAovVHlwZSAvUGF0dGVy bgovUGF0dGVyblR5cGUgMQovUGFpbnRUeXBlIDEKL1RpbGluZ1R5cGUgMQov QkJveCBbMCAwIDEgMV0KL1hTdGVwIDEuMDAxCi9ZU3RlcCAxLjAwMQovTWF0 cml4IFsxLjUgMCAwIDEuNSAwIDBdCi9SZXNvdXJjZXMgPDwgL1Byb2NTZXQg Wy9QREYgL0ltYWdlQ10gL1hPYmplY3QgPDwgL0ltMzIgMzIgMCBSID4+ID4+ Ci9MZW5ndGggMjgKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja M9Azs7RQMEAii9K59D1zjY0UXPK5AF+qBnoKZW5kc3RyZWFtCmVuZG9iagoK MzQgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9O YW1lIC9JbTM0Ci9XaWR0aCAxNgovSGVpZ2h0IDE2Ci9CaXRzUGVyQ29tcG9u ZW50IDEKL0ltYWdlTWFzayB0cnVlCi9EZWNvZGUgWzAgMV0KL0RlY29kZVBh cm1zIDw8IC9LIC0xIC9Db2x1bW5zIDE2ID4+Ci9MZW5ndGggMTAyCi9GaWx0 ZXIgL0NDSVRURmF4RGVjb2RlCj4+CnN0cmVhbQomoLsococococococJUIiI iOccococw5Q4SxEREbKHKHKHKHKHKHCVCIiIjnHMOYcJYiI2UOUOUOUOUOUO EqERERHOOUOUOYcocJYiIiNlDlDlDlDlDlDhKhERERzjmHMOEoAIAIAKZW5k c3RyZWFtCmVuZG9iagoKMzMgMCBvYmoKPDwKL1R5cGUgL1BhdHRlcm4KL1Bh dHRlcm5UeXBlIDEKL1BhaW50VHlwZSAxCi9UaWxpbmdUeXBlIDEKL0JCb3gg WzAgMCAxIDFdCi9YU3RlcCAxLjAwMQovWVN0ZXAgMS4wMDEKL01hdHJpeCBb MS41IDAgMCAxLjUgMCAwXQovUmVzb3VyY2VzIDw8IC9Qcm9jU2V0IFsvUERG IC9JbWFnZUNdIC9YT2JqZWN0IDw8IC9JbTM0IDM0IDAgUiA+PiA+PgovTGVu Z3RoIDI4Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42jPQM7O0 UDBAIovSufQ9c41NFFzyuQBftAZ8CmVuZHN0cmVhbQplbmRvYmoKCjM2IDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW0zNgovV2lkdGggMTYKL0hlaWdodCAxNgovQml0c1BlckNvbXBvbmVudCAx Ci9JbWFnZU1hc2sgdHJ1ZQovRGVjb2RlIFswIDFdCi9EZWNvZGVQYXJtcyA8 PCAvSyAtMSAvQ29sdW1ucyAxNiA+PgovTGVuZ3RoIDEwMQovRmlsdGVyIC9D Q0lUVEZheERlY29kZQo+PgpzdHJlYW0KJqC8ococococococEEsREREXMOUO UOYcEEsRERcococococococEEsREREXMOYcw6xEXKHKHKHKHKHKHBBLERERF zDlDlDmHBBLEREXKHKHKHKHKHKHBBLERERFzDmHMOoAIAIAKZW5kc3RyZWFt CmVuZG9iagoKMzUgMCBvYmoKPDwKL1R5cGUgL1BhdHRlcm4KL1BhdHRlcm5U eXBlIDEKL1BhaW50VHlwZSAxCi9UaWxpbmdUeXBlIDEKL0JCb3ggWzAgMCAx IDFdCi9YU3RlcCAxLjAwMQovWVN0ZXAgMS4wMDEKL01hdHJpeCBbMS41IDAg MCAxLjUgMCAwXQovUmVzb3VyY2VzIDw8IC9Qcm9jU2V0IFsvUERGIC9JbWFn ZUNdIC9YT2JqZWN0IDw8IC9JbTM2IDM2IDAgUiA+PiA+PgovTGVuZ3RoIDI4 Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42jPQM7O0UDBAIovS ufQ9c43NFFzyuQBfvgZ+CmVuZHN0cmVhbQplbmRvYmoKCjM4IDAgb2JqCjw8 Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0zOAov V2lkdGggMTYKL0hlaWdodCAxNgovQml0c1BlckNvbXBvbmVudCAxCi9JbWFn ZU1hc2sgdHJ1ZQovRGVjb2RlIFswIDFdCi9EZWNvZGVQYXJtcyA8PCAvSyAt MSAvQ29sdW1ucyAxNiA+PgovTGVuZ3RoIDk3Ci9GaWx0ZXIgL0NDSVRURmF4 RGVjb2RlCj4+CnN0cmVhbQomoLsococococococJUIiIiNmHKHKHMOEqEREb KHKHKHKHKHKHCVCIiIjZhzDmHoRGyhyhyhyhyhyhwlQiIiI2Ycococw4SoRE RsococococococJUIiIiNmHMOYeACACACmVuZHN0cmVhbQplbmRvYmoKCjM3 IDAgb2JqCjw8Ci9UeXBlIC9QYXR0ZXJuCi9QYXR0ZXJuVHlwZSAxCi9QYWlu dFR5cGUgMQovVGlsaW5nVHlwZSAxCi9CQm94IFswIDAgMSAxXQovWFN0ZXAg MS4wMDEKL1lTdGVwIDEuMDAxCi9NYXRyaXggWzEuNSAwIDAgMS41IDAgMF0K L1Jlc291cmNlcyA8PCAvUHJvY1NldCBbL1BERiAvSW1hZ2VDXSAvWE9iamVj dCA8PCAvSW0zOCAzOCAwIFIgPj4gPj4KL0xlbmd0aCAyOAovRmlsdGVyIC9G bGF0ZURlY29kZQo+PgpzdHJlYW0KeNoz0DOztFAwQCKL0rn0PXONLRRc8rkA X8gGgAplbmRzdHJlYW0KZW5kb2JqCgo0MCAwIG9iago8PAovVHlwZSAvWE9i amVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltNDAKL1dpZHRoIDE2Ci9I ZWlnaHQgMTYKL0JpdHNQZXJDb21wb25lbnQgMQovSW1hZ2VNYXNrIHRydWUK L0RlY29kZSBbMCAxXQovRGVjb2RlUGFybXMgPDwgL0sgLTEgL0NvbHVtbnMg MTYgPj4KL0xlbmd0aCAxMDQKL0ZpbHRlciAvQ0NJVFRGYXhEZWNvZGUKPj4K c3RyZWFtCiaojxHiPBYiI5Q5Q5Q5Q5Q5Q4IJYiIiIuUOYcococEEsRERcoco cococococEEsREREXKHMOYcEFiIjlDlDlDlDlDlDggliIiIi5Q5hyhyhwQSx ERFyhyhyhyhyhyhwQSxERERYAIAICmVuZHN0cmVhbQplbmRvYmoKCjM5IDAg b2JqCjw8Ci9UeXBlIC9QYXR0ZXJuCi9QYXR0ZXJuVHlwZSAxCi9QYWludFR5 cGUgMQovVGlsaW5nVHlwZSAxCi9CQm94IFswIDAgMSAxXQovWFN0ZXAgMS4w MDEKL1lTdGVwIDEuMDAxCi9NYXRyaXggWzEuNSAwIDAgMS41IDAgMF0KL1Jl c291cmNlcyA8PCAvUHJvY1NldCBbL1BERiAvSW1hZ2VDXSAvWE9iamVjdCA8 PCAvSW00MCA0MCAwIFIgPj4gPj4KL0xlbmd0aCAyOAovRmlsdGVyIC9GbGF0 ZURlY29kZQo+PgpzdHJlYW0KeNoz0DOztFAwQCKL0rn0PXNNDBRc8rkAX6YG eQplbmRzdHJlYW0KZW5kb2JqCgo0MiAwIG9iago8PAovVHlwZSAvWE9iamVj dAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltNDIKL1dpZHRoIDE2Ci9IZWln aHQgMTYKL0JpdHNQZXJDb21wb25lbnQgMQovSW1hZ2VNYXNrIHRydWUKL0Rl Y29kZSBbMCAxXQovRGVjb2RlUGFybXMgPDwgL0sgLTEgL0NvbHVtbnMgMTYg Pj4KL0xlbmd0aCA5OQovRmlsdGVyIC9DQ0lUVEZheERlY29kZQo+PgpzdHJl YW0KJrkeI8R5YiI2UOUOUOUOUOUOEqERERGyhzDlDlDhKhERGyhyhyhyhyhy hwlQiIiI5xzDmHCWIiNlDlDlDlDlDlDhKhERERsocw5Q5Q4SoRERsocococo cococJUIiIiMAEAECmVuZHN0cmVhbQplbmRvYmoKCjQxIDAgb2JqCjw8Ci9U eXBlIC9QYXR0ZXJuCi9QYXR0ZXJuVHlwZSAxCi9QYWludFR5cGUgMQovVGls aW5nVHlwZSAxCi9CQm94IFswIDAgMSAxXQovWFN0ZXAgMS4wMDEKL1lTdGVw IDEuMDAxCi9NYXRyaXggWzEuNSAwIDAgMS41IDAgMF0KL1Jlc291cmNlcyA8 PCAvUHJvY1NldCBbL1BERiAvSW1hZ2VDXSAvWE9iamVjdCA8PCAvSW00MiA0 MiAwIFIgPj4gPj4KL0xlbmd0aCAyOAovRmlsdGVyIC9GbGF0ZURlY29kZQo+ PgpzdHJlYW0KeNoz0DOztFAwQCKL0rn0PXNNjBRc8rkAX7AGewplbmRzdHJl YW0KZW5kb2JqCgo0NCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlw ZSAvSW1hZ2UKL05hbWUgL0ltNDQKL1dpZHRoIDE2Ci9IZWlnaHQgMTYKL0Jp dHNQZXJDb21wb25lbnQgMQovSW1hZ2VNYXNrIHRydWUKL0RlY29kZSBbMCAx XQovRGVjb2RlUGFybXMgPDwgL0sgLTEgL0NvbHVtbnMgMTYgPj4KL0xlbmd0 aCAxMDEKL0ZpbHRlciAvQ0NJVFRGYXhEZWNvZGUKPj4Kc3RyZWFtCiaxHiPE exEXKHKHKHKHKHKHBBLERERFyhyhzDlDlDrEREXKHKHKHKHKHKHBBLERERFz DmHMOsRFyhyhyhyhyhyhwQSxERERcococw5Q5Q6xERFyhyhyhyhyhyhwQSxE RERYAIAICmVuZHN0cmVhbQplbmRvYmoKCjQzIDAgb2JqCjw8Ci9UeXBlIC9Q YXR0ZXJuCi9QYXR0ZXJuVHlwZSAxCi9QYWludFR5cGUgMQovVGlsaW5nVHlw ZSAxCi9CQm94IFswIDAgMSAxXQovWFN0ZXAgMS4wMDEKL1lTdGVwIDEuMDAx Ci9NYXRyaXggWzEuNSAwIDAgMS41IDAgMF0KL1Jlc291cmNlcyA8PCAvUHJv Y1NldCBbL1BERiAvSW1hZ2VDXSAvWE9iamVjdCA8PCAvSW00NCA0NCAwIFIg Pj4gPj4KL0xlbmd0aCAyOAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl YW0KeNoz0DOztFAwQCKL0rn0PXNNTBRc8rkAX7oGfQplbmRzdHJlYW0KZW5k b2JqCgo0NiAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1h Z2UKL05hbWUgL0ltNDYKL1dpZHRoIDE2Ci9IZWlnaHQgMTYKL0JpdHNQZXJD b21wb25lbnQgMQovSW1hZ2VNYXNrIHRydWUKL0RlY29kZSBbMCAxXQovRGVj b2RlUGFybXMgPDwgL0sgLTEgL0NvbHVtbnMgMTYgPj4KL0xlbmd0aCA5Nwov RmlsdGVyIC9DQ0lUVEZheERlY29kZQo+PgpzdHJlYW0KI8R4jwKhEbKHKHKH KHKHKHCVCIiIjZQ5Q5hyhyh6EREbKHKHKHKHKHKHCVCIiIjZhzDmHoRGyhyh yhyhyhyhwlQiIiI2UOUOYcocoehERGyhyhyhyhyhyhwlQiIiIwAQAQplbmRz dHJlYW0KZW5kb2JqCgo0NSAwIG9iago8PAovVHlwZSAvUGF0dGVybgovUGF0 dGVyblR5cGUgMQovUGFpbnRUeXBlIDEKL1RpbGluZ1R5cGUgMQovQkJveCBb MCAwIDEgMV0KL1hTdGVwIDEuMDAxCi9ZU3RlcCAxLjAwMQovTWF0cml4IFsx LjUgMCAwIDEuNSAwIDBdCi9SZXNvdXJjZXMgPDwgL1Byb2NTZXQgWy9QREYg L0ltYWdlQ10gL1hPYmplY3QgPDwgL0ltNDYgNDYgMCBSID4+ID4+Ci9MZW5n dGggMjgKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaM9Azs7RQ MEAii9K59D1zTcwUXPK5AF/EBn8KZW5kc3RyZWFtCmVuZG9iagoKNDggMCBv YmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9J bTQ4Ci9XaWR0aCAxNgovSGVpZ2h0IDE2Ci9CaXRzUGVyQ29tcG9uZW50IDEK L0ltYWdlTWFzayB0cnVlCi9EZWNvZGUgWzAgMV0KL0RlY29kZVBhcm1zIDw8 IC9LIC0xIC9Db2x1bW5zIDE2ID4+Ci9MZW5ndGggMTA3Ci9GaWx0ZXIgL0ND SVRURmF4RGVjb2RlCj4+CnN0cmVhbQomqI8R4jwWIiOUOUOUOUOUOUOCCWIi IiLlDlDlDmHKHBBYiIiOUOUOUOUOUOUOCCWIiIiLlDmHMOCCxERyhyhyhyhy hyhwQSxERERcocococw5Q4ILERERyhyhyhyhyhyhwQSxERERYAIAIAplbmRz dHJlYW0KZW5kb2JqCgo0NyAwIG9iago8PAovVHlwZSAvUGF0dGVybgovUGF0 dGVyblR5cGUgMQovUGFpbnRUeXBlIDEKL1RpbGluZ1R5cGUgMQovQkJveCBb MCAwIDEgMV0KL1hTdGVwIDEuMDAxCi9ZU3RlcCAxLjAwMQovTWF0cml4IFsx LjUgMCAwIDEuNSAwIDBdCi9SZXNvdXJjZXMgPDwgL1Byb2NTZXQgWy9QREYg L0ltYWdlQ10gL1hPYmplY3QgPDwgL0ltNDggNDggMCBSID4+ID4+Ci9MZW5n dGggMjgKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaM9Azs7RQ MEAii9K59D1zTSwUXPK5AF/OBoEKZW5kc3RyZWFtCmVuZG9iagoKNTAgMCBv YmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9J bTUwCi9XaWR0aCAxNgovSGVpZ2h0IDE2Ci9CaXRzUGVyQ29tcG9uZW50IDEK L0ltYWdlTWFzayB0cnVlCi9EZWNvZGUgWzAgMV0KL0RlY29kZVBhcm1zIDw8 IC9LIC0xIC9Db2x1bW5zIDE2ID4+Ci9MZW5ndGggMTAyCi9GaWx0ZXIgL0ND SVRURmF4RGVjb2RlCj4+CnN0cmVhbQomuR4jxHliIjZQ5Q5Q5Q5Q5Q4SoRER Ec45Q5Q5hyhwliIiI2UOUOUOUOUOUOEqERERHOOYcw4SxERsococococococ JUIiIiOccococw5Q4SxEREbKHKHKHKHKHKHCVCIiIjABABAKZW5kc3RyZWFt CmVuZG9iagoKNDkgMCBvYmoKPDwKL1R5cGUgL1BhdHRlcm4KL1BhdHRlcm5U eXBlIDEKL1BhaW50VHlwZSAxCi9UaWxpbmdUeXBlIDEKL0JCb3ggWzAgMCAx IDFdCi9YU3RlcCAxLjAwMQovWVN0ZXAgMS4wMDEKL01hdHJpeCBbMS41IDAg MCAxLjUgMCAwXQovUmVzb3VyY2VzIDw8IC9Qcm9jU2V0IFsvUERGIC9JbWFn ZUNdIC9YT2JqZWN0IDw8IC9JbTUwIDUwIDAgUiA+PiA+PgovTGVuZ3RoIDI4 Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42jPQM7O0UDBAIovS ufQ9c00NFFzyuQBfrAZ6CmVuZHN0cmVhbQplbmRvYmoKCjUyIDAgb2JqCjw8 Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW01Mgov V2lkdGggMTYKL0hlaWdodCAxNgovQml0c1BlckNvbXBvbmVudCAxCi9JbWFn ZU1hc2sgdHJ1ZQovRGVjb2RlIFswIDFdCi9EZWNvZGVQYXJtcyA8PCAvSyAt MSAvQ29sdW1ucyAxNiA+PgovTGVuZ3RoIDEwMQovRmlsdGVyIC9DQ0lUVEZh eERlY29kZQo+PgpzdHJlYW0KJrEeI8R7ERcococococococEEsREREXMOUOU OYcEEsRERcococococococEEsREREXMOYcw6xEXKHKHKHKHKHKHBBLERERFz DlDlDmHBBLEREXKHKHKHKHKHKHBBLERERFgAgAgKZW5kc3RyZWFtCmVuZG9i agoKNTEgMCBvYmoKPDwKL1R5cGUgL1BhdHRlcm4KL1BhdHRlcm5UeXBlIDEK L1BhaW50VHlwZSAxCi9UaWxpbmdUeXBlIDEKL0JCb3ggWzAgMCAxIDFdCi9Y U3RlcCAxLjAwMQovWVN0ZXAgMS4wMDEKL01hdHJpeCBbMS41IDAgMCAxLjUg MCAwXQovUmVzb3VyY2VzIDw8IC9Qcm9jU2V0IFsvUERGIC9JbWFnZUNdIC9Y T2JqZWN0IDw8IC9JbTUyIDUyIDAgUiA+PiA+PgovTGVuZ3RoIDI4Ci9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42jPQM7O0UDBAIovSufQ9c02N FFzyuQBftgZ8CmVuZHN0cmVhbQplbmRvYmoKCjU0IDAgb2JqCjw8Ci9UeXBl IC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW01NAovV2lkdGgg MTYKL0hlaWdodCAxNgovQml0c1BlckNvbXBvbmVudCAxCi9JbWFnZU1hc2sg dHJ1ZQovRGVjb2RlIFswIDFdCi9EZWNvZGVQYXJtcyA8PCAvSyAtMSAvQ29s dW1ucyAxNiA+PgovTGVuZ3RoIDk2Ci9GaWx0ZXIgL0NDSVRURmF4RGVjb2Rl Cj4+CnN0cmVhbQojxHiPAqERsococococococJUIiIiNmHKHKHMOEqEREbKH KHKHKHKHKHCVCIiIjZhzDmHoRGyhyhyhyhyhyhwlQiIiI2Ycococw4SoRERs ococococococJUIiIiMAEAEKZW5kc3RyZWFtCmVuZG9iagoKNTMgMCBvYmoK PDwKL1R5cGUgL1BhdHRlcm4KL1BhdHRlcm5UeXBlIDEKL1BhaW50VHlwZSAx Ci9UaWxpbmdUeXBlIDEKL0JCb3ggWzAgMCAxIDFdCi9YU3RlcCAxLjAwMQov WVN0ZXAgMS4wMDEKL01hdHJpeCBbMS41IDAgMCAxLjUgMCAwXQovUmVzb3Vy Y2VzIDw8IC9Qcm9jU2V0IFsvUERGIC9JbWFnZUNdIC9YT2JqZWN0IDw8IC9J bTU0IDU0IDAgUiA+PiA+PgovTGVuZ3RoIDI4Ci9GaWx0ZXIgL0ZsYXRlRGVj b2RlCj4+CnN0cmVhbQp42jPQM7O0UDBAIovSufQ9c01NFFzyuQBfwAZ+CmVu ZHN0cmVhbQplbmRvYmoKCjU2IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9T dWJ0eXBlIC9JbWFnZQovTmFtZSAvSW01NgovV2lkdGggMTYKL0hlaWdodCAx NgovQml0c1BlckNvbXBvbmVudCAxCi9JbWFnZU1hc2sgdHJ1ZQovRGVjb2Rl IFswIDFdCi9EZWNvZGVQYXJtcyA8PCAvSyAtMSAvQ29sdW1ucyAxNiA+Pgov TGVuZ3RoIDEwMgovRmlsdGVyIC9DQ0lUVEZheERlY29kZQo+PgpzdHJlYW0K JqC8ocw5hwQWIiOUOUOUOUOUOUOCCWIiIiLlDmHKHKHBBLEREXKHKHKHKHKH KHBBLERERFyhzDmHBBYiI5Q5Q5Q5Q5Q5Q4IJYiIiIuUOYcococEEsRERcoco cococococEEoAIAICmVuZHN0cmVhbQplbmRvYmoKCjU1IDAgb2JqCjw8Ci9U eXBlIC9QYXR0ZXJuCi9QYXR0ZXJuVHlwZSAxCi9QYWludFR5cGUgMQovVGls aW5nVHlwZSAxCi9CQm94IFswIDAgMSAxXQovWFN0ZXAgMS4wMDEKL1lTdGVw IDEuMDAxCi9NYXRyaXggWzEuNSAwIDAgMS41IDAgMF0KL1Jlc291cmNlcyA8 PCAvUHJvY1NldCBbL1BERiAvSW1hZ2VDXSAvWE9iamVjdCA8PCAvSW01NiA1 NiAwIFIgPj4gPj4KL0xlbmd0aCAyOAovRmlsdGVyIC9GbGF0ZURlY29kZQo+ PgpzdHJlYW0KeNoz0DOztFAwQCKL0rn0PXNNzRRc8rkAX8oGgAplbmRzdHJl YW0KZW5kb2JqCgo1OCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlw ZSAvSW1hZ2UKL05hbWUgL0ltNTgKL1dpZHRoIDE2Ci9IZWlnaHQgMTYKL0Jp dHNQZXJDb21wb25lbnQgMQovSW1hZ2VNYXNrIHRydWUKL0RlY29kZSBbMCAx XQovRGVjb2RlUGFybXMgPDwgL0sgLTEgL0NvbHVtbnMgMTYgPj4KL0xlbmd0 aCA5NwovRmlsdGVyIC9DQ0lUVEZheERlY29kZQo+PgpzdHJlYW0KJqC845hz DhLERGyhyhyhyhyhyhwlQiIiI2UOYcococJUIiI2UOUOUOUOUOUOEqERERHO OYcw4SxERsococococococJUIiIiNlDmHKHKHCVCIiNlDlDlDlDlDlDhKACA CAplbmRzdHJlYW0KZW5kb2JqCgo1NyAwIG9iago8PAovVHlwZSAvUGF0dGVy bgovUGF0dGVyblR5cGUgMQovUGFpbnRUeXBlIDEKL1RpbGluZ1R5cGUgMQov QkJveCBbMCAwIDEgMV0KL1hTdGVwIDEuMDAxCi9ZU3RlcCAxLjAwMQovTWF0 cml4IFsxLjUgMCAwIDEuNSAwIDBdCi9SZXNvdXJjZXMgPDwgL1Byb2NTZXQg Wy9QREYgL0ltYWdlQ10gL1hPYmplY3QgPDwgL0ltNTggNTggMCBSID4+ID4+ Ci9MZW5ndGggMjgKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja M9Azs7RQMEAii9K59D1zTS0UXPK5AF/UBoIKZW5kc3RyZWFtCmVuZG9iagoK NjAgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9O YW1lIC9JbTYwCi9XaWR0aCAxNgovSGVpZ2h0IDE2Ci9CaXRzUGVyQ29tcG9u ZW50IDEKL0ltYWdlTWFzayB0cnVlCi9EZWNvZGUgWzAgMV0KL0RlY29kZVBh cm1zIDw8IC9LIC0xIC9Db2x1bW5zIDE2ID4+Ci9MZW5ndGggOTkKL0ZpbHRl ciAvQ0NJVFRGYXhEZWNvZGUKPj4Kc3RyZWFtCiagvMOYcw6xEXKHKHKHKHKH KHBBLERERFyhyhzDlDlDrEREXKHKHKHKHKHKHBBLERERFzDmHMOsRFyhyhyh yhyhyhwQSxERERcococw5Q5Q6xERFyhyhyhyhyhyhwQSgAgAgAplbmRzdHJl YW0KZW5kb2JqCgo1OSAwIG9iago8PAovVHlwZSAvUGF0dGVybgovUGF0dGVy blR5cGUgMQovUGFpbnRUeXBlIDEKL1RpbGluZ1R5cGUgMQovQkJveCBbMCAw IDEgMV0KL1hTdGVwIDEuMDAxCi9ZU3RlcCAxLjAwMQovTWF0cml4IFsxLjUg MCAwIDEuNSAwIDBdCi9SZXNvdXJjZXMgPDwgL1Byb2NTZXQgWy9QREYgL0lt YWdlQ10gL1hPYmplY3QgPDwgL0ltNjAgNjAgMCBSID4+ID4+Ci9MZW5ndGgg MjgKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaM9Azs7RQMEAi i9K59D1zzQwUXPK5AF+yBnsKZW5kc3RyZWFtCmVuZG9iagoKNjIgMCBvYmoK PDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTYy Ci9XaWR0aCAxNgovSGVpZ2h0IDE2Ci9CaXRzUGVyQ29tcG9uZW50IDEKL0lt YWdlTWFzayB0cnVlCi9EZWNvZGUgWzAgMV0KL0RlY29kZVBhcm1zIDw8IC9L IC0xIC9Db2x1bW5zIDE2ID4+Ci9MZW5ndGggOTYKL0ZpbHRlciAvQ0NJVFRG YXhEZWNvZGUKPj4Kc3RyZWFtCiaguzDmHMPQiNlDlDlDlDlDlDhKhERERsoc ocw5Q5Q9CIiNlDlDlDlDlDlDhKhERERsw5hzD0IjZQ5Q5Q5Q5Q5Q4SoREREb KHKHMOUOUPQiIjZQ5Q5Q5Q5Q5Q4SgAgAgAplbmRzdHJlYW0KZW5kb2JqCgo2 MSAwIG9iago8PAovVHlwZSAvUGF0dGVybgovUGF0dGVyblR5cGUgMQovUGFp bnRUeXBlIDEKL1RpbGluZ1R5cGUgMQovQkJveCBbMCAwIDEgMV0KL1hTdGVw IDEuMDAxCi9ZU3RlcCAxLjAwMQovTWF0cml4IFsxLjUgMCAwIDEuNSAwIDBd Ci9SZXNvdXJjZXMgPDwgL1Byb2NTZXQgWy9QREYgL0ltYWdlQ10gL1hPYmpl Y3QgPDwgL0ltNjIgNjIgMCBSID4+ID4+Ci9MZW5ndGggMjgKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaM9Azs7RQMEAii9K59D1zzYwUXPK5 AF+8Bn0KZW5kc3RyZWFtCmVuZG9iagoKNjQgMCBvYmoKPDwKL1R5cGUgL1hP YmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTY0Ci9XaWR0aCAxNgov SGVpZ2h0IDE2Ci9CaXRzUGVyQ29tcG9uZW50IDEKL0ltYWdlTWFzayB0cnVl Ci9EZWNvZGUgWzAgMV0KL0RlY29kZVBhcm1zIDw8IC9LIC0xIC9Db2x1bW5z IDE2ID4+Ci9MZW5ndGggMTA1Ci9GaWx0ZXIgL0NDSVRURmF4RGVjb2RlCj4+ CnN0cmVhbQomoLyhzDmHBBYiI5Q5Q5Q5Q5Q5Q4IJYiIiIuUOUOUOYcocEFiI iI5Q5Q5Q5Q5Q5Q4IJYiIiIuUOYcw4ILERHKHKHKHKHKHKHBBLERERFyhyhyh zDlDggsRERHKHKHKHKHKHKHBBKACACAKZW5kc3RyZWFtCmVuZG9iagoKNjMg MCBvYmoKPDwKL1R5cGUgL1BhdHRlcm4KL1BhdHRlcm5UeXBlIDEKL1BhaW50 VHlwZSAxCi9UaWxpbmdUeXBlIDEKL0JCb3ggWzAgMCAxIDFdCi9YU3RlcCAx LjAwMQovWVN0ZXAgMS4wMDEKL01hdHJpeCBbMS41IDAgMCAxLjUgMCAwXQov UmVzb3VyY2VzIDw8IC9Qcm9jU2V0IFsvUERGIC9JbWFnZUNdIC9YT2JqZWN0 IDw8IC9JbTY0IDY0IDAgUiA+PiA+PgovTGVuZ3RoIDI4Ci9GaWx0ZXIgL0Zs YXRlRGVjb2RlCj4+CnN0cmVhbQp42jPQM7O0UDBAIovSufQ9c81MFFzyuQBf xgZ/CmVuZHN0cmVhbQplbmRvYmoKCjY2IDAgb2JqCjw8Ci9UeXBlIC9YT2Jq ZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW02NgovV2lkdGggMTYKL0hl aWdodCAxNgovQml0c1BlckNvbXBvbmVudCAxCi9JbWFnZU1hc2sgdHJ1ZQov RGVjb2RlIFswIDFdCi9EZWNvZGVQYXJtcyA8PCAvSyAtMSAvQ29sdW1ucyAx NiA+PgovTGVuZ3RoIDEwMAovRmlsdGVyIC9DQ0lUVEZheERlY29kZQo+Pgpz dHJlYW0KJqC845hzDhLERGyhyhyhyhyhyhwlQiIiI5xyhyhzDlDhLERERsoc ocococococJUIiIiOccw5hwliIjZQ5Q5Q5Q5Q5Q4SoREREc45Q5Q5hyhwliI iI2UOUOUOUOUOUOEoAIAIAplbmRzdHJlYW0KZW5kb2JqCgo2NSAwIG9iago8 PAovVHlwZSAvUGF0dGVybgovUGF0dGVyblR5cGUgMQovUGFpbnRUeXBlIDEK L1RpbGluZ1R5cGUgMQovQkJveCBbMCAwIDEgMV0KL1hTdGVwIDEuMDAxCi9Z U3RlcCAxLjAwMQovTWF0cml4IFsxLjUgMCAwIDEuNSAwIDBdCi9SZXNvdXJj ZXMgPDwgL1Byb2NTZXQgWy9QREYgL0ltYWdlQ10gL1hPYmplY3QgPDwgL0lt NjYgNjYgMCBSID4+ID4+Ci9MZW5ndGggMjgKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjaM9Azs7RQMEAii9K59D1zzcwUXPK5AF/QBoEKZW5k c3RyZWFtCmVuZG9iagoKNjggMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1 YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTY4Ci9XaWR0aCAxNgovSGVpZ2h0IDE2 Ci9CaXRzUGVyQ29tcG9uZW50IDEKL0ltYWdlTWFzayB0cnVlCi9EZWNvZGUg WzAgMV0KL0RlY29kZVBhcm1zIDw8IC9LIC0xIC9Db2x1bW5zIDE2ID4+Ci9M ZW5ndGggOTkKL0ZpbHRlciAvQ0NJVFRGYXhEZWNvZGUKPj4Kc3RyZWFtCiag vMOYcw6xEXKHKHKHKHKHKHBBLERERFzDlDlDmHBBLEREXKHKHKHKHKHKHBBL ERERFzDmHMOsRFyhyhyhyhyhyhwQSxERERcw5Q5Q5hwQSxERFyhyhyhyhyhy hwQSgAgAgAplbmRzdHJlYW0KZW5kb2JqCgo2NyAwIG9iago8PAovVHlwZSAv UGF0dGVybgovUGF0dGVyblR5cGUgMQovUGFpbnRUeXBlIDEKL1RpbGluZ1R5 cGUgMQovQkJveCBbMCAwIDEgMV0KL1hTdGVwIDEuMDAxCi9ZU3RlcCAxLjAw MQovTWF0cml4IFsxLjUgMCAwIDEuNSAwIDBdCi9SZXNvdXJjZXMgPDwgL1By b2NTZXQgWy9QREYgL0ltYWdlQ10gL1hPYmplY3QgPDwgL0ltNjggNjggMCBS ID4+ID4+Ci9MZW5ndGggMjgKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3Ry ZWFtCnjaM9Azs7RQMEAii9K59D1zzSwUXPK5AF/aBoMKZW5kc3RyZWFtCmVu ZG9iagoKNzAgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0lt YWdlCi9OYW1lIC9JbTcwCi9XaWR0aCAxNgovSGVpZ2h0IDE2Ci9CaXRzUGVy Q29tcG9uZW50IDEKL0ltYWdlTWFzayB0cnVlCi9EZWNvZGUgWzAgMV0KL0Rl Y29kZVBhcm1zIDw8IC9LIC0xIC9Db2x1bW5zIDE2ID4+Ci9MZW5ndGggOTUK L0ZpbHRlciAvQ0NJVFRGYXhEZWNvZGUKPj4Kc3RyZWFtCiaguzDmHMPQiNlD lDlDlDlDlDhKhERERsw5Q5Q5hwlQiIjZQ5Q5Q5Q5Q5Q4SoREREbMOYcw9CI2 UOUOUOUOUOUOEqERERGzDlDlDmHCVCIiNlDlDlDlDlDlDhKACACACmVuZHN0 cmVhbQplbmRvYmoKCjY5IDAgb2JqCjw8Ci9UeXBlIC9QYXR0ZXJuCi9QYXR0 ZXJuVHlwZSAxCi9QYWludFR5cGUgMQovVGlsaW5nVHlwZSAxCi9CQm94IFsw IDAgMSAxXQovWFN0ZXAgMS4wMDEKL1lTdGVwIDEuMDAxCi9NYXRyaXggWzEu NSAwIDAgMS41IDAgMF0KL1Jlc291cmNlcyA8PCAvUHJvY1NldCBbL1BERiAv SW1hZ2VDXSAvWE9iamVjdCA8PCAvSW03MCA3MCAwIFIgPj4gPj4KL0xlbmd0 aCAyOAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoz0DOztFAw QCKL0rn0PXPNDRRc8rkAX7gGfAplbmRzdHJlYW0KZW5kb2JqCgo3MSAwIG9i ago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0lt NzEKL1dpZHRoIDEKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDEKL0Nv bG9yU3BhY2UgL0RldmljZUdyYXkKL0RlY29kZVBhcm1zIDw8IC9LIC0xIC9D b2x1bW5zIDEgPj4KL0xlbmd0aCA0Ci9GaWx0ZXIgL0NDSVRURmF4RGVjb2Rl Cj4+CnN0cmVhbQqACACACmVuZHN0cmVhbQplbmRvYmoKCjcyIDAgb2JqCjw8 Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW03Mgov V2lkdGggMQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JT cGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAwIDxjNmM2YzY+XQovTGVuZ3Ro IDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYwAAAAEAAQpl bmRzdHJlYW0KZW5kb2JqCgo3MyAwIG9iago8PAovVHlwZSAvWE9iamVjdAov U3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltNzMKL1dpZHRoIDMKL0hlaWdodCAx Ci9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9E ZXZpY2VSR0IgMSA8ZmZmZmZmYzZjNmM2Pl0KL0xlbmd0aCA5Ci9GaWx0ZXIg L0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hMBAAAVABUKZW5kc3RyZWFtCmVu ZG9iagoKNzQgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0lt YWdlCi9OYW1lIC9JbTc0Ci9XaWR0aCAxMgovSGVpZ2h0IDEKL0JpdHNQZXJD b21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAx IDxmZmZmZmZmM2YzZjM+XQovTGVuZ3RoIDExCi9GaWx0ZXIgL0ZsYXRlRGVj b2RlCj4+CnN0cmVhbQp42mNgYAQAAAQAAgplbmRzdHJlYW0KZW5kb2JqCgo3 NSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05h bWUgL0ltNzUKL1dpZHRoIDYKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50 IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8ZmZmZmZm ZjNmM2YzPl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+Pgpz dHJlYW0KeNpjYQAAAAoABQplbmRzdHJlYW0KZW5kb2JqCgo3NiAwIG9iago8 PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltNzYK L1dpZHRoIDQKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8ZmZmZmZmZmRmZGZkPl0K L0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mME AAACAAIKZW5kc3RyZWFtCmVuZG9iagoKNzcgMCBvYmoKPDwKL1R5cGUgL1hP YmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTc3Ci9XaWR0aCAzCi9I ZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5k ZXhlZCAvRGV2aWNlUkdCIDEgPGZmZmZmZmYzZjNmMz5dCi9MZW5ndGggOQov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjAQAABQAFCmVuZHN0 cmVhbQplbmRvYmoKCjc4IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0 eXBlIC9JbWFnZQovTmFtZSAvSW03OAovV2lkdGggNAovSGVpZ2h0IDEKL0Jp dHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rldmlj ZVJHQiAxIDxmZmZmZmZmZWZlZmU+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxh dGVEZWNvZGUKPj4Kc3RyZWFtCnjaYwQAAAIAAgplbmRzdHJlYW0KZW5kb2Jq Cgo3OSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UK L05hbWUgL0ltNzkKL1dpZHRoIDMKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9u ZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8ZmZm ZmZmZmVmZWZlPl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+ CnN0cmVhbQp42mMBAAAFAAUKZW5kc3RyZWFtCmVuZG9iagoKODAgMCBvYmoK PDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTgw Ci9XaWR0aCA5Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xv clNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEgPGZmZmZmZmZkZmRmZD5d Ci9MZW5ndGggMTEKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja Y2RgAAAABgACCmVuZHN0cmVhbQplbmRvYmoKCjgxIDAgb2JqCjw8Ci9UeXBl IC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW04MQovV2lkdGgg NgovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiAxIDxjNmM2YzZmZmZmZmY+XQovTGVuZ3Ro IDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMNAAAAXABW CmVuZHN0cmVhbQplbmRvYmoKCjgyIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0 Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW04MgovV2lkdGggMTYKL0hlaWdo dCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVk IC9EZXZpY2VSR0IgMSA8ZmZmZmZmZmRmZGZkPl0KL0xlbmd0aCAxMgovRmls dGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjYGBhAAAADAAFCmVuZHN0 cmVhbQplbmRvYmoKCjgzIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0 eXBlIC9JbWFnZQovTmFtZSAvSW04MwovV2lkdGggMTYKL0hlaWdodCAxCi9C aXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZp Y2VSR0IgMSA8ZmZmZmZmZmVmZWZlPl0KL0xlbmd0aCAxMgovRmlsdGVyIC9G bGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjYGBhAAAADAAFCmVuZHN0cmVhbQpl bmRvYmoKCjg0IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9J bWFnZQovTmFtZSAvSW04NAovV2lkdGggMTAKL0hlaWdodCAxCi9CaXRzUGVy Q29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0Ig MSA8YzZjNmM2ZmZmZmZmPl0KL0xlbmd0aCAxMQovRmlsdGVyIC9GbGF0ZURl Y29kZQo+PgpzdHJlYW0KeNpjDQ0AAAEMAKsKZW5kc3RyZWFtCmVuZG9iagoK ODUgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9O YW1lIC9JbTg1Ci9XaWR0aCAzMgovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25l bnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxIDxjNmM2 YzZmZmZmZmY+XQovTGVuZ3RoIDExCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+ CnN0cmVhbQp42mMNhQAACXwCWQplbmRzdHJlYW0KZW5kb2JqCgo4NiAwIG9i ago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0lt ODYKL1dpZHRoIDI1Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9D b2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPGZmZmZmZmY0ZjRm NGY2ZjZmNj5dCi9MZW5ndGggMTUKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4K c3RyZWFtCnjaY2BgYGxgYAAAAYsAggplbmRzdHJlYW0KZW5kb2JqCgo4NyAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltODcKL1dpZHRoIDMyCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0 Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDQgPGM2YzZjNmZm ZmZmZmU1ZTVlNWNkY2RjZGNlY2VjZT5dCi9MZW5ndGggMTgKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYxAEASFmF2MDMAsACtQBZwplbmRz dHJlYW0KZW5kb2JqCgo4OCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3Vi dHlwZSAvSW1hZ2UKL05hbWUgL0ltODgKL1dpZHRoIDMyCi9IZWlnaHQgMQov Qml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2 aWNlUkdCIDQgPGM2YzZjNmZmZmZmZmY0ZjRmNGNkY2RjZGNlY2VjZT5dCi9M ZW5ndGggMjAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYxAE AiETZ2NjEwcQEwAO7gHsCmVuZHN0cmVhbQplbmRvYmoKCjg5IDAgb2JqCjw8 Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW04OQov V2lkdGggMzIKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8YzZjNmM2ZmZmZmZmY2Vj ZWNlY2RjZGNkPl0KL0xlbmd0aCAxNgovRmlsdGVyIC9GbGF0ZURlY29kZQo+ PgpzdHJlYW0KeNpjDQ3a//vf1FAAEI8ETwplbmRzdHJlYW0KZW5kb2JqCgo5 MCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05h bWUgL0ltOTAKL1dpZHRoIDIzCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVu dCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPGZmZmZm ZmNlY2VjZWNkY2RjZD5dCi9MZW5ndGggMTQKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjaY0yLmraCAQAGhAIACmVuZHN0cmVhbQplbmRvYmoK CjkxIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQov TmFtZSAvSW05MQovV2lkdGggNgovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25l bnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxIDxjNmM2 YzZmZmZmZmY+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+ CnN0cmVhbQp42mMQAAAAEgARCmVuZHN0cmVhbQplbmRvYmoKCjkyIDAgb2Jq Cjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW05 MgovV2lkdGggMjIKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0Nv bG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8ZmZmZmZmY2VjZWNl Y2RjZGNkPl0KL0xlbmd0aCAxNAovRmlsdGVyIC9GbGF0ZURlY29kZQo+Pgpz dHJlYW0KeNpjzVo1M5UBAAdzAhgKZW5kc3RyZWFtCmVuZG9iagoKOTMgMCBv YmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9J bTkzCi9XaWR0aCAyMQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgov Q29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAzIDxmZmZmZmZjNmM2 YzZjZWNlY2VjZGNkY2Q+XQovTGVuZ3RoIDE0Ci9GaWx0ZXIgL0ZsYXRlRGVj b2RlCj4+CnN0cmVhbQp42pPe9f/3fgYADLUDjwplbmRzdHJlYW0KZW5kb2Jq Cgo5NCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UK L05hbWUgL0ltOTQKL1dpZHRoIDIwCi9IZWlnaHQgMQovQml0c1BlckNvbXBv bmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPGNk Y2RjZGNlY2VjZWZlZmVmZT5dCi9MZW5ndGggMTMKL0ZpbHRlciAvRmxhdGVE ZWNvZGUKPj4Kc3RyZWFtCnjaYxVkEGADAACIAC0KZW5kc3RyZWFtCmVuZG9i agoKOTUgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdl Ci9OYW1lIC9JbTk1Ci9XaWR0aCAyMwovSGVpZ2h0IDEKL0JpdHNQZXJDb21w b25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDxm ZmZmZmZjZGNkY2RjZWNlY2U+XQovTGVuZ3RoIDE0Ci9GaWx0ZXIgL0ZsYXRl RGVjb2RlCj4+CnN0cmVhbQp42mOcmro0agkAB9ACnwplbmRzdHJlYW0KZW5k b2JqCgo5NiAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1h Z2UKL05hbWUgL0ltOTYKL1dpZHRoIDIzCi9IZWlnaHQgMQovQml0c1BlckNv bXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMg PGZmZmZmZmNlY2VjZWNkY2RjZGQ3ZDdkNz5dCi9MZW5ndGggMTQKL0ZpbHRl ciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaE81Km5p2AAAHeQKhCmVuZHN0 cmVhbQplbmRvYmoKCjk3IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0 eXBlIC9JbWFnZQovTmFtZSAvSW05NwovV2lkdGggMjMKL0hlaWdodCAxCi9C aXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZp Y2VSR0IgMyA8ZmZmZmZmY2RjZGNkY2VjZWNlZDdkN2Q3Pl0KL0xlbmd0aCAx NAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTWrkycuYBAAmQ Ax8KZW5kc3RyZWFtCmVuZG9iagoKOTggMCBvYmoKPDwKL1R5cGUgL1hPYmpl Y3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTk4Ci9XaWR0aCAyMwovSGVp Z2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4 ZWQgL0RldmljZVJHQiAzIDxmZmZmZmZjZWNlY2VjZGNkY2RkN2Q3ZDc+XQov TGVuZ3RoIDE0Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hOb tXTlsgMACicDZQplbmRzdHJlYW0KZW5kb2JqCgo5OSAwIG9iago8PAovVHlw ZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltOTkKL1dpZHRo IDIzCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNl IFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMgPGZmZmZmZmNkY2RjZGNlY2VjZWQ3 ZDdkNz5dCi9MZW5ndGggMTQKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3Ry ZWFtCnjaE4uaGhp1AAAHEwJ1CmVuZHN0cmVhbQplbmRvYmoKCjEwMCAwIG9i ago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0lt MTAwCi9XaWR0aCAyMwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgov Q29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDxmZmZmZmZjZGNk Y2RjZWNlY2U+XQovTGVuZ3RoIDE0Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+ CnN0cmVhbQp42pOcOXNqlgMACNACiwplbmRzdHJlYW0KZW5kb2JqCgoxMDEg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTEwMQovV2lkdGggMjIKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50 IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8ZmZmZmZm Y2RjZGNkY2VjZWNlPl0KL0xlbmd0aCAxNAovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNpjmxqZmpoAAAbQAh8KZW5kc3RyZWFtCmVuZG9iagoK MTAyIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQov TmFtZSAvSW0xMDIKL1dpZHRoIDIxCi9IZWlnaHQgMQovQml0c1BlckNvbXBv bmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPGZm ZmZmZmNkY2RjZGNlY2VjZT5dCi9MZW5ndGggMTQKL0ZpbHRlciAvRmxhdGVE ZWNvZGUKPj4Kc3RyZWFtCnjak4oKnZbCAAAGQgHECmVuZHN0cmVhbQplbmRv YmoKCjEwMyAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1h Z2UKL05hbWUgL0ltMTAzCi9XaWR0aCAxOAovSGVpZ2h0IDEKL0JpdHNQZXJD b21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAx IDxjZWNlY2VjZGNkY2Q+XQovTGVuZ3RoIDEzCi9GaWx0ZXIgL0ZsYXRlRGVj b2RlCj4+CnN0cmVhbQp42mMIZXAUAAAB6wCnCmVuZHN0cmVhbQplbmRvYmoK CjEwNCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UK L05hbWUgL0ltMTA0Ci9XaWR0aCAxOAovSGVpZ2h0IDEKL0JpdHNQZXJDb21w b25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDxm ZmZmZmZjZWNlY2VjZGNkY2Q+XQovTGVuZ3RoIDEzCi9GaWx0ZXIgL0ZsYXRl RGVjb2RlCj4+CnN0cmVhbQp42hONCsucAAAEOgG/CmVuZHN0cmVhbQplbmRv YmoKCjEwNSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1h Z2UKL05hbWUgL0ltMTA1Ci9XaWR0aCAxNwovSGVpZ2h0IDEKL0JpdHNQZXJD b21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAz IDxkN2Q3ZDdjZWNlY2VjZGNkY2RmZmZmZmY+XQovTGVuZ3RoIDEzCi9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hOdmTrxAAAF4wJlCmVuZHN0 cmVhbQplbmRvYmoKCjEwNiAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3Vi dHlwZSAvSW1hZ2UKL05hbWUgL0ltMTA2Ci9XaWR0aCAxNgovSGVpZ2h0IDEK L0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rl dmljZVJHQiAyIDxmZmZmZmZjZWNlY2VjZGNkY2Q+XQovTGVuZ3RoIDEyCi9G aWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hONDE0BAAJxASgKZW5k c3RyZWFtCmVuZG9iagoKMTA3IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9T dWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xMDcKL1dpZHRoIDEzCi9IZWlnaHQg MQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAv RGV2aWNlUkdCIDIgPGZmZmZmZmNlY2VjZWNkY2RjZD5dCi9MZW5ndGggMTIK L0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjakwqNYgAAAh8Aygpl bmRzdHJlYW0KZW5kb2JqCgoxMDggMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QK L1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTEwOAovV2lkdGggMTAKL0hlaWdo dCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVk IC9EZXZpY2VSR0IgMiA8ZmZmZmZmY2VjZWNlY2RjZGNkPl0KL0xlbmd0aCAx MQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjW8kAAAFnALAK ZW5kc3RyZWFtCmVuZG9iagoKMTA5IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0 Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xMDkKL1dpZHRoIDUKL0hlaWdo dCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVk IC9EZXZpY2VSR0IgMSA8YzZjNmM2ZmZmZmZmPl0KL0xlbmd0aCAxMAovRmls dGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjcAAAAEIAQQplbmRzdHJl YW0KZW5kb2JqCgoxMTAgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5 cGUgL0ltYWdlCi9OYW1lIC9JbTExMAovV2lkdGggMwovSGVpZ2h0IDEKL0Jp dHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rldmlj ZVJHQiAxIDxmZmZmZmZjNmM2YzY+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxh dGVEZWNvZGUKPj4Kc3RyZWFtCnjaYwEAAAUABQplbmRzdHJlYW0KZW5kb2Jq CgoxMTEgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdl Ci9OYW1lIC9JbTExMQovV2lkdGggNQovSGVpZ2h0IDEKL0JpdHNQZXJDb21w b25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxIDxm ZmZmZmZjNmM2YzY+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2Rl Cj4+CnN0cmVhbQp42hNlAAAALAAWCmVuZHN0cmVhbQplbmRvYmoKCjExMiAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltMTEyCi9XaWR0aCA3Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAy Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPGQwZDBkMGU5 ZTllOWZmZmZmZj5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUK Pj4Kc3RyZWFtCnjak5wBAADMALIKZW5kc3RyZWFtCmVuZG9iagoKMTEzIDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW0xMTMKL1dpZHRoIDIKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIK L0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8ZmZmZmZmYzZj NmM2Pl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVh bQp42hMAAAARABEKZW5kc3RyZWFtCmVuZG9iagoKMTE0IDAgb2JqCjw8Ci9U eXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xMTQKL1dp ZHRoIDQKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3Bh Y2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8YzZjNmM2ZmZmZmZmPl0KL0xl bmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMEAAAC AAIKZW5kc3RyZWFtCmVuZG9iagoKMTE1IDAgb2JqCjw8Ci9UeXBlIC9YT2Jq ZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xMTUKL1dpZHRoIDQKL0hl aWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRl eGVkIC9EZXZpY2VSR0IgMSA8ZmZmZmZmYzZjNmM2Pl0KL0xlbmd0aCA5Ci9G aWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hMFAAAWABYKZW5kc3Ry ZWFtCmVuZG9iagoKMTE2IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0 eXBlIC9JbWFnZQovTmFtZSAvSW0xMTYKL1dpZHRoIDkKL0hlaWdodCAxCi9C aXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZp Y2VSR0IgMSA8ZmZmZmZmYzZjNmM2Pl0KL0xlbmd0aCAxMQovRmlsdGVyIC9G bGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTDWUAAADsAGsKZW5kc3RyZWFtCmVu ZG9iagoKMTE3IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9J bWFnZQovTmFtZSAvSW0xMTcKL1dpZHRoIDUKL0hlaWdodCAxCi9CaXRzUGVy Q29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0Ig MSA8ZmZmZmZmYzZjNmM2Pl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURl Y29kZQo+PgpzdHJlYW0KeNoTdQAAAGwAVgplbmRzdHJlYW0KZW5kb2JqCgox MTggMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9O YW1lIC9JbTExOAovV2lkdGggNgovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25l bnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxIDxmZmZm ZmZjNmM2YzY+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+ CnN0cmVhbQp42mNlAAAADAAGCmVuZHN0cmVhbQplbmRvYmoKCjExOSAwIG9i ago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0lt MTE5Ci9XaWR0aCA5Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9D b2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEgPGZmZmZmZmM2YzZj Nj5dCi9MZW5ndGggMTEKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFt CnjaYw1gAAAAsgBWCmVuZHN0cmVhbQplbmRvYmoKCjEyMCAwIG9iago8PAov VHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTIwCi9X aWR0aCA3Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNw YWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEgPGZmZmZmZmM2YzZjNj5dCi9M ZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYwwA AABUAFIKZW5kc3RyZWFtCmVuZG9iagoKMTIxIDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xMjEKL1dpZHRoIDgK L0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9J bmRleGVkIC9EZXZpY2VSR0IgMSA8ZmZmZmZmYzZjNmM2Pl0KL0xlbmd0aCAx MAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTYAAAACIAEQpl bmRzdHJlYW0KZW5kb2JqCgoxMjIgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QK L1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTEyMgovV2lkdGggNwovSGVpZ2h0 IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQg L0RldmljZVJHQiAxIDxmZmZmZmZjNmM2YzY+XQovTGVuZ3RoIDEwCi9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mN1AAAATABGCmVuZHN0cmVh bQplbmRvYmoKCjEyMyAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlw ZSAvSW1hZ2UKL05hbWUgL0ltMTIzCi9XaWR0aCA4Ci9IZWlnaHQgMQovQml0 c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNl UkdCIDEgPGZmZmZmZmM2YzZjNj5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxh dGVEZWNvZGUKPj4Kc3RyZWFtCnjaY3UAAABMAEYKZW5kc3RyZWFtCmVuZG9i agoKMTI0IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFn ZQovTmFtZSAvSW0xMjQKL1dpZHRoIDkKL0hlaWdodCAxCi9CaXRzUGVyQ29t cG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8 ZmZmZmZmYzZjNmM2Pl0KL0xlbmd0aCAxMQovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNoTDXUAAAEsAKsKZW5kc3RyZWFtCmVuZG9iagoKMTI1 IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFt ZSAvSW0xMjUKL1dpZHRoIDMKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50 IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8ZmZmZmZm ZTllOWU5Pl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0 cmVhbQp42hMAAAARABEKZW5kc3RyZWFtCmVuZG9iagoKMTI2IDAgb2JqCjw8 Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xMjYK L1dpZHRoIDYKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8ZmZmZmZmZTllOWU5Pl0K L0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpj ZQAAAAwABgplbmRzdHJlYW0KZW5kb2JqCgoxMjcgMCBvYmoKPDwKL1R5cGUg L1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTEyNwovV2lkdGgg MjUKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2Ug Wy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8ZmZmZmZmZTllOWU5YzZjNmM2Pl0K L0xlbmd0aCAxNQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpj dOBawMDAAAAEQADsCmVuZHN0cmVhbQplbmRvYmoKCjEyOCAwIG9iago8PAov VHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTI4Ci9X aWR0aCA4Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNw YWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEgPGQ0ZDRkNGM2YzZjNj5dCi9M ZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaEw0F AACBAGsKZW5kc3RyZWFtCmVuZG9iagoKMTI5IDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xMjkKL1dpZHRoIDgK L0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9J bmRleGVkIC9EZXZpY2VSR0IgMSA8YzZjNmM2ZmZmZmZmPl0KL0xlbmd0aCAx MAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjYAQAAAMAAgpl bmRzdHJlYW0KZW5kb2JqCgoxMzAgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QK L1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTEzMAovV2lkdGggMTQKL0hlaWdo dCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVk IC9EZXZpY2VSR0IgMSA8YzZjNmM2ZmZmZmZmPl0KL0xlbmd0aCAxMgovRmls dGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjCHAQAAABhAChCmVuZHN0 cmVhbQplbmRvYmoKCjEzMSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3Vi dHlwZSAvSW1hZ2UKL05hbWUgL0ltMTMxCi9XaWR0aCAxMAovSGVpZ2h0IDEK L0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rl dmljZVJHQiAxIDxmZmZmZmZjNmM2YzY+XQovTGVuZ3RoIDExCi9GaWx0ZXIg L0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hMNdQAAASwAqwplbmRzdHJlYW0K ZW5kb2JqCgoxMzIgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTEzMgovV2lkdGggNgovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiAxIDxmZmZmZmZjNmM2YzY+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRl RGVjb2RlCj4+CnN0cmVhbQp42hN1AAAAbABWCmVuZHN0cmVhbQplbmRvYmoK CjEzMyAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UK L05hbWUgL0ltMTMzCi9XaWR0aCAxMQovSGVpZ2h0IDEKL0JpdHNQZXJDb21w b25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxIDxj NmM2YzZmZmZmZmY+XQovTGVuZ3RoIDExCi9GaWx0ZXIgL0ZsYXRlRGVjb2Rl Cj4+CnN0cmVhbQp42mN0EAEAAJoAVgplbmRzdHJlYW0KZW5kb2JqCgoxMzQg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTEzNAovV2lkdGggMTAKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50 IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8YzZjNmM2 ZjdmN2Y3ZDBkMGQwPl0KL0xlbmd0aCAxMQovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNpjEFAAAABDADEKZW5kc3RyZWFtCmVuZG9iagoKMTM1 IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFt ZSAvSW0xMzUKL1dpZHRoIDkKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50 IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8YzZjNmM2 ZmZmZmZmPl0KL0xlbmd0aCAxMQovRmlsdGVyIC9GbGF0ZURlY29kZQo+Pgpz dHJlYW0KeNpjYHQAAABFAEIKZW5kc3RyZWFtCmVuZG9iagoKMTM2IDAgb2Jq Cjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0x MzYKL1dpZHRoIDgKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0Nv bG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8ZmZmZmZmYzZjNmM2 Pl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0K eNoTDQEAAIAAagplbmRzdHJlYW0KZW5kb2JqCgoxMzcgMCBvYmoKPDwKL1R5 cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTEzNwovV2lk dGggOAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFj ZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxIDxmZmZmZmZjNmM2YzY+XQovTGVu Z3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hMNBQAA gQBrCmVuZHN0cmVhbQplbmRvYmoKCjEzOCAwIG9iago8PAovVHlwZSAvWE9i amVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTM4Ci9XaWR0aCAxMAov SGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0lu ZGV4ZWQgL0RldmljZVJHQiAxIDxmZmZmZmZjNmM2YzY+XQovTGVuZ3RoIDEx Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hMNDQAAATwAuwpl bmRzdHJlYW0KZW5kb2JqCgoxMzkgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QK L1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTEzOQovV2lkdGggMTQKL0hlaWdo dCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVk IC9EZXZpY2VSR0IgMSA8YzZjNmM2ZmZmZmZmPl0KL0xlbmd0aCAxMgovRmls dGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjYHAQAAAAlABRCmVuZHN0 cmVhbQplbmRvYmoKCjE0MCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3Vi dHlwZSAvSW1hZ2UKL05hbWUgL0ltMTQwCi9XaWR0aCA5Ci9IZWlnaHQgMQov Qml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2 aWNlUkdCIDEgPGM2YzZjNmZmZmZmZj5dCi9MZW5ndGggMTEKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY2BwAAAAQwBBCmVuZHN0cmVhbQpl bmRvYmoKCjE0MSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAv SW1hZ2UKL05hbWUgL0ltMTQxCi9XaWR0aCAxNQovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiAxIDxmZmZmZmZjNmM2YzY+XQovTGVuZ3RoIDEyCi9GaWx0ZXIgL0ZsYXRl RGVjb2RlCj4+CnN0cmVhbQp42mMIEXUAAAFqAKoKZW5kc3RyZWFtCmVuZG9i agoKMTQyIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFn ZQovTmFtZSAvSW0xNDIKL1dpZHRoIDExCi9IZWlnaHQgMQovQml0c1BlckNv bXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEg PGM2YzZjNmZmZmZmZj5dCi9MZW5ndGggMTEKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjaY2BgAQAABwAFCmVuZHN0cmVhbQplbmRvYmoKCjE0 MyAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05h bWUgL0ltMTQzCi9XaWR0aCAyMQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25l bnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxIDxmZmZm ZmZjNmM2YzY+XQovTGVuZ3RoIDE0Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+ CnN0cmVhbQp42hMNDRENZQAABGYBKQplbmRzdHJlYW0KZW5kb2JqCgoxNDQg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTE0NAovV2lkdGggMTkKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50 IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8YzZjNmM2 ZmZmZmZmPl0KL0xlbmd0aCAxMwovRmlsdGVyIC9GbGF0ZURlY29kZQo+Pgpz dHJlYW0KeNpjcGAQYAEAASkAVQplbmRzdHJlYW0KZW5kb2JqCgoxNDUgMCBv YmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9J bTE0NQovV2lkdGggMTAKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIK L0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8ZmZmZmZmYzZj NmM2Pl0KL0xlbmd0aCAxMQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl YW0KeNoTCHUAAAEdAKYKZW5kc3RyZWFtCmVuZG9iagoKMTQ2IDAgb2JqCjw8 Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNDYK L1dpZHRoIDkKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8YzZjNmM2ZmZmZmZmPl0K L0xlbmd0aCAxMQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpj CHEAAADrAJUKZW5kc3RyZWFtCmVuZG9iagoKMTQ3IDAgb2JqCjw8Ci9UeXBl IC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNDcKL1dpZHRo IDEyCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNl IFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEgPGZmZmZmZmM2YzZjNj5dCi9MZW5n dGggMTEKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaE2UNAQAA oABvCmVuZHN0cmVhbQplbmRvYmoKCjE0OCAwIG9iago8PAovVHlwZSAvWE9i amVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTQ4Ci9XaWR0aCA5Ci9I ZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5k ZXhlZCAvRGV2aWNlUkdCIDEgPGM2YzZjNmZmZmZmZj5dCi9MZW5ndGggMTEK L0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYwhgAAAAowBRCmVu ZHN0cmVhbQplbmRvYmoKCjE0OSAwIG9iago8PAovVHlwZSAvWE9iamVjdAov U3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTQ5Ci9XaWR0aCA5Ci9IZWlnaHQg MQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAv RGV2aWNlUkdCIDEgPGZmZmZmZmM2YzZjNj5dCi9MZW5ndGggMTEKL0ZpbHRl ciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaE3VgAAAAwgBWCmVuZHN0cmVh bQplbmRvYmoKCjE1MCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlw ZSAvSW1hZ2UKL05hbWUgL0ltMTUwCi9XaWR0aCA5Ci9IZWlnaHQgMQovQml0 c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNl UkdCIDIgPGM2YzZjNmZmZmZmZmQ0ZDRkND5dCi9MZW5ndGggMTEKL0ZpbHRl ciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY21gAAABEgCGCmVuZHN0cmVh bQplbmRvYmoKCjE1MSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlw ZSAvSW1hZ2UKL05hbWUgL0ltMTUxCi9XaWR0aCA5Ci9IZWlnaHQgMQovQml0 c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNl UkdCIDEgPGZmZmZmZmM2YzZjNj5dCi9MZW5ndGggMTEKL0ZpbHRlciAvRmxh dGVEZWNvZGUKPj4Kc3RyZWFtCnjaE3V0AAABBACXCmVuZHN0cmVhbQplbmRv YmoKCjE1MiAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1h Z2UKL05hbWUgL0ltMTUyCi9XaWR0aCAxMgovSGVpZ2h0IDEKL0JpdHNQZXJD b21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAx IDxmZmZmZmZjNmM2YzY+XQovTGVuZ3RoIDExCi9GaWx0ZXIgL0ZsYXRlRGVj b2RlCj4+CnN0cmVhbQp42hMNDAEAATgAuwplbmRzdHJlYW0KZW5kb2JqCgox NTMgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9O YW1lIC9JbTE1MwovV2lkdGggMTIKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9u ZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8YzZj NmM2ZmZmZmZmPl0KL0xlbmd0aCAxMQovRmlsdGVyIC9GbGF0ZURlY29kZQo+ PgpzdHJlYW0KeNpjCGUEAACuAFcKZW5kc3RyZWFtCmVuZG9iagoKMTU0IDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW0xNTQKL1dpZHRoIDE5Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAy Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEgPGZmZmZmZmM2 YzZjNj5dCi9MZW5ndGggMTMKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3Ry ZWFtCnjaExUNdQ0AAAKbARUKZW5kc3RyZWFtCmVuZG9iagoKMTU1IDAgb2Jq Cjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0x NTUKL1dpZHRoIDUKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0Nv bG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8YzZjNmM2ZGNkY2Rj Pl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0K eNpjcAAAAEIAQQplbmRzdHJlYW0KZW5kb2JqCgoxNTYgMCBvYmoKPDwKL1R5 cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE1NgovV2lk dGggOQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFj ZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxIDxmZmZmZmZjNmM2YzY+XQovTGVu Z3RoIDExCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hNldQAA AIwAWwplbmRzdHJlYW0KZW5kb2JqCgoxNTcgMCBvYmoKPDwKL1R5cGUgL1hP YmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE1NwovV2lkdGggMTEK L0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9J bmRleGVkIC9EZXZpY2VSR0IgMSA8YzZjNmM2ZmZmZmZmPl0KL0xlbmd0aCAx MQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjEGEAAAArABUK ZW5kc3RyZWFtCmVuZG9iagoKMTU4IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0 Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNTgKL1dpZHRoIDEzCi9IZWln aHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhl ZCAvRGV2aWNlUkdCIDEgPGZmZmZmZmM2YzZjNj5dCi9MZW5ndGggMTIKL0Zp bHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYwhlYAAAAQMAVgplbmRz dHJlYW0KZW5kb2JqCgoxNTkgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1 YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE1OQovV2lkdGggMTIKL0hlaWdodCAx Ci9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9E ZXZpY2VSR0IgMiA8ZmZmZmZmYzZjNmM2ZDBkMGQwPl0KL0xlbmd0aCAxMQov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTdQwDAAEaAK0KZW5k c3RyZWFtCmVuZG9iagoKMTYwIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9T dWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNjAKL1dpZHRoIDI1Ci9IZWlnaHQg MQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAv RGV2aWNlUkdCIDIgPGZmZmZmZmM2YzZjNmQ0ZDRkND5dCi9MZW5ndGggMTUK L0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaE+UMDXUIZQAABTcB XgplbmRzdHJlYW0KZW5kb2JqCgoxNjEgMCBvYmoKPDwKL1R5cGUgL1hPYmpl Y3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE2MQovV2lkdGggOAovSGVp Z2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4 ZWQgL0RldmljZVJHQiAyIDxjNmM2YzZkMGQwZDBmZmZmZmY+XQovTGVuZ3Ro IDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNgAwAACAAH CmVuZHN0cmVhbQplbmRvYmoKCjE2MiAwIG9iago8PAovVHlwZSAvWE9iamVj dAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTYyCi9XaWR0aCA4Ci9IZWln aHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhl ZCAvRGV2aWNlUkdCIDEgPGM2YzZjNmZmZmZmZj5dCi9MZW5ndGggMTAKL0Zp bHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY2QAAAAEAAIKZW5kc3Ry ZWFtCmVuZG9iagoKMTYzIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0 eXBlIC9JbWFnZQovTmFtZSAvSW0xNjMKL1dpZHRoIDEzCi9IZWlnaHQgMQov Qml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2 aWNlUkdCIDEgPGZmZmZmZmM2YzZjNj5dCi9MZW5ndGggMTIKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYw0IdQAAAfIA6wplbmRzdHJlYW0K ZW5kb2JqCgoxNjQgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTE2NAovV2lkdGggMTAKL0hlaWdodCAxCi9CaXRz UGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VS R0IgMSA8YzZjNmM2ZmZmZmZmPl0KL0xlbmd0aCAxMQovRmlsdGVyIC9GbGF0 ZURlY29kZQo+PgpzdHJlYW0KeNpjCBAAAACzAGEKZW5kc3RyZWFtCmVuZG9i agoKMTY1IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFn ZQovTmFtZSAvSW0xNjUKL1dpZHRoIDE4Ci9IZWlnaHQgMQovQml0c1BlckNv bXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIg PGM2YzZjNmZmZmZmZmU5ZTllOT5dCi9MZW5ndGggMTMKL0ZpbHRlciAvRmxh dGVEZWNvZGUKPj4Kc3RyZWFtCnjaYwgQYVAAAAGhAIUKZW5kc3RyZWFtCmVu ZG9iagoKMTY2IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9J bWFnZQovTmFtZSAvSW0xNjYKL1dpZHRoIDE3Ci9IZWlnaHQgMQovQml0c1Bl ckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdC IDEgPGZmZmZmZmM2YzZjNj5dCi9MZW5ndGggMTMKL0ZpbHRlciAvRmxhdGVE ZWNvZGUKPj4Kc3RyZWFtCnjaEw1lDWUAAAJ7AMUKZW5kc3RyZWFtCmVuZG9i agoKMTY3IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFn ZQovTmFtZSAvSW0xNjcKL1dpZHRoIDEyCi9IZWlnaHQgMQovQml0c1BlckNv bXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEg PGZmZmZmZmM2YzZjNj5dCi9MZW5ndGggMTEKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjaE3UMBQABGQCsCmVuZHN0cmVhbQplbmRvYmoKCjE2 OCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05h bWUgL0ltMTY4Ci9XaWR0aCA2Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVu dCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEgPGM2YzZj NmZmZmZmZj5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4K c3RyZWFtCnjaYwgAAABSAFEKZW5kc3RyZWFtCmVuZG9iagoKMTY5IDAgb2Jq Cjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0x NjkKL1dpZHRoIDE3Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9D b2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEgPGZmZmZmZmM2YzZj Nj5dCi9MZW5ndGggMTMKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFt CnjaEw0NDWUAAANrARUKZW5kc3RyZWFtCmVuZG9iagoKMTcwIDAgb2JqCjw8 Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNzAK L1dpZHRoIDgKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8ZmRmZGZkYzZjNmM2Pl0K L0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoT DQUAAIEAawplbmRzdHJlYW0KZW5kb2JqCgoxNzEgMCBvYmoKPDwKL1R5cGUg L1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE3MQovV2lkdGgg MTIKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2Ug Wy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8ZmZmZmZmYzZjNmM2Pl0KL0xlbmd0 aCAxMQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTDQ0FAAFB AMAKZW5kc3RyZWFtCmVuZG9iagoKMTcyIDAgb2JqCjw8Ci9UeXBlIC9YT2Jq ZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNzIKL1dpZHRoIDE5Ci9I ZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5k ZXhlZCAvRGV2aWNlUkdCIDEgPGM2YzZjNmZmZmZmZj5dCi9MZW5ndGggMTMK L0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY2AQYWABAABFABkK ZW5kc3RyZWFtCmVuZG9iagoKMTczIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0 Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNzMKL1dpZHRoIDE5Ci9IZWln aHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhl ZCAvRGV2aWNlUkdCIDEgPGM2YzZjNmZmZmZmZj5dCi9MZW5ndGggMTMKL0Zp bHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY2AQYWAAAABBABUKZW5k c3RyZWFtCmVuZG9iagoKMTc0IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9T dWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNzQKL1dpZHRoIDE2Ci9IZWlnaHQg MQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAv RGV2aWNlUkdCIDEgPGZmZmZmZmM2YzZjNj5dCi9MZW5ndGggMTIKL0ZpbHRl ciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaEw0NDQUAAlYBFQplbmRzdHJl YW0KZW5kb2JqCgoxNzUgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5 cGUgL0ltYWdlCi9OYW1lIC9JbTE3NQovV2lkdGggMTYKL0hlaWdodCAxCi9C aXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZp Y2VSR0IgMSA8YzZjNmM2ZmZmZmZmPl0KL0xlbmd0aCAxMgovRmlsdGVyIC9G bGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjCGBhAAAA/ABVCmVuZHN0cmVhbQpl bmRvYmoKCjE3NiAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAv SW1hZ2UKL05hbWUgL0ltMTc2Ci9XaWR0aCAxMAovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiAxIDxjNmM2YzZmZmZmZmY+XQovTGVuZ3RoIDExCi9GaWx0ZXIgL0ZsYXRl RGVjb2RlCj4+CnN0cmVhbQp42mNgEAAAABMAEQplbmRzdHJlYW0KZW5kb2Jq CgoxNzcgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdl Ci9OYW1lIC9JbTE3NwovV2lkdGggMTEKL0hlaWdodCAxCi9CaXRzUGVyQ29t cG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8 ZDRkNGQ0YzZjNmM2ZmZmZmZmPl0KL0xlbmd0aCAxMQovRmlsdGVyIC9GbGF0 ZURlY29kZQo+PgpzdHJlYW0KeNoTDY0AAAFEAMMKZW5kc3RyZWFtCmVuZG9i agoKMTc4IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFn ZQovTmFtZSAvSW0xNzgKL1dpZHRoIDIzCi9IZWlnaHQgMQovQml0c1BlckNv bXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIg PGM2YzZjNmZmZmZmZmRjZGNkYz5dCi9MZW5ndGggMTQKL0ZpbHRlciAvRmxh dGVEZWNvZGUKPj4Kc3RyZWFtCnjaY2BgZZjAAgABPgCaCmVuZHN0cmVhbQpl bmRvYmoKCjE3OSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAv SW1hZ2UKL05hbWUgL0ltMTc5Ci9XaWR0aCAxNwovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiAxIDxmZmZmZmZjNmM2YzY+XQovTGVuZ3RoIDEzCi9GaWx0ZXIgL0ZsYXRl RGVjb2RlCj4+CnN0cmVhbQp42mN1YAh1AAACCADbCmVuZHN0cmVhbQplbmRv YmoKCjE4MCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1h Z2UKL05hbWUgL0ltMTgwCi9XaWR0aCA4Ci9IZWlnaHQgMQovQml0c1BlckNv bXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEg PGZmZmZmZmM2YzZjNj5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjaYwwFAABZAFcKZW5kc3RyZWFtCmVuZG9iagoKMTgx IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFt ZSAvSW0xODEKL1dpZHRoIDExCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVu dCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPGZmZmZm ZmM2YzZjNmQwZDBkMD5dCi9MZW5ndGggMTEKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjaYwiNAAABBQCuCmVuZHN0cmVhbQplbmRvYmoKCjE4 MiAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05h bWUgL0ltMTgyCi9XaWR0aCAxMwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25l bnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxIDxjNmM2 YzZmZmZmZmY+XQovTGVuZ3RoIDEyCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+ CnN0cmVhbQp42mNgYHAAAABEAEEKZW5kc3RyZWFtCmVuZG9iagoKMTgzIDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW0xODMKL1dpZHRoIDExCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAy Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEgPGM2YzZjNmZm ZmZmZj5dCi9MZW5ndGggMTEKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3Ry ZWFtCnjaYwgNAQABAQCqCmVuZHN0cmVhbQplbmRvYmoKCjE4NCAwIG9iago8 PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTg0 Ci9XaWR0aCA4Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xv clNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEgPGZmZmZmZmM2YzZjNj5d Ci9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja YwwBAABYAFYKZW5kc3RyZWFtCmVuZG9iagoKMTg1IDAgb2JqCjw8Ci9UeXBl IC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xODUKL1dpZHRo IDcKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2Ug Wy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8ZmZmZmZmYzZjNmM2Pl0KL0xlbmd0 aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTDQAAAHwA ZgplbmRzdHJlYW0KZW5kb2JqCgoxODYgMCBvYmoKPDwKL1R5cGUgL1hPYmpl Y3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE4NgovV2lkdGggMjMKL0hl aWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRl eGVkIC9EZXZpY2VSR0IgMSA8YzZjNmM2ZmZmZmZmPl0KL0xlbmd0aCAxNAov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjYGBlYGABAAAeAAoK ZW5kc3RyZWFtCmVuZG9iagoKMTg3IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0 Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xODcKL1dpZHRoIDcKL0hlaWdo dCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVk IC9EZXZpY2VSR0IgMSA8YzZjNmM2ZmZmZmZmPl0KL0xlbmd0aCAxMAovRmls dGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjYAEAAAYABQplbmRzdHJl YW0KZW5kb2JqCgoxODggMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5 cGUgL0ltYWdlCi9OYW1lIC9JbTE4OAovV2lkdGggNAovSGVpZ2h0IDEKL0Jp dHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rldmlj ZVJHQiAxIDxmZGZkZmRjNmM2YzY+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxh dGVEZWNvZGUKPj4Kc3RyZWFtCnjaEwUAABYAFgplbmRzdHJlYW0KZW5kb2Jq CgoxODkgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdl Ci9OYW1lIC9JbTE4OQovV2lkdGggNgovSGVpZ2h0IDEKL0JpdHNQZXJDb21w b25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxIDxm ZmZmZmZjNmM2YzY+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2Rl Cj4+CnN0cmVhbQp42hMNAAAAfABmCmVuZHN0cmVhbQplbmRvYmoKCjE5MCAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltMTkwCi9XaWR0aCAxNAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg MgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxIDxmZmZmZmZj NmM2YzY+XQovTGVuZ3RoIDEyCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0 cmVhbQp42hN1EHUAAAGCAKsKZW5kc3RyZWFtCmVuZG9iagoKMTkxIDAgb2Jq Cjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0x OTEKL1dpZHRoIDExCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9D b2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPGM2YzZjNmQwZDBk MGZmZmZmZj5dCi9MZW5ndGggMTEKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4K c3RyZWFtCnjaY5BgAAAAMwAZCmVuZHN0cmVhbQplbmRvYmoKCjE5MiAwIG9i ago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0lt MTkyCi9XaWR0aCAxMQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgov Q29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxIDxmZmZmZmZjNmM2 YzY+XQovTGVuZ3RoIDExCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVh bQp42hMNDQEAAUAAvwplbmRzdHJlYW0KZW5kb2JqCgoxOTMgMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE5Mwov V2lkdGggNwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JT cGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDxmZmZmZmZjNmM2YzZkMGQw ZDA+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVh bQp42hONAAAAhABuCmVuZHN0cmVhbQplbmRvYmoKCjE5NCAwIG9iago8PAov VHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTk0Ci9X aWR0aCA4Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNw YWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEgPGM2YzZjNmZmZmZmZj5dCi9M ZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYwgF AABXAFYKZW5kc3RyZWFtCmVuZG9iagoKMTk1IDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xOTUKL1dpZHRoIDkK L0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9J bmRleGVkIC9EZXZpY2VSR0IgMSA8ZmZmZmZmYzZjNmM2Pl0KL0xlbmd0aCAx MQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjDWUAAAC8AFsK ZW5kc3RyZWFtCmVuZG9iagoKMTk2IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0 Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xOTYKL1dpZHRoIDE0Ci9IZWln aHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhl ZCAvRGV2aWNlUkdCIDEgPGM2YzZjNmZmZmZmZj5dCi9MZW5ndGggMTIKL0Zp bHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY2BwYAAAAIQAQQplbmRz dHJlYW0KZW5kb2JqCgoxOTcgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1 YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE5NwovV2lkdGggMTYKL0hlaWdodCAx Ci9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9E ZXZpY2VSR0IgMSA8YzZjNmM2ZmZmZmZmPl0KL0xlbmd0aCAxMgovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjCGBgAAAA9ABRCmVuZHN0cmVh bQplbmRvYmoKCjE5OCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlw ZSAvSW1hZ2UKL05hbWUgL0ltMTk4Ci9XaWR0aCA1Ci9IZWlnaHQgMQovQml0 c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNl UkdCIDIgPGQ0ZDRkNGM2YzZjNmZmZmZmZj5dCi9MZW5ndGggMTAKL0ZpbHRl ciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaE20AAACsAJYKZW5kc3RyZWFt CmVuZG9iagoKMTk5IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBl IC9JbWFnZQovTmFtZSAvSW0xOTkKL1dpZHRoIDIwCi9IZWlnaHQgMQovQml0 c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNl UkdCIDIgPGQ3ZDdkN2M2YzZjNmZmZmZmZj5dCi9MZW5ndGggMTMKL0ZpbHRl ciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaEw2NCg0FAAPPAW8KZW5kc3Ry ZWFtCmVuZG9iagoKMjAwIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0 eXBlIC9JbWFnZQovTmFtZSAvSW0yMDAKL1dpZHRoIDI2Ci9IZWlnaHQgMQov Qml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2 aWNlUkdCIDEgPGZmZmZmZmM2YzZjNj5dCi9MZW5ndGggMTUKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYwh1EA0VDQAABRIBZQplbmRzdHJl YW0KZW5kb2JqCgoyMDEgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5 cGUgL0ltYWdlCi9OYW1lIC9JbTIwMQovV2lkdGggNQovSGVpZ2h0IDEKL0Jp dHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rldmlj ZVJHQiAxIDxjNmM2YzZkMGQwZDA+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0Zs YXRlRGVjb2RlCj4+CnN0cmVhbQp42mNwAAAAQgBBCmVuZHN0cmVhbQplbmRv YmoKCjIwMiAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1h Z2UKL05hbWUgL0ltMjAyCi9XaWR0aCAyNQovSGVpZ2h0IDEKL0JpdHNQZXJD b21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAx IDxjNmM2YzZmZmZmZmY+XQovTGVuZ3RoIDE1Ci9GaWx0ZXIgL0ZsYXRlRGVj b2RlCj4+CnN0cmVhbQp42mMIDWBhcHAAAARlASoKZW5kc3RyZWFtCmVuZG9i agoKMjAzIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFn ZQovTmFtZSAvSW0yMDMKL1dpZHRoIDEwCi9IZWlnaHQgMQovQml0c1BlckNv bXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEg PGZmZmZmZmM2YzZjNj5dCi9MZW5ndGggMTEKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjaExUNAAAAvAB7CmVuZHN0cmVhbQplbmRvYmoKCjIw NCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05h bWUgL0ltMjA0Ci9XaWR0aCAxOAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25l bnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxIDxjNmM2 YzZmZmZmZmY+XQovTGVuZ3RoIDEzCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+ CnN0cmVhbQp42mNgEGEQAAAAUQAlCmVuZHN0cmVhbQplbmRvYmoKCjIwNSAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltMjA1Ci9XaWR0aCA4Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAy Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPGZmZmZmZmQw ZDBkMGM2YzZjNj5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUK Pj4Kc3RyZWFtCnjaY1sBAAC2AK8KZW5kc3RyZWFtCmVuZG9iagoKMjA2IDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW0yMDYKL1dpZHRoIDcKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIK L0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8YzZjNmM2ZmZm ZmZmPl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl YW0KeNpjEAEAABYAFQplbmRzdHJlYW0KZW5kb2JqCgoyMDcgMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIwNwov V2lkdGggNzAKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8YzZjNmM2ZmZmZmZmPl0K L0xlbmd0aCAxMwovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpj EA1FBQEALpoFYQplbmRzdHJlYW0KZW5kb2JqCgoyMDggMCBvYmoKPDwKL1R5 cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIwOAovV2lk dGggNgovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFj ZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxIDxkNGQ0ZDRjNmM2YzY+XQovTGVu Z3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hMNAAAA fABmCmVuZHN0cmVhbQplbmRvYmoKCjIwOSAwIG9iago8PAovVHlwZSAvWE9i amVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjA5Ci9XaWR0aCAzMQov SGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0lu ZGV4ZWQgL0RldmljZVJHQiAxIDxjNmM2YzZmZmZmZmY+XQovTGVuZ3RoIDEz Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMQDQWBEAAHkwIT CmVuZHN0cmVhbQplbmRvYmoKCjIxMCAwIG9iago8PAovVHlwZSAvWE9iamVj dAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjEwCi9XaWR0aCA1Ci9IZWln aHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhl ZCAvRGV2aWNlUkdCIDEgPGQ0ZDRkNGM2YzZjNj5dCi9MZW5ndGggMTAKL0Zp bHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaE3UAAABsAFYKZW5kc3Ry ZWFtCmVuZG9iagoKMjExIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0 eXBlIC9JbWFnZQovTmFtZSAvSW0yMTEKL1dpZHRoIDUKL0hlaWdodCAxCi9C aXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZp Y2VSR0IgMiA8ZmZmZmZmYzZjNmM2ZDBkMGQwPl0KL0xlbmd0aCAxMAovRmls dGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTbQAAAKwAlgplbmRzdHJl YW0KZW5kb2JqCgoyMTIgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5 cGUgL0ltYWdlCi9OYW1lIC9JbTIxMgovV2lkdGggMTMKL0hlaWdodCAxCi9C aXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZp Y2VSR0IgMSA8ZmZmZmZmYzZjNmM2Pl0KL0xlbmd0aCAxMgovRmlsdGVyIC9G bGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjYBB1AAAAbgBWCmVuZHN0cmVhbQpl bmRvYmoKCjIxMyAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAv SW1hZ2UKL05hbWUgL0ltMjEzCi9XaWR0aCAzCi9IZWlnaHQgMQovQml0c1Bl ckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdC IDEgPGZmZmZmZmM2YzZjNj5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURl Y29kZQo+PgpzdHJlYW0KeNoTAAAAEQARCmVuZHN0cmVhbQplbmRvYmoKCjIx NCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05h bWUgL0ltMjE0Ci9XaWR0aCAyNAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25l bnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDxmZmZm ZmZjNmM2YzZlOWU5ZTk+XQovTGVuZ3RoIDEyCi9GaWx0ZXIgL0ZsYXRlRGVj b2RlCj4+CnN0cmVhbQp42mNgAIIwAABcAFcKZW5kc3RyZWFtCmVuZG9iagoK MjE1IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQov TmFtZSAvSW0yMTUKL1dpZHRoIDEzCi9IZWlnaHQgMQovQml0c1BlckNvbXBv bmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEgPGM2 YzZjNmZmZmZmZj5dCi9MZW5ndGggMTIKL0ZpbHRlciAvRmxhdGVEZWNvZGUK Pj4Kc3RyZWFtCnjaYxANdQAAAS0AqwplbmRzdHJlYW0KZW5kb2JqCgoyMTYg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTIxNgovV2lkdGggMTYKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50 IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8ZmZmZmZm ZTllOWU5YzZjNmM2Pl0KL0xlbmd0aCAxMgovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNqTatBaAAAC4AFlCmVuZHN0cmVhbQplbmRvYmoKCjIx NyAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05h bWUgL0ltMjE3Ci9XaWR0aCA4Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVu dCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPGZmZmZm ZmM2YzZjNmU5ZTllOT5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjaY4wAAABcAFoKZW5kc3RyZWFtCmVuZG9iagoKMjE4 IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFt ZSAvSW0yMTgKL1dpZHRoIDcKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50 IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8ZmZmZmZm YzZjNmM2Pl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+Pgpz dHJlYW0KeNpjCAAAAFIAUQplbmRzdHJlYW0KZW5kb2JqCgoyMTkgMCBvYmoK PDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIx OQovV2lkdGggNAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29s b3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxIDxjNmM2YzZkMGQwZDA+ XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja YwQAAAIAAgplbmRzdHJlYW0KZW5kb2JqCgoyMjAgMCBvYmoKPDwKL1R5cGUg L1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIyMAovV2lkdGgg NwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiAyIDxmZmZmZmZkMGQwZDBjNmM2YzY+XQov TGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNr AAAAjgCHCmVuZHN0cmVhbQplbmRvYmoKCjIyMSAwIG9iago8PAovVHlwZSAv WE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjIxCi9XaWR0aCA4 Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsv SW5kZXhlZCAvRGV2aWNlUkdCIDIgPGZmZmZmZmM2YzZjNmU5ZTllOT5dCi9M ZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaEw0D AACCAGwKZW5kc3RyZWFtCmVuZG9iagoKMjIyIDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMjIKL1dpZHRoIDEy Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsv SW5kZXhlZCAvRGV2aWNlUkdCIDIgPGZmZmZmZmM2YzZjNmQwZDBkMD5dCi9M ZW5ndGggMTEKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYw0N AwABEgCxCmVuZHN0cmVhbQplbmRvYmoKCjIyMyAwIG9iago8PAovVHlwZSAv WE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjIzCi9XaWR0aCAx MQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiAxIDxmZGZkZmRjNmM2YzY+XQovTGVuZ3Ro IDExCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hMNDQEAAUAA vwplbmRzdHJlYW0KZW5kb2JqCgoyMjQgMCBvYmoKPDwKL1R5cGUgL1hPYmpl Y3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIyNAovV2lkdGggMTEKL0hl aWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRl eGVkIC9EZXZpY2VSR0IgMiA8YzZjNmM2ZTllOWU5ZmZmZmZmPl0KL0xlbmd0 aCAxMQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjkFoBAADf AMMKZW5kc3RyZWFtCmVuZG9iagoKMjI1IDAgb2JqCjw8Ci9UeXBlIC9YT2Jq ZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMjUKL1dpZHRoIDExCi9I ZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5k ZXhlZCAvRGV2aWNlUkdCIDEgPGZmZmZmZmM2YzZjNj5dCi9MZW5ndGggMTEK L0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaEw0NAAABPAC7CmVu ZHN0cmVhbQplbmRvYmoKCjIyNiAwIG9iago8PAovVHlwZSAvWE9iamVjdAov U3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjI2Ci9XaWR0aCA5Ci9IZWlnaHQg MQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAv RGV2aWNlUkdCIDIgPGM2YzZjNmZmZmZmZmZkZmRmZD5dCi9MZW5ndGggMTEK L0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYwhzAAAA7wCXCmVu ZHN0cmVhbQplbmRvYmoKCjIyNyAwIG9iago8PAovVHlwZSAvWE9iamVjdAov U3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjI3Ci9XaWR0aCAxMAovSGVpZ2h0 IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQg L0RldmljZVJHQiAyIDxjNmM2YzZkN2Q3ZDdmZmZmZmY+XQovTGVuZ3RoIDEx Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42pNiUAAAAHEAOwpl bmRzdHJlYW0KZW5kb2JqCgoyMjggMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QK L1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIyOAovV2lkdGggMTAKL0hlaWdo dCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVk IC9EZXZpY2VSR0IgMSA8YzZjNmM2ZDBkMGQwPl0KL0xlbmd0aCAxMQovRmls dGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjYBAAAAATABEKZW5kc3Ry ZWFtCmVuZG9iagoKMjI5IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0 eXBlIC9JbWFnZQovTmFtZSAvSW0yMjkKL1dpZHRoIDEzCi9IZWlnaHQgMQov Qml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2 aWNlUkdCIDEgPGZmZmZmZmM2YzZjNj5dCi9MZW5ndGggMTIKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYwwRdQAAAW4AqwplbmRzdHJlYW0K ZW5kb2JqCgoyMzAgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTIzMAovV2lkdGggMTMKL0hlaWdodCAxCi9CaXRz UGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VS R0IgMSA8YzZjNmM2ZmZmZmZmPl0KL0xlbmd0aCAxMgovRmlsdGVyIC9GbGF0 ZURlY29kZQo+PgpzdHJlYW0KeNpjEGB0AAAAdgBSCmVuZHN0cmVhbQplbmRv YmoKCjIzMSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1h Z2UKL05hbWUgL0ltMjMxCi9XaWR0aCA2Ci9IZWlnaHQgMQovQml0c1BlckNv bXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIg PGZmZmZmZmM2YzZjNmQwZDBkMD5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxh dGVEZWNvZGUKPj4Kc3RyZWFtCnjaE00AAACMAHYKZW5kc3RyZWFtCmVuZG9i agoKMjMyIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFn ZQovTmFtZSAvSW0yMzIKL1dpZHRoIDE2Ci9IZWlnaHQgMQovQml0c1BlckNv bXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIg PGM2YzZjNmU5ZTllOWZmZmZmZj5dCi9MZW5ndGggMTIKL0ZpbHRlciAvRmxh dGVEZWNvZGUKPj4Kc3RyZWFtCnjaYwjgYgIAAQoAXQplbmRzdHJlYW0KZW5k b2JqCgoyMzMgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0lt YWdlCi9OYW1lIC9JbTIzMwovV2lkdGggMTEKL0hlaWdodCAxCi9CaXRzUGVy Q29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0Ig MiA8ZmRmZGZkYzZjNmM2ZmZmZmZmPl0KL0xlbmd0aCAxMQovRmlsdGVyIC9G bGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTDY0AAAFEAMMKZW5kc3RyZWFtCmVu ZG9iagoKMjM0IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9J bWFnZQovTmFtZSAvSW0yMzQKL1dpZHRoIDE1Ci9IZWlnaHQgMQovQml0c1Bl ckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdC IDIgPGZmZmZmZmM2YzZjNmQwZDBkMD5dCi9MZW5ndGggMTIKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaEw11jAAAAjEBBAplbmRzdHJlYW0K ZW5kb2JqCgoyMzUgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTIzNQovV2lkdGggMTIKL0hlaWdodCAxCi9CaXRz UGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VS R0IgMSA8YzZjNmM2ZmZmZmZmPl0KL0xlbmd0aCAxMQovRmlsdGVyIC9GbGF0 ZURlY29kZQo+PgpzdHJlYW0KeNpjEGAEAAAkABIKZW5kc3RyZWFtCmVuZG9i agoKMjM2IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFn ZQovTmFtZSAvSW0yMzYKL1dpZHRoIDYKL0hlaWdodCAxCi9CaXRzUGVyQ29t cG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8 ZmZmZmZmYzZjNmM2ZGNkY2RjPl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0 ZURlY29kZQo+PgpzdHJlYW0KeNoTTQAAAIwAdgplbmRzdHJlYW0KZW5kb2Jq CgoyMzcgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdl Ci9OYW1lIC9JbTIzNwovV2lkdGggMTYKL0hlaWdodCAxCi9CaXRzUGVyQ29t cG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8 YzZjNmM2ZmZmZmZmPl0KL0xlbmd0aCAxMgovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNpjYGBlBAAADwAHCmVuZHN0cmVhbQplbmRvYmoKCjIz OCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05h bWUgL0ltMjM4Ci9XaWR0aCAxMQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25l bnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDxkNGQ0 ZDRjNmM2YzZmZmZmZmY+XQovTGVuZ3RoIDExCi9GaWx0ZXIgL0ZsYXRlRGVj b2RlCj4+CnN0cmVhbQp42hONWgEAAZ4BGAplbmRzdHJlYW0KZW5kb2JqCgoy MzkgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9O YW1lIC9JbTIzOQovV2lkdGggOQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25l bnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDxmZmZm ZmZjNmM2YzZkMGQwZDA+XQovTGVuZ3RoIDExCi9GaWx0ZXIgL0ZsYXRlRGVj b2RlCj4+CnN0cmVhbQp42hMNbQAAAWwA6wplbmRzdHJlYW0KZW5kb2JqCgoy NDAgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9O YW1lIC9JbTI0MAovV2lkdGggMTYKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9u ZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8ZmZm ZmZmYzZjNmM2ZjRmNGY0Pl0KL0xlbmd0aCAxMgovRmlsdGVyIC9GbGF0ZURl Y29kZQo+PgpzdHJlYW0KeNoTDQ0IAwACTQERCmVuZHN0cmVhbQplbmRvYmoK CjI0MSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UK L05hbWUgL0ltMjQxCi9XaWR0aCA2Ci9IZWlnaHQgMQovQml0c1BlckNvbXBv bmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPGQ0 ZDRkNGM2YzZjNmZmZmZmZj5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVE ZWNvZGUKPj4Kc3RyZWFtCnjaE00AAACMAHYKZW5kc3RyZWFtCmVuZG9iagoK MjQyIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQov TmFtZSAvSW0yNDIKL1dpZHRoIDE2Ci9IZWlnaHQgMQovQml0c1BlckNvbXBv bmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEgPGM2 YzZjNmZmZmZmZj5dCi9MZW5ndGggMTIKL0ZpbHRlciAvRmxhdGVEZWNvZGUK Pj4Kc3RyZWFtCnjaYwhgZQAAAP4AVgplbmRzdHJlYW0KZW5kb2JqCgoyNDMg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTI0MwovV2lkdGggMTIKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50 IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8ZmZmZmZm YzZjNmM2Pl0KL0xlbmd0aCAxMQovRmlsdGVyIC9GbGF0ZURlY29kZQo+Pgpz dHJlYW0KeNoTDQgFAAE3ALsKZW5kc3RyZWFtCmVuZG9iagoKMjQ0IDAgb2Jq Cjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0y NDQKL1dpZHRoIDEzCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9D b2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPGZkZmRmZGM2YzZj NmZmZmZmZj5dCi9MZW5ndGggMTIKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4K c3RyZWFtCnjaE81a1QAAA2oBqgplbmRzdHJlYW0KZW5kb2JqCgoyNDUgMCBv YmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9J bTI0NQovV2lkdGggNwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgov Q29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDxmZmZmZmZkNGQ0 ZDRjNmM2YzY+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+ CnN0cmVhbQp42pNaAAAA1gC7CmVuZHN0cmVhbQplbmRvYmoKCjI0NiAwIG9i ago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0lt MjQ2Ci9XaWR0aCAxMAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgov Q29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxIDxjNmM2YzZmZmZm ZmY+XQovTGVuZ3RoIDExCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVh bQp42mMIYAAAAKMAUQplbmRzdHJlYW0KZW5kb2JqCgoyNDcgMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTI0Nwov V2lkdGggMTAKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8ZmZmZmZmYzZjNmM2ZjRm NGY0Pl0KL0xlbmd0aCAxMQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl YW0KeNoTDU0AAAFMAMsKZW5kc3RyZWFtCmVuZG9iagoKMjQ4IDAgb2JqCjw8 Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yNDgK L1dpZHRoIDgKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8ZmZmZmZmYzZjNmM2Pl0K L0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpj DQUAAGEAWwplbmRzdHJlYW0KZW5kb2JqCgoyNDkgMCBvYmoKPDwKL1R5cGUg L1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTI0OQovV2lkdGgg OQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiAyIDxmZmZmZmZjNmM2YzZmNGY0ZjQ+XQov TGVuZ3RoIDExCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hMN bQAAAWwA6wplbmRzdHJlYW0KZW5kb2JqCgoyNTAgMCBvYmoKPDwKL1R5cGUg L1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTI1MAovV2lkdGgg MTEKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2Ug Wy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8ZDRkNGQ0YzZjNmM2Pl0KL0xlbmd0 aCAxMQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTDQ0BAAFA AL8KZW5kc3RyZWFtCmVuZG9iagoKMjUxIDAgb2JqCjw8Ci9UeXBlIC9YT2Jq ZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yNTEKL1dpZHRoIDQKL0hl aWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRl eGVkIC9EZXZpY2VSR0IgMSA8ZDRkNGQ0YzZjNmM2Pl0KL0xlbmd0aCA5Ci9G aWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hMFAAAWABYKZW5kc3Ry ZWFtCmVuZG9iagoKMjUyIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0 eXBlIC9JbWFnZQovTmFtZSAvSW0yNTIKL1dpZHRoIDQKL0hlaWdodCAxCi9C aXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZp Y2VSR0IgMSA8YzZjNmM2ZDdkN2Q3Pl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0Zs YXRlRGVjb2RlCj4+CnN0cmVhbQp42mMEAAACAAIKZW5kc3RyZWFtCmVuZG9i agoKMjUzIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFn ZQovTmFtZSAvSW0yNTMKL1dpZHRoIDgKL0hlaWdodCAxCi9CaXRzUGVyQ29t cG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8 ZmZmZmZmYzZjNmM2Pl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNoTDQAAAHwAZgplbmRzdHJlYW0KZW5kb2JqCgoyNTQg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTI1NAovV2lkdGggNwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg MgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxIDxmZmZmZmZj NmM2YzY+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0 cmVhbQp42mMNAAAAXABWCmVuZHN0cmVhbQplbmRvYmoKCjI1NSAwIG9iago8 PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjU1 Ci9XaWR0aCA0Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xv clNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEgPGZmZmZmZmM2YzZjNj5d Ci9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoT AQAAFQAVCmVuZHN0cmVhbQplbmRvYmoKCjI1NiAwIG9iago8PAovVHlwZSAv WE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjU2Ci9XaWR0aCAz MgovSGVpZ2h0IDMKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiA2IDxmZmZmZmZmMGYwZjBlMGUwZTBlMWUx ZTFkZWRlZGVlMmUyZTJlN2U3ZTc+XQovTGVuZ3RoIDM1Ci9GaWx0ZXIgL0Zs YXRlRGVjb2RlCj4+CnN0cmVhbQp42mNgQAVCxsrGxsZGJkbGpkDaxEzEyRgM lMCkkRkAYiIGFgplbmRzdHJlYW0KZW5kb2JqCgoyNTcgMCBvYmoKPDwKL1R5 cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTI1NwovV2lk dGggMwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFj ZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDxmMGYwZjBkZWRlZGVlMWUxZTE+ XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja kwAAABkAGQplbmRzdHJlYW0KZW5kb2JqCgoyNTggMCBvYmoKPDwKL1R5cGUg L1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTI1OAovV2lkdGgg MwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiAyIDxlMWUxZTFkZWRlZGVlN2U3ZTc+XQov TGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjakwAA ABkAGQplbmRzdHJlYW0KZW5kb2JqCgoyNTkgMCBvYmoKPDwKL1R5cGUgL1hP YmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTI1OQovV2lkdGggMwov SGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0lu ZGV4ZWQgL0RldmljZVJHQiAyIDxlMWUxZTFkZWRlZGVlNWU1ZTU+XQovTGVu Z3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjakwAAABkA GQplbmRzdHJlYW0KZW5kb2JqCgoyNjAgMCBvYmoKPDwKL1R5cGUgL1hPYmpl Y3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTI2MAovV2lkdGggMwovSGVp Z2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4 ZWQgL0RldmljZVJHQiAxIDxlMWUxZTFlNWU1ZTU+XQovTGVuZ3RoIDkKL0Zp bHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYwEAAAUABQplbmRzdHJl YW0KZW5kb2JqCgoyNjEgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5 cGUgL0ltYWdlCi9OYW1lIC9JbTI2MQovV2lkdGggMwovSGVpZ2h0IDEKL0Jp dHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rldmlj ZVJHQiAyIDxmMGYwZjBlMGUwZTBlMWUxZTE+XQovTGVuZ3RoIDkKL0ZpbHRl ciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjakwAAABkAGQplbmRzdHJlYW0K ZW5kb2JqCgoyNjIgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTI2MgovV2lkdGggMQovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiAwIDxmYmZiZmI+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUK Pj4Kc3RyZWFtCnjaYwAAAAEAAQplbmRzdHJlYW0KZW5kb2JqCgoyNjMgMCBv YmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9J bTI2MwovV2lkdGggMQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgov Q29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAwIDxmNmY2ZjY+XQov TGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYwAA AAEAAQplbmRzdHJlYW0KZW5kb2JqCgoyNjQgMCBvYmoKPDwKL1R5cGUgL1hP YmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTI2NAovV2lkdGggMQov SGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0lu ZGV4ZWQgL0RldmljZVJHQiAwIDxmM2YzZjM+XQovTGVuZ3RoIDkKL0ZpbHRl ciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYwAAAAEAAQplbmRzdHJlYW0K ZW5kb2JqCgoyNjUgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTI2NQovV2lkdGggMwovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiAyIDxlMmUyZTJlMWUxZTFlN2U3ZTc+XQovTGVuZ3RoIDkKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjakwAAABkAGQplbmRzdHJlYW0KZW5k b2JqCgoyNjYgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0lt YWdlCi9OYW1lIC9JbTI2NgovV2lkdGggMQovSGVpZ2h0IDEKL0JpdHNQZXJD b21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAw IDxmY2ZjZmM+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4K c3RyZWFtCnjaYwAAAAEAAQplbmRzdHJlYW0KZW5kb2JqCgoyNjcgMCBvYmoK PDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTI2 NwovV2lkdGggMQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29s b3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAwIDxmZWZlZmU+XQovTGVu Z3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYwAAAAEA AQplbmRzdHJlYW0KZW5kb2JqCgoyNjggMCBvYmoKPDwKL1R5cGUgL1hPYmpl Y3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTI2OAovV2lkdGggMwovSGVp Z2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4 ZWQgL0RldmljZVJHQiAyIDxlMmUyZTJlMWUxZTFlNGU0ZTQ+XQovTGVuZ3Ro IDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjakwAAABkAGQpl bmRzdHJlYW0KZW5kb2JqCgoyNjkgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QK L1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTI2OQovV2lkdGggMwovSGVpZ2h0 IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQg L0RldmljZVJHQiAyIDxmM2YzZjNlMmUyZTJlMWUxZTE+XQovTGVuZ3RoIDkK L0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjakwAAABkAGQplbmRz dHJlYW0KZW5kb2JqCgoyNzAgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1 YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTI3MAovV2lkdGggMQovSGVpZ2h0IDEK L0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rl dmljZVJHQiAwIDxmNGY0ZjQ+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVE ZWNvZGUKPj4Kc3RyZWFtCnjaYwAAAAEAAQplbmRzdHJlYW0KZW5kb2JqCgoy NzEgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9O YW1lIC9JbTI3MQovV2lkdGggMwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25l bnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxIDxmNGY0 ZjRlMWUxZTE+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4K c3RyZWFtCnjaEwEAABUAFQplbmRzdHJlYW0KZW5kb2JqCgoyNzIgMCBvYmoK PDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTI3 MgovV2lkdGggMwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29s b3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxIDxmM2YzZjNlMWUxZTE+ XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja EwEAABUAFQplbmRzdHJlYW0KZW5kb2JqCgoyNzMgMCBvYmoKPDwKL1R5cGUg L1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTI3MwovV2lkdGgg MwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiAxIDxmMGYwZjBlMWUxZTE+XQovTGVuZ3Ro IDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaEwEAABUAFQpl bmRzdHJlYW0KZW5kb2JqCgoyNzQgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QK L1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTI3NAovV2lkdGggMQovSGVpZ2h0 IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQg L0RldmljZVJHQiAwIDxmOWY5Zjk+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxh dGVEZWNvZGUKPj4Kc3RyZWFtCnjaYwAAAAEAAQplbmRzdHJlYW0KZW5kb2Jq CgoyNzUgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdl Ci9OYW1lIC9JbTI3NQovV2lkdGggMwovSGVpZ2h0IDEKL0JpdHNQZXJDb21w b25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDxl NGU0ZTRlMWUxZTFlN2U3ZTc+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVE ZWNvZGUKPj4Kc3RyZWFtCnjakwAAABkAGQplbmRzdHJlYW0KZW5kb2JqCgoy NzYgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9O YW1lIC9JbTI3NgovV2lkdGggMQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25l bnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAwIDxlY2Vj ZWM+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFt CnjaYwAAAAEAAQplbmRzdHJlYW0KZW5kb2JqCgoyNzcgMCBvYmoKPDwKL1R5 cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTI3NwovV2lk dGggMQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFj ZSBbL0luZGV4ZWQgL0RldmljZVJHQiAwIDxmMGYwZjA+XQovTGVuZ3RoIDkK L0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYwAAAAEAAQplbmRz dHJlYW0KZW5kb2JqCgoyNzggMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1 YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTI3OAovV2lkdGggMQovSGVpZ2h0IDEK L0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rl dmljZVJHQiAwIDxmMWYxZjE+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVE ZWNvZGUKPj4Kc3RyZWFtCnjaYwAAAAEAAQplbmRzdHJlYW0KZW5kb2JqCgoy NzkgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9O YW1lIC9JbTI3OQovV2lkdGggMQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25l bnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAwIDxlZmVm ZWY+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFt CnjaYwAAAAEAAQplbmRzdHJlYW0KZW5kb2JqCgoyODAgMCBvYmoKPDwKL1R5 cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTI4MAovV2lk dGggMwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFj ZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDxlNGU0ZTRlMGUwZTBlN2U3ZTc+ XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja kwAAABkAGQplbmRzdHJlYW0KZW5kb2JqCgoyODEgMCBvYmoKPDwKL1R5cGUg L1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTI4MQovV2lkdGgg MwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiAyIDxmM2YzZjNlMGUwZTBlMWUxZTE+XQov TGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjakwAA ABkAGQplbmRzdHJlYW0KZW5kb2JqCgoyODIgMCBvYmoKPDwKL1R5cGUgL1hP YmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTI4MgovV2lkdGggMQov SGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0lu ZGV4ZWQgL0RldmljZVJHQiAwIDxmNWY1ZjU+XQovTGVuZ3RoIDkKL0ZpbHRl ciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYwAAAAEAAQplbmRzdHJlYW0K ZW5kb2JqCgoyODMgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTI4MwovV2lkdGggMwovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiAxIDxlNGU0ZTRlMWUxZTE+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVE ZWNvZGUKPj4Kc3RyZWFtCnjaEwAAABEAEQplbmRzdHJlYW0KZW5kb2JqCgoy ODQgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9O YW1lIC9JbTI4NAovV2lkdGggMwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25l bnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDxmNGY0 ZjRlMGUwZTBlMWUxZTE+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjakwAAABkAGQplbmRzdHJlYW0KZW5kb2JqCgoyODUg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTI4NQovV2lkdGggMQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg MgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAwIDxmZGZkZmQ+ XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja YwAAAAEAAQplbmRzdHJlYW0KZW5kb2JqCgoyODYgMCBvYmoKPDwKL1R5cGUg L1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTI4NgovV2lkdGgg NgovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiAzIDxmM2YzZjNmZmZmZmZmN2Y3ZjdmY2Zj ZmM+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVh bQp42pO8AAABBADqCmVuZHN0cmVhbQplbmRvYmoKCjI4NyAwIG9iago8PAov VHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjg3Ci9X aWR0aCAxCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNw YWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDAgPGVlZWVlZT5dCi9MZW5ndGgg OQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjAAAAAQABCmVu ZHN0cmVhbQplbmRvYmoKCjI4OCAwIG9iago8PAovVHlwZSAvWE9iamVjdAov U3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjg4Ci9XaWR0aCA0Ci9IZWlnaHQg MQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAv RGV2aWNlUkdCIDIgPGY1ZjVmNWZmZmZmZmZiZmJmYj5dCi9MZW5ndGggOQov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTBAAAGgAaCmVuZHN0 cmVhbQplbmRvYmoKCjI4OSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3Vi dHlwZSAvSW1hZ2UKL05hbWUgL0ltMjg5Ci9XaWR0aCAzCi9IZWlnaHQgMQov Qml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2 aWNlUkdCIDEgPGU0ZTRlNGUwZTBlMD5dCi9MZW5ndGggOQovRmlsdGVyIC9G bGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTAAAAEQARCmVuZHN0cmVhbQplbmRv YmoKCjI5MCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1h Z2UKL05hbWUgL0ltMjkwCi9XaWR0aCAzCi9IZWlnaHQgMQovQml0c1BlckNv bXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIg PGY0ZjRmNGRlZGVkZWUxZTFlMT5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0 ZURlY29kZQo+PgpzdHJlYW0KeNqTAAAAGQAZCmVuZHN0cmVhbQplbmRvYmoK CjI5MSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UK L05hbWUgL0ltMjkxCi9XaWR0aCAxCi9IZWlnaHQgMQovQml0c1BlckNvbXBv bmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDAgPGUx ZTFlMT5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl YW0KeNpjAAAAAQABCmVuZHN0cmVhbQplbmRvYmoKCjI5MiAwIG9iago8PAov VHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjkyCi9X aWR0aCAxCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNw YWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDAgPGU0ZTRlND5dCi9MZW5ndGgg OQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjAAAAAQABCmVu ZHN0cmVhbQplbmRvYmoKCjI5MyAwIG9iago8PAovVHlwZSAvWE9iamVjdAov U3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjkzCi9XaWR0aCA4Ci9IZWlnaHQg MQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAv RGV2aWNlUkdCIDQgPGU0ZTRlNGZmZmZmZmUxZTFlMWY1ZjVmNWY4ZjhmOD5d Ci9MZW5ndGggMTIKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja Y1Q0dAQAAQ4AlQplbmRzdHJlYW0KZW5kb2JqCgoyOTQgMCBvYmoKPDwKL1R5 cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTI5NAovV2lk dGggMwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFj ZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDxlN2U3ZTdlMWUxZTFlNGU0ZTQ+ XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja kwAAABkAGQplbmRzdHJlYW0KZW5kb2JqCgoyOTUgMCBvYmoKPDwKL1R5cGUg L1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTI5NQovV2lkdGgg MQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiAwIDxmOGY4Zjg+XQovTGVuZ3RoIDkKL0Zp bHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYwAAAAEAAQplbmRzdHJl YW0KZW5kb2JqCgoyOTYgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5 cGUgL0ltYWdlCi9OYW1lIC9JbTI5NgovV2lkdGggMTQKL0hlaWdodCAxCi9C aXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZp Y2VSR0IgNSA8ZTRlNGU0ZmZmZmZmZTVlNWU1ZTZlNmU2ZTFlMWUxZmJmYmZi Pl0KL0xlbmd0aCAxNQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0K eNpjVDRUVHQMBAADgwEoCmVuZHN0cmVhbQplbmRvYmoKCjI5NyAwIG9iago8 PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjk3 Ci9XaWR0aCA1Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xv clNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPGVmZWZlZmZmZmZmZmU1 ZTVlNT5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3Ry ZWFtCnjak2wAAAC0AJoKZW5kc3RyZWFtCmVuZG9iagoKMjk4IDAgb2JqCjw8 Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yOTgK L1dpZHRoIDEwCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xv clNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMgPGU1ZTVlNWZmZmZmZmU5 ZTllOWYyZjJmMj5dCi9MZW5ndGggMTEKL0ZpbHRlciAvRmxhdGVEZWNvZGUK Pj4Kc3RyZWFtCnjaE5x4AQACKAFzCmVuZHN0cmVhbQplbmRvYmoKCjI5OSAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltMjk5Ci9XaWR0aCA1Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAy Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPGUxZTFlMWZm ZmZmZmU1ZTVlNT5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUK Pj4Kc3RyZWFtCnjak2wAAAC0AJoKZW5kc3RyZWFtCmVuZG9iagoKMzAwIDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW0zMDAKL1dpZHRoIDEwCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAy Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPGU0ZTRlNGZm ZmZmZmU1ZTVlNT5dCi9MZW5ndGggMTEKL0ZpbHRlciAvRmxhdGVEZWNvZGUK Pj4Kc3RyZWFtCnjakxScAAABAAC7CmVuZHN0cmVhbQplbmRvYmoKCjMwMSAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltMzAxCi9XaWR0aCA3Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAy Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMgPGY1ZjVmNWZm ZmZmZmU1ZTVlNWU0ZTRlND5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVE ZWNvZGUKPj4Kc3RyZWFtCnjak5wDAADQALYKZW5kc3RyZWFtCmVuZG9iagoK MzAyIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQov TmFtZSAvSW0zMDIKL1dpZHRoIDgKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9u ZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8ZTRl NGU0ZmZmZmZmZTdlN2U3ZTVlNWU1Pl0KL0xlbmd0aCAxMAovRmlsdGVyIC9G bGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTvAsAAREA9wplbmRzdHJlYW0KZW5k b2JqCgozMDMgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0lt YWdlCi9OYW1lIC9JbTMwMwovV2lkdGggNwovSGVpZ2h0IDEKL0JpdHNQZXJD b21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAz IDxmOGY4ZjhmZmZmZmZlNWU1ZTVlNGU0ZTQ+XQovTGVuZ3RoIDEwCi9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42pOcAwAA0AC2CmVuZHN0cmVh bQplbmRvYmoKCjMwNCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlw ZSAvSW1hZ2UKL05hbWUgL0ltMzA0Ci9XaWR0aCAxMAovSGVpZ2h0IDEKL0Jp dHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rldmlj ZVJHQiA0IDxlM2UzZTNmZmZmZmZlNGU0ZTRlN2U3ZTdmYWZhZmE+XQovTGVu Z3RoIDEzCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNkVDQ0 AQABBwCJCmVuZHN0cmVhbQplbmRvYmoKCjMwNSAwIG9iago8PAovVHlwZSAv WE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMzA1Ci9XaWR0aCAz Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsv SW5kZXhlZCAvRGV2aWNlUkdCIDIgPGU0ZTRlNGUxZTFlMWUyZTJlMj5dCi9M ZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTAAAA GQAZCmVuZHN0cmVhbQplbmRvYmoKCjMwNiAwIG9iago8PAovVHlwZSAvWE9i amVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMzA2Ci9XaWR0aCAzCi9I ZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5k ZXhlZCAvRGV2aWNlUkdCIDEgPGY3ZjdmN2UxZTFlMT5dCi9MZW5ndGggOQov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTAQAAFQAVCmVuZHN0 cmVhbQplbmRvYmoKCjMwNyAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3Vi dHlwZSAvSW1hZ2UKL05hbWUgL0ltMzA3Ci9XaWR0aCAxOAovSGVpZ2h0IDEK L0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rl dmljZVJHQiA4IDxmZGZkZmRmZmZmZmZlNWU1ZTVlNGU0ZTRkNWQ1ZDVkM2Qz ZDNmN2Y3ZjdlM2UzZTNlN2U3ZTc+XQovTGVuZ3RoIDE3Ci9GaWx0ZXIgL0Zs YXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUNHQNDQ0rbAMACXYCkAplbmRzdHJl YW0KZW5kb2JqCgozMDggMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5 cGUgL0ltYWdlCi9OYW1lIC9JbTMwOAovV2lkdGggMwovSGVpZ2h0IDEKL0Jp dHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rldmlj ZVJHQiAyIDxlN2U3ZTdlMWUxZTFlMmUyZTI+XQovTGVuZ3RoIDkKL0ZpbHRl ciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjakwAAABkAGQplbmRzdHJlYW0K ZW5kb2JqCgozMDkgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTMwOQovV2lkdGggMwovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiAyIDxmN2Y3ZjdlMGUwZTBkZmRmZGY+XQovTGVuZ3RoIDkKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjakwAAABkAGQplbmRzdHJlYW0KZW5k b2JqCgozMTAgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0lt YWdlCi9OYW1lIC9JbTMxMAovV2lkdGggMTgKL0hlaWdodCAxCi9CaXRzUGVy Q29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0Ig NiA8ZTllOWU5ZmZmZmZmZTVlNWU1ZDdkN2Q3ZDNkM2QzZmFmYWZhZTRlNGU0 Pl0KL0xlbmd0aCAxNQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0K eNpjVDRxAQLXBAAIOAIMCmVuZHN0cmVhbQplbmRvYmoKCjMxMSAwIG9iago8 PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMzEx Ci9XaWR0aCAzCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xv clNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPGU3ZTdlN2UwZTBlMGUy ZTJlMj5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl YW0KeNqTAAAAGQAZCmVuZHN0cmVhbQplbmRvYmoKCjMxMiAwIG9iago8PAov VHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMzEyCi9X aWR0aCAzCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNw YWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPGY3ZjdmN2RlZGVkZWUxZTFl MT5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0K eNqTAAAAGQAZCmVuZHN0cmVhbQplbmRvYmoKCjMxMyAwIG9iago8PAovVHlw ZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMzEzCi9XaWR0 aCAxOAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFj ZSBbL0luZGV4ZWQgL0RldmljZVJHQiA1IDxlN2U3ZTdmZmZmZmZlNGU0ZTRk OWQ5ZDlkM2QzZDNkYWRhZGE+XQovTGVuZ3RoIDEzCi9GaWx0ZXIgL0ZsYXRl RGVjb2RlCj4+CnN0cmVhbQp42mNUdgGDAAAIpgINCmVuZHN0cmVhbQplbmRv YmoKCjMxNCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1h Z2UKL05hbWUgL0ltMzE0Ci9XaWR0aCAxOAovSGVpZ2h0IDEKL0JpdHNQZXJD b21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA0 IDxlNmU2ZTZmZmZmZmZkNmQ2ZDZkM2QzZDNlOGU4ZTg+XQovTGVuZ3RoIDEz Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUNgYDEwAGvwGL CmVuZHN0cmVhbQplbmRvYmoKCjMxNSAwIG9iago8PAovVHlwZSAvWE9iamVj dAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMzE1Ci9XaWR0aCA2Ci9IZWln aHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhl ZCAvRGV2aWNlUkdCIDQgPGY3ZjdmN2RlZGVkZWUwZTBlMGUxZTFlMWZjZmNm Yz5dCi9MZW5ndGggMTEKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFt CnjaY1Q2AQAAgABZCmVuZHN0cmVhbQplbmRvYmoKCjMxNiAwIG9iago8PAov VHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMzE2Ci9X aWR0aCAxOAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JT cGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA0IDxlN2U3ZTdmZGZkZmRkMmQy ZDJkM2QzZDNlNmU2ZTY+XQovTGVuZ3RoIDEzCi9GaWx0ZXIgL0ZsYXRlRGVj b2RlCj4+CnN0cmVhbQp42mNUNgYDEwAGvwGLCmVuZHN0cmVhbQplbmRvYmoK CjMxNyAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UK L05hbWUgL0ltMzE3Ci9XaWR0aCA1Ci9IZWlnaHQgMQovQml0c1BlckNvbXBv bmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEgPGUx ZTFlMWUyZTJlMj5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUK Pj4Kc3RyZWFtCnjaE3AAAABiAFEKZW5kc3RyZWFtCmVuZG9iagoKMzE4IDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW0zMTgKL1dpZHRoIDYKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIK L0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8ZjdmN2Y3ZTFl MWUxZGZkZmRmZmNmY2ZjPl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURl Y29kZQo+PgpzdHJlYW0KeNoT3QAAANwAxgplbmRzdHJlYW0KZW5kb2JqCgoz MTkgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9O YW1lIC9JbTMxOQovV2lkdGggMTgKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9u ZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNCA8ZWNl Y2VjZDZkNmQ2ZDNkM2QzZDlkOWQ5ZGRkZGRkPl0KL0xlbmd0aCAxNQovRmls dGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVAICQyUlFQAFGAEjCmVu ZHN0cmVhbQplbmRvYmoKCjMyMCAwIG9iago8PAovVHlwZSAvWE9iamVjdAov U3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMzIwCi9XaWR0aCA1Ci9IZWlnaHQg MQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAv RGV2aWNlUkdCIDEgPGUxZTFlMWU0ZTRlND5dCi9MZW5ndGggMTAKL0ZpbHRl ciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY3AAAABCAEEKZW5kc3RyZWFt CmVuZG9iagoKMzIxIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBl IC9JbWFnZQovTmFtZSAvSW0zMjEKL1dpZHRoIDYKL0hlaWdodCAxCi9CaXRz UGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VS R0IgMSA8ZmZmZmZmZmFmYWZhPl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0 ZURlY29kZQo+PgpzdHJlYW0KeNoTdQAAAGwAVgplbmRzdHJlYW0KZW5kb2Jq CgozMjIgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdl Ci9OYW1lIC9JbTMyMgovV2lkdGggMTgKL0hlaWdodCAxCi9CaXRzUGVyQ29t cG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8 ZmZmZmZmZDNkM2QzZDlkOWQ5Pl0KL0xlbmd0aCAxMwovRmlsdGVyIC9GbGF0 ZURlY29kZQo+PgpzdHJlYW0KeNoTDQ0NTQAAA8sBdQplbmRzdHJlYW0KZW5k b2JqCgozMjMgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0lt YWdlCi9OYW1lIC9JbTMyMwovV2lkdGggMTgKL0hlaWdodCAxCi9CaXRzUGVy Q29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0Ig MyA8ZWVlZWVlZDZkNmQ2ZDNkM2QzZDJkMmQyPl0KL0xlbmd0aCAxMwovRmls dGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTWrVr1QQAB0ECuQplbmRz dHJlYW0KZW5kb2JqCgozMjQgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1 YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTMyNAovV2lkdGggMTkKL0hlaWdodCAy Ci9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9E ZXZpY2VSR0IgNSA8ZTJlMmUyZDNkM2QzZDlkOWQ5ZDhkOGQ4ZmZmZmZmZGVk ZWRlPl0KL0xlbmd0aCAyMgovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl YW0KeNpjFAQCRUFBYYdAQQgQdgAAEoYB9wplbmRzdHJlYW0KZW5kb2JqCgoz MjUgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9O YW1lIC9JbTMyNQovV2lkdGggMTgKL0hlaWdodCAzCi9CaXRzUGVyQ29tcG9u ZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgOCA8ZThl OGU4ZGJkYmRiZDNkM2QzZDZkNmQ2ZjRmNGY0ZDJkMmQyZDVkNWQ1ZmZmZmZm ZDlkOWQ5Pl0KL0xlbmd0aCAyMgovRmlsdGVyIC9GbGF0ZURlY29kZQo+Pgpz dHJlYW0KeNpjVIIAZWdVIzBDrQgqogEANWoEBQplbmRzdHJlYW0KZW5kb2Jq CgozMjYgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdl Ci9OYW1lIC9JbTMyNgovV2lkdGggMTcKL0hlaWdodCAxCi9CaXRzUGVyQ29t cG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8 ZDhkOGQ4ZDNkM2QzZDVkNWQ1ZmZmZmZmPl0KL0xlbmd0aCAxMwovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTDZ0aegAABOsCFQplbmRzdHJl YW0KZW5kb2JqCgozMjcgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5 cGUgL0ltYWdlCi9OYW1lIC9JbTMyNwovV2lkdGggMTYKL0hlaWdodCAxCi9C aXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZp Y2VSR0IgMiA8ZmZmZmZmZDZkNmQ2ZDNkM2QzPl0KL0xlbmd0aCAxMgovRmls dGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTWpW1CgAD6AHZCmVuZHN0 cmVhbQplbmRvYmoKCjMyOCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3Vi dHlwZSAvSW1hZ2UKL05hbWUgL0ltMzI4Ci9XaWR0aCAxNQovSGVpZ2h0IDEK L0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rl dmljZVJHQiAyIDxlZWVlZWVkM2QzZDNkNWQ1ZDU+XQovTGVuZ3RoIDEyCi9G aWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hMNDY0AAAJZARgKZW5k c3RyZWFtCmVuZG9iagoKMzI5IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9T dWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0zMjkKL1dpZHRoIDE0Ci9IZWlnaHQg MQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAv RGV2aWNlUkdCIDMgPGViZWJlYmQzZDNkM2Q2ZDZkNmZmZmZmZj5dCi9MZW5n dGggMTIKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaEw0N3QAA ArEBcAplbmRzdHJlYW0KZW5kb2JqCgozMzAgMCBvYmoKPDwKL1R5cGUgL1hP YmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTMzMAovV2lkdGggMTEK L0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9J bmRleGVkIC9EZXZpY2VSR0IgNSA8ZmZmZmZmZDZkNmQ2ZDNkM2QzZDJkMmQy ZDVkNWQ1ZGVkZWRlPl0KL0xlbmd0aCAxNAovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNpjFFJSVgkAAAHvAM0KZW5kc3RyZWFtCmVuZG9iagoK MzMxIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQov TmFtZSAvSW0zMzEKL1dpZHRoIDcKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9u ZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNSA8ZmZm ZmZmZGNkY2RjZDZkNmQ2ZDVkNWQ1ZDhkOGQ4ZWJlYmViPl0KL0xlbmd0aCAx MgovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVDYJAAABKQCp CmVuZHN0cmVhbQplbmRvYmoKCjMzMiAwIG9iago8PAovVHlwZSAvWE9iamVj dAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMzMyCi9XaWR0aCAyCi9IZWln aHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhl ZCAvRGV2aWNlUkdCIDEgPGZmZmZmZmYwZjBmMD5dCi9MZW5ndGggOQovRmls dGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTAAAAEQARCmVuZHN0cmVh bQplbmRvYmoKCjMzMyAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlw ZSAvSW1hZ2UKL05hbWUgL0ltMzMzCi9XaWR0aCA0Ci9IZWlnaHQgMQovQml0 c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNl UkdCIDMgPGY2ZjZmNmU0ZTRlNGU3ZTdlN2ZmZmZmZj5dCi9MZW5ndGggOQov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTBgAAHAAcCmVuZHN0 cmVhbQplbmRvYmoKCjMzNCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3Vi dHlwZSAvSW1hZ2UKL05hbWUgL0ltMzM0Ci9XaWR0aCA2Ci9IZWlnaHQgMQov Qml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2 aWNlUkdCIDIgPGY3ZjdmN2Y2ZjZmNmZmZmZmZj5dCi9MZW5ndGggMTAKL0Zp bHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY0kAAABqAGUKZW5kc3Ry ZWFtCmVuZG9iagoKMzM1IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0 eXBlIC9JbWFnZQovTmFtZSAvSW0zMzUKL1dpZHRoIDMKL0hlaWdodCAxCi9C aXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZp Y2VSR0IgMSA8ZmZmZmZmZjBmMGYwPl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0Zs YXRlRGVjb2RlCj4+CnN0cmVhbQp42hMAAAARABEKZW5kc3RyZWFtCmVuZG9i agoKMzM2IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFn ZQovTmFtZSAvSW0zMzYKL1dpZHRoIDEKL0hlaWdodCAxCi9CaXRzUGVyQ29t cG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMCA8 ZTdlN2U3Pl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0 cmVhbQp42mMAAAABAAEKZW5kc3RyZWFtCmVuZG9iagoKMzM3IDAgb2JqCjw8 Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0zMzcK L1dpZHRoIDQKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8ZjlmOWY5ZTdlN2U3ZWFl YWVhPl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVh bQp42hMDAAAXABcKZW5kc3RyZWFtCmVuZG9iagoKMzM4IDAgb2JqCjw8Ci9U eXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0zMzgKL1dp ZHRoIDMKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3Bh Y2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8ZTdlN2U3ZTRlNGU0ZmZmZmZm Pl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4 2pMAAAAZABkKZW5kc3RyZWFtCmVuZG9iagoKMzM5IDAgb2JqCjw8Ci9UeXBl IC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0zMzkKL1dpZHRo IDcKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2Ug Wy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8ZmZmZmZmZTdlN2U3ZTRlNGU0ZWRl ZGVkPl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl YW0KeNoTnQMAAMgAsgplbmRzdHJlYW0KZW5kb2JqCgozNDAgMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTM0MAov V2lkdGggNQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JT cGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDxmZmZmZmZlN2U3ZTdlNGU0 ZTQ+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVh bQp42pNkAAAANAAaCmVuZHN0cmVhbQplbmRvYmoKCjM0MSAwIG9iago8PAov VHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMzQxCi9X aWR0aCA0Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNw YWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEgPGVhZWFlYWU0ZTRlND5dCi9M ZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTBQAA FgAWCmVuZHN0cmVhbQplbmRvYmoKCjM0MiAwIG9iago8PAovVHlwZSAvWE9i amVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMzQyCi9XaWR0aCA0Ci9I ZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5k ZXhlZCAvRGV2aWNlUkdCIDEgPGU0ZTRlNGVhZWFlYT5dCi9MZW5ndGggOQov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjBAAAAgACCmVuZHN0 cmVhbQplbmRvYmoKCjM0MyAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3Vi dHlwZSAvSW1hZ2UKL05hbWUgL0ltMzQzCi9XaWR0aCA3Ci9IZWlnaHQgMQov Qml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2 aWNlUkdCIDIgPGVhZWFlYWU0ZTRlNGU3ZTdlNz5dCi9MZW5ndGggMTAKL0Zp bHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaE50BAADEAK4KZW5kc3Ry ZWFtCmVuZG9iagoKMzQ0IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0 eXBlIC9JbWFnZQovTmFtZSAvSW0zNDQKL1dpZHRoIDUKL0hlaWdodCAxCi9C aXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZp Y2VSR0IgMSA8ZmZmZmZmZTdlN2U3Pl0KL0xlbmd0aCAxMAovRmlsdGVyIC9G bGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTZQAAACwAFgplbmRzdHJlYW0KZW5k b2JqCgozNDUgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0lt YWdlCi9OYW1lIC9JbTM0NQovV2lkdGggNAovSGVpZ2h0IDEKL0JpdHNQZXJD b21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAx IDxlN2U3ZTdlNGU0ZTQ+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjaYwQAAAIAAgplbmRzdHJlYW0KZW5kb2JqCgozNDYg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTM0NgovV2lkdGggNAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg MgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDxlN2U3ZTdl NGU0ZTRlYWVhZWE+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUK Pj4Kc3RyZWFtCnjaYwMAAAcABwplbmRzdHJlYW0KZW5kb2JqCgozNDcgMCBv YmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9J bTM0NwovV2lkdGggOAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgov Q29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAzIDxlN2U3ZTdlNGU0 ZTRmMGYwZjBmZmZmZmY+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVj b2RlCj4+CnN0cmVhbQp42hMTBgAAQQAqCmVuZHN0cmVhbQplbmRvYmoKCjM0 OCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05h bWUgL0ltMzQ4Ci9XaWR0aCA1Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVu dCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPGZmZmZm ZmU3ZTdlN2U0ZTRlND5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjak2IAAAA2ABsKZW5kc3RyZWFtCmVuZG9iagoKMzQ5 IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFt ZSAvSW0zNDkKL1dpZHRoIDQKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50 IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8ZTdlN2U3 ZTRlNGU0Pl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0 cmVhbQp42hMAAAARABEKZW5kc3RyZWFtCmVuZG9iagoKMzUwIDAgb2JqCjw8 Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0zNTAK L1dpZHRoIDYKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8ZWFlYWVhZTdlN2U3ZTRl NGU0ZWRlZGVkPl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+ PgpzdHJlYW0KeNqTLAAAAKQAigplbmRzdHJlYW0KZW5kb2JqCgozNTEgMCBv YmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9J bTM1MQovV2lkdGggOAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgov Q29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDxmZmZmZmZlN2U3 ZTdlNGU0ZTQ+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+ CnN0cmVhbQp42hMLAQAAggBrCmVuZHN0cmVhbQplbmRvYmoKCjM1MiAwIG9i ago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0lt MzUyCi9XaWR0aCA2Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9D b2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMgPGY2ZjZmNmU3ZTdl N2U0ZTRlNGVhZWFlYT5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjaEysAAACeAIcKZW5kc3RyZWFtCmVuZG9iagoKMzUz IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFt ZSAvSW0zNTMKL1dpZHRoIDEyCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVu dCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDQgPGZmZmZm ZmU3ZTdlN2YwZjBmMGVhZWFlYWU0ZTRlND5dCi9MZW5ndGggMTQKL0ZpbHRl ciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYxRkEjB0BAABPACXCmVuZHN0 cmVhbQplbmRvYmoKCjM1NCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3Vi dHlwZSAvSW1hZ2UKL05hbWUgL0ltMzU0Ci9XaWR0aCA3Ci9IZWlnaHQgMQov Qml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2 aWNlUkdCIDIgPGU3ZTdlN2U0ZTRlNGYwZjBmMD5dCi9MZW5ndGggMTAKL0Zp bHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY5AAAAAaABkKZW5kc3Ry ZWFtCmVuZG9iagoKMzU1IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0 eXBlIC9JbWFnZQovTmFtZSAvSW0zNTUKL1dpZHRoIDcKL0hlaWdodCAxCi9C aXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZp Y2VSR0IgMyA8ZjBmMGYwZTRlNGU0ZTdlN2U3ZmZmZmZmPl0KL0xlbmd0aCAx MAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTWgMAAOIAxwpl bmRzdHJlYW0KZW5kb2JqCgozNTYgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QK L1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTM1NgovV2lkdGggNQovSGVpZ2h0 IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQg L0RldmljZVJHQiAyIDxmZmZmZmZlN2U3ZTdmY2ZjZmM+XQovTGVuZ3RoIDEw Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hNtAAAArACWCmVu ZHN0cmVhbQplbmRvYmoKCjM1NyAwIG9iago8PAovVHlwZSAvWE9iamVjdAov U3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMzU3Ci9XaWR0aCA0Ci9IZWlnaHQg MQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAv RGV2aWNlUkdCIDEgPGVkZWRlZGU3ZTdlNz5dCi9MZW5ndGggOQovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTBQAAFgAWCmVuZHN0cmVhbQpl bmRvYmoKCjM1OCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAv SW1hZ2UKL05hbWUgL0ltMzU4Ci9XaWR0aCAzCi9IZWlnaHQgMQovQml0c1Bl ckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdC IDEgPGU0ZTRlNGU3ZTdlNz5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURl Y29kZQo+PgpzdHJlYW0KeNpjAQAABQAFCmVuZHN0cmVhbQplbmRvYmoKCjM1 OSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05h bWUgL0ltMzU5Ci9XaWR0aCA0Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVu dCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPGU0ZTRl NGU3ZTdlN2Y5ZjlmOT5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNpjAwAABwAHCmVuZHN0cmVhbQplbmRvYmoKCjM2MCAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltMzYwCi9XaWR0aCA5Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAy Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPGU3ZTdlN2U0 ZTRlNGZmZmZmZj5dCi9MZW5ndGggMTEKL0ZpbHRlciAvRmxhdGVEZWNvZGUK Pj4Kc3RyZWFtCnjaExJoAAAA2QCjCmVuZHN0cmVhbQplbmRvYmoKCjM2MSAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltMzYxCi9XaWR0aCA5Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAy Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEgPGZmZmZmZmU3 ZTdlNz5dCi9MZW5ndGggMTEKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3Ry ZWFtCnjaE2V1AAAAjABbCmVuZHN0cmVhbQplbmRvYmoKCjM2MiAwIG9iago8 PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMzYy Ci9XaWR0aCA3Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xv clNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMgPGVkZWRlZGU3ZTdlN2U0 ZTRlNGZmZmZmZj5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUK Pj4Kc3RyZWFtCnjaE4sBAACKAHMKZW5kc3RyZWFtCmVuZG9iagoKMzYzIDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW0zNjMKL1dpZHRoIDcKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIK L0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8ZmZmZmZmZTdl N2U3ZTRlNGU0Pl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+ PgpzdHJlYW0KeNqTnAIAAMgArgplbmRzdHJlYW0KZW5kb2JqCgozNjQgMCBv YmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9J bTM2NAovV2lkdGggNwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgov Q29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDxlYWVhZWFlN2U3 ZTdlNGU0ZTQ+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+ CnN0cmVhbQp42hNdAQAA1AC+CmVuZHN0cmVhbQplbmRvYmoKCjM2NSAwIG9i ago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0lt MzY1Ci9XaWR0aCA3Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9D b2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPGYwZjBmMGU3ZTdl N2Y2ZjZmNj5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4K c3RyZWFtCnjaE40AAACEAG4KZW5kc3RyZWFtCmVuZG9iagoKMzY2IDAgb2Jq Cjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0z NjYKL1dpZHRoIDUKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0Nv bG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8ZWFlYWVhZTdlN2U3 ZTRlNGU0ZmZmZmZmPl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNqTPAAAAPQA2gplbmRzdHJlYW0KZW5kb2JqCgozNjcg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTM2NwovV2lkdGggOAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg MgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxIDxlN2U3ZTdl NGU0ZTQ+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0 cmVhbQp42hMNAQAAgABqCmVuZHN0cmVhbQplbmRvYmoKCjM2OCAwIG9iago8 PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMzY4 Ci9XaWR0aCA4Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xv clNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPGZmZmZmZmU3ZTdlN2U0 ZTRlND5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3Ry ZWFtCnjak0oBAACaAH8KZW5kc3RyZWFtCmVuZG9iagoKMzY5IDAgb2JqCjw8 Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0zNjkK L1dpZHRoIDcKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8ZTRlNGU0ZTdlN2U3ZWRl ZGVkPl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl YW0KeNpj5QAAABQADgplbmRzdHJlYW0KZW5kb2JqCgozNzAgMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTM3MAov V2lkdGggMTIKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNCA8ZmZmZmZmZTRlNGU0ZTdl N2U3ZmNmY2ZjZWFlYWVhPl0KL0xlbmd0aCAxNAovRmlsdGVyIC9GbGF0ZURl Y29kZQo+PgpzdHJlYW0KeNpjFDJUdhQCAAInALsKZW5kc3RyZWFtCmVuZG9i agoKMzcxIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFn ZQovTmFtZSAvSW0zNzEKL1dpZHRoIDE2Ci9IZWlnaHQgMQovQml0c1BlckNv bXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDQg PGU3ZTdlN2U0ZTRlNGY0ZjRmNGY5ZjlmOWZmZmZmZj5dCi9MZW5ndGggMTYK L0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY2BgFDJgYGABAAEs AEgKZW5kc3RyZWFtCmVuZG9iagoKMzcyIDAgb2JqCjw8Ci9UeXBlIC9YT2Jq ZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0zNzIKL1dpZHRoIDQKL0hl aWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRl eGVkIC9EZXZpY2VSR0IgMiA8ZTdlN2U3ZTRlNGU0ZWRlZGVkPl0KL0xlbmd0 aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hMDAAAXABcK ZW5kc3RyZWFtCmVuZG9iagoKMzczIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0 Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0zNzMKL1dpZHRoIDQKL0hlaWdo dCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVk IC9EZXZpY2VSR0IgMiA8ZTdlN2U3ZTRlNGU0ZjBmMGYwPl0KL0xlbmd0aCA5 Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hMCAAATABMKZW5k c3RyZWFtCmVuZG9iagoKMzc0IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9T dWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0zNzQKL1dpZHRoIDQKL0hlaWdodCAx Ci9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9E ZXZpY2VSR0IgMSA8ZTdlN2U3ZTRlNGU0Pl0KL0xlbmd0aCA5Ci9GaWx0ZXIg L0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hMBAAAVABUKZW5kc3RyZWFtCmVu ZG9iagoKMzc1IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9J bWFnZQovTmFtZSAvSW0zNzUKL1dpZHRoIDkKL0hlaWdodCAxCi9CaXRzUGVy Q29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0Ig MiA8ZTRlNGU0ZWFlYWVhZTdlN2U3Pl0KL0xlbmd0aCAxMQovRmlsdGVyIC9G bGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjZGgAAACGAIIKZW5kc3RyZWFtCmVu ZG9iagoKMzc2IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9J bWFnZQovTmFtZSAvSW0zNzYKL1dpZHRoIDkKL0hlaWdodCAxCi9CaXRzUGVy Q29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0Ig MiA8ZmZmZmZmZTdlN2U3ZTRlNGU0Pl0KL0xlbmd0aCAxMQovRmlsdGVyIC9G bGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTZXMAAACOAFwKZW5kc3RyZWFtCmVu ZG9iagoKMzc3IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9J bWFnZQovTmFtZSAvSW0zNzcKL1dpZHRoIDgKL0hlaWdodCAxCi9CaXRzUGVy Q29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0Ig MiA8ZWRlZGVkZTRlNGU0ZTdlN2U3Pl0KL0xlbmd0aCAxMAovRmlsdGVyIC9G bGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTXAUAAN4AxAplbmRzdHJlYW0KZW5k b2JqCgozNzggMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0lt YWdlCi9OYW1lIC9JbTM3OAovV2lkdGggNwovSGVpZ2h0IDEKL0JpdHNQZXJD b21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAx IDxlN2U3ZTdlNGU0ZTQ+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVj b2RlCj4+CnN0cmVhbQp42mNhAAAACgAFCmVuZHN0cmVhbQplbmRvYmoKCjM3 OSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05h bWUgL0ltMzc5Ci9XaWR0aCA3Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVu dCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPGVhZWFl YWU3ZTdlN2U0ZTRlND5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjaE00BAACQAHoKZW5kc3RyZWFtCmVuZG9iagoKMzgw IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFt ZSAvSW0zODAKL1dpZHRoIDcKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50 IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8ZTdlN2U3 ZTRlNGU0ZWFlYWVhPl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNpj8QAAAFIATQplbmRzdHJlYW0KZW5kb2JqCgozODEg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTM4MQovV2lkdGggOAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg MgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAzIDxmZmZmZmZl NGU0ZTRlN2U3ZTdmNmY2ZjY+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRl RGVjb2RlCj4+CnN0cmVhbQp42pNKBwAAnQCCCmVuZHN0cmVhbQplbmRvYmoK CjM4MiAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UK L05hbWUgL0ltMzgyCi9XaWR0aCAxOAovSGVpZ2h0IDEKL0JpdHNQZXJDb21w b25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA0IDxm MGYwZjBlN2U3ZTdlNGU0ZTRmY2ZjZmNmZmZmZmY+XQovTGVuZ3RoIDE3Ci9G aWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMUElRUdhRSEgEABCAA 8gplbmRzdHJlYW0KZW5kb2JqCgozODMgMCBvYmoKPDwKL1R5cGUgL1hPYmpl Y3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTM4MwovV2lkdGggMwovSGVp Z2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4 ZWQgL0RldmljZVJHQiAxIDxlNGU0ZTRmN2Y3Zjc+XQovTGVuZ3RoIDkKL0Zp bHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYwEAAAUABQplbmRzdHJl YW0KZW5kb2JqCgozODQgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5 cGUgL0ltYWdlCi9OYW1lIC9JbTM4NAovV2lkdGggMwovSGVpZ2h0IDEKL0Jp dHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rldmlj ZVJHQiAxIDxlN2U3ZTdlNGU0ZTQ+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxh dGVEZWNvZGUKPj4Kc3RyZWFtCnjaEwAAABEAEQplbmRzdHJlYW0KZW5kb2Jq CgozODUgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdl Ci9OYW1lIC9JbTM4NQovV2lkdGggMTIKL0hlaWdodCAxCi9CaXRzUGVyQ29t cG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNCA8 ZmZmZmZmZTRlNGU0ZTdlN2U3ZmNmY2ZjZWFlYWVhPl0KL0xlbmd0aCAxNAov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVBRUdhICAAH0AKsK ZW5kc3RyZWFtCmVuZG9iagoKMzg2IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0 Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0zODYKL1dpZHRoIDIKL0hlaWdo dCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVk IC9EZXZpY2VSR0IgMSA8ZWRlZGVkZmZmZmZmPl0KL0xlbmd0aCA5Ci9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hMAAAARABEKZW5kc3RyZWFt CmVuZG9iagoKMzg3IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBl IC9JbWFnZQovTmFtZSAvSW0zODcKL1dpZHRoIDgKL0hlaWdodCAxCi9CaXRz UGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VS R0IgMiA8ZTdlN2U3ZTRlNGU0ZWFlYWVhPl0KL0xlbmd0aCAxMAovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTYAMAACgAFwplbmRzdHJlYW0K ZW5kb2JqCgozODggMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTM4OAovV2lkdGggNAovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiAyIDxlYWVhZWFlN2U3ZTdlNGU0ZTQ+XQovTGVuZ3RoIDkKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjakwQAABoAGgplbmRzdHJlYW0KZW5k b2JqCgozODkgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0lt YWdlCi9OYW1lIC9JbTM4OQovV2lkdGggNAovSGVpZ2h0IDEKL0JpdHNQZXJD b21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAy IDxlN2U3ZTdlNGU0ZTRmZmZmZmY+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxh dGVEZWNvZGUKPj4Kc3RyZWFtCnjaEwMAABcAFwplbmRzdHJlYW0KZW5kb2Jq CgozOTAgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdl Ci9OYW1lIC9JbTM5MAovV2lkdGggMwovSGVpZ2h0IDEKL0JpdHNQZXJDb21w b25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxIDxl NGU0ZTRmMGYwZjA+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUK Pj4Kc3RyZWFtCnjaYwEAAAUABQplbmRzdHJlYW0KZW5kb2JqCgozOTEgMCBv YmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9J bTM5MQovV2lkdGggNAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgov Q29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDxmNGY0ZjRlNGU0 ZTRlN2U3ZTc+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4K c3RyZWFtCnjaEwMAABcAFwplbmRzdHJlYW0KZW5kb2JqCgozOTIgMCBvYmoK PDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTM5 MgovV2lkdGggMTkKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0Nv bG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8ZTdlN2U3ZTRlNGU0 ZmZmZmZmPl0KL0xlbmd0aCAxMwovRmlsdGVyIC9GbGF0ZURlY29kZQo+Pgpz dHJlYW0KeNoTFM30EgAAAo0A6gplbmRzdHJlYW0KZW5kb2JqCgozOTMgMCBv YmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9J bTM5MwovV2lkdGggNAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgov Q29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDxlN2U3ZTdlNGU0 ZTRmOWY5Zjk+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4K c3RyZWFtCnjaEwIAABMAEwplbmRzdHJlYW0KZW5kb2JqCgozOTQgMCBvYmoK PDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTM5 NAovV2lkdGggOAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29s b3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAzIDxlN2U3ZTdmN2Y3Zjdm ZmZmZmZlNGU0ZTQ+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2Rl Cj4+CnN0cmVhbQp42mNsBgAAhwCFCmVuZHN0cmVhbQplbmRvYmoKCjM5NSAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltMzk1Ci9XaWR0aCA3Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0 Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDQgPGYzZjNmM2Vk ZWRlZGU3ZTdlN2U0ZTRlNGYwZjBmMD5dCi9MZW5ndGggMTIKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1Q2dAAAARMAlgplbmRzdHJlYW0K ZW5kb2JqCgozOTYgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTM5NgovV2lkdGggNAovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiAyIDxmM2YzZjNlN2U3ZTdlNGU0ZTQ+XQovTGVuZ3RoIDkKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjakwIAABsAGwplbmRzdHJlYW0KZW5k b2JqCgozOTcgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0lt YWdlCi9OYW1lIC9JbTM5NwovV2lkdGggNAovSGVpZ2h0IDEKL0JpdHNQZXJD b21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAy IDxlZGVkZWRlN2U3ZTdlNGU0ZTQ+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxh dGVEZWNvZGUKPj4Kc3RyZWFtCnjakwQAABoAGgplbmRzdHJlYW0KZW5kb2Jq CgozOTggMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdl Ci9OYW1lIC9JbTM5OAovV2lkdGggNQovSGVpZ2h0IDEKL0JpdHNQZXJDb21w b25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDxl N2U3ZTdlNGU0ZTRmZmZmZmY+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRl RGVjb2RlCj4+CnN0cmVhbQp42hNpAAAAqgCVCmVuZHN0cmVhbQplbmRvYmoK CjM5OSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UK L05hbWUgL0ltMzk5Ci9XaWR0aCA0Ci9IZWlnaHQgMQovQml0c1BlckNvbXBv bmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEgPGU3 ZTdlN2U0ZTRlND5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+ PgpzdHJlYW0KeNpjAQAABQAFCmVuZHN0cmVhbQplbmRvYmoKCjQwMCAwIG9i ago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0lt NDAwCi9XaWR0aCA1Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9D b2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPGZmZmZmZmU0ZTRl NGU3ZTdlNz5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4K c3RyZWFtCnjaE20AAACsAJYKZW5kc3RyZWFtCmVuZG9iagoKNDAxIDAgb2Jq Cjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW00 MDEKL1dpZHRoIDQKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0Nv bG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8ZTdlN2U3ZWFlYWVh Pl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4 2mMEAAACAAIKZW5kc3RyZWFtCmVuZG9iagoKNDAyIDAgb2JqCjw8Ci9UeXBl IC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW00MDIKL1dpZHRo IDQKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2Ug Wy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8ZmZmZmZmZTRlNGU0Pl0KL0xlbmd0 aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hMBAAAVABUK ZW5kc3RyZWFtCmVuZG9iagoKNDAzIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0 Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW00MDMKL1dpZHRoIDE2Ci9IZWln aHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhl ZCAvRGV2aWNlUkdCIDQgPGVhZWFlYWU3ZTdlN2ZmZmZmZmU0ZTRlNGYwZjBm MD5dCi9MZW5ndGggMTYKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFt CnjaYxRSNhZ0YhYEAAOAANEKZW5kc3RyZWFtCmVuZG9iagoKNDA0IDAgb2Jq Cjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW00 MDQKL1dpZHRoIDEzCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9D b2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDUgPGZmZmZmZmZjZmNm Y2U3ZTdlN2U0ZTRlNGVhZWFlYWYwZjBmMD5dCi9MZW5ndGggMTUKL0ZpbHRl ciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYxBUVlE2ZQAAAn8AsQplbmRz dHJlYW0KZW5kb2JqCgo0MDUgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1 YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTQwNQovV2lkdGggNAovSGVpZ2h0IDEK L0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rl dmljZVJHQiAxIDxmZmZmZmZlNGU0ZTQ+XQovTGVuZ3RoIDkKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaEwUAABYAFgplbmRzdHJlYW0KZW5k b2JqCgo0MDYgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0lt YWdlCi9OYW1lIC9JbTQwNgovV2lkdGggOQovSGVpZ2h0IDEKL0JpdHNQZXJD b21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAy IDxlNGU0ZTRmZmZmZmZlN2U3ZTc+XQovTGVuZ3RoIDExCi9GaWx0ZXIgL0Zs YXRlRGVjb2RlCj4+CnN0cmVhbQp42mN1cgAAANYAiAplbmRzdHJlYW0KZW5k b2JqCgo0MDcgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0lt YWdlCi9OYW1lIC9JbTQwNwovV2lkdGggNAovSGVpZ2h0IDEKL0JpdHNQZXJD b21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAy IDxlN2U3ZTdlNGU0ZTRlYWVhZWE+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxh dGVEZWNvZGUKPj4Kc3RyZWFtCnjaEwMAABcAFwplbmRzdHJlYW0KZW5kb2Jq Cgo0MDggMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdl Ci9OYW1lIC9JbTQwOAovV2lkdGggMTkKL0hlaWdodCAxCi9CaXRzUGVyQ29t cG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8 ZjRmNGY0ZTdlN2U3ZTRlNGU0ZmZmZmZmPl0KL0xlbmd0aCAxMwovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqT/LV37hoACIcDGgplbmRzdHJl YW0KZW5kb2JqCgo0MDkgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5 cGUgL0ltYWdlCi9OYW1lIC9JbTQwOQovV2lkdGggMTEKL0hlaWdodCAxCi9C aXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZp Y2VSR0IgNCA8ZjBmMGYwZTRlNGU0ZTdlN2U3ZWFlYWVhZmZmZmZmPl0KL0xl bmd0aCAxNAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVHYU UnAAAAJ1ANgKZW5kc3RyZWFtCmVuZG9iagoKNDEwIDAgb2JqCjw8Ci9UeXBl IC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW00MTAKL1dpZHRo IDUKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2Ug Wy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8ZmZmZmZmZTRlNGU0ZTdlN2U3Pl0K L0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoT YwAAAC4AFwplbmRzdHJlYW0KZW5kb2JqCgo0MTEgMCBvYmoKPDwKL1R5cGUg L1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTQxMQovV2lkdGgg MTQKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2Ug Wy9JbmRleGVkIC9EZXZpY2VSR0IgNSA8ZmZmZmZmZjBmMGYwZjZmNmY2ZTRl NGU0ZTdlN2U3ZjNmM2YzPl0KL0xlbmd0aCAxNQovRmlsdGVyIC9GbGF0ZURl Y29kZQo+PgpzdHJlYW0KeNpjVDZhdHYJAAADiQExCmVuZHN0cmVhbQplbmRv YmoKCjQxMiAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1h Z2UKL05hbWUgL0ltNDEyCi9XaWR0aCA1Ci9IZWlnaHQgMQovQml0c1BlckNv bXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIg PGVhZWFlYWU3ZTdlN2ZmZmZmZj5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxh dGVEZWNvZGUKPj4Kc3RyZWFtCnjaE20AAACsAJYKZW5kc3RyZWFtCmVuZG9i agoKNDEzIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFn ZQovTmFtZSAvSW00MTMKL1dpZHRoIDQKL0hlaWdodCAxCi9CaXRzUGVyQ29t cG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8 ZTRlNGU0ZTdlN2U3Pl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2Rl Cj4+CnN0cmVhbQp42mMFAAAGAAYKZW5kc3RyZWFtCmVuZG9iagoKNDE0IDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW00MTQKL1dpZHRoIDQKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIK L0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8ZTdlN2U3ZTRl NGU0ZWFlYWVhPl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+ CnN0cmVhbQp42hMCAAATABMKZW5kc3RyZWFtCmVuZG9iagoKNDE1IDAgb2Jq Cjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW00 MTUKL1dpZHRoIDE0Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9D b2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMgPGZmZmZmZmU0ZTRl NGU3ZTdlN2Y0ZjRmND5dCi9MZW5ndGggMTIKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjaEws9mQAAA00BlQplbmRzdHJlYW0KZW5kb2JqCgo0 MTYgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9O YW1lIC9JbTQxNgovV2lkdGggNAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25l bnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDxlYWVh ZWFlNGU0ZTRlN2U3ZTc+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjaEwMAABcAFwplbmRzdHJlYW0KZW5kb2JqCgo0MTcg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTQxNwovV2lkdGggMTYKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50 IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8ZTdlN2U3 ZTRlNGU0ZjlmOWY5ZmZmZmZmPl0KL0xlbmd0aCAxMgovRmlsdGVyIC9GbGF0 ZURlY29kZQo+PgpzdHJlYW0KeNoTdWlxBgACbwEhCmVuZHN0cmVhbQplbmRv YmoKCjQxOCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1h Z2UKL05hbWUgL0ltNDE4Ci9XaWR0aCA3Ci9IZWlnaHQgMQovQml0c1BlckNv bXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIg PGU0ZTRlNGZmZmZmZmU3ZTdlNz5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxh dGVEZWNvZGUKPj4Kc3RyZWFtCnjaY9QAAAAsACoKZW5kc3RyZWFtCmVuZG9i agoKNDE5IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFn ZQovTmFtZSAvSW00MTkKL1dpZHRoIDEwCi9IZWlnaHQgMQovQml0c1BlckNv bXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMg PGZmZmZmZmU0ZTRlNGU3ZTdlN2VkZWRlZD5dCi9MZW5ndGggMTEKL0ZpbHRl ciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaE40sAAABZADfCmVuZHN0cmVh bQplbmRvYmoKCjQyMCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlw ZSAvSW1hZ2UKL05hbWUgL0ltNDIwCi9XaWR0aCA0Ci9IZWlnaHQgMQovQml0 c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNl UkdCIDIgPGU3ZTdlN2U0ZTRlNGYwZjBmMD5dCi9MZW5ndGggOQovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTAwAAFwAXCmVuZHN0cmVhbQpl bmRvYmoKCjQyMSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAv SW1hZ2UKL05hbWUgL0ltNDIxCi9XaWR0aCAyNAovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiAzIDxmZmZmZmZlNGU0ZTRmY2ZjZmNlN2U3ZTc+XQovTGVuZ3RoIDE0Ci9G aWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hNtPfgxNB4ACf0DAQpl bmRzdHJlYW0KZW5kb2JqCgo0MjIgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QK L1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTQyMgovV2lkdGggNwovSGVpZ2h0 IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQg L0RldmljZVJHQiAxIDxlNGU0ZTRlN2U3ZTc+XQovTGVuZ3RoIDEwCi9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNwAQAARgBFCmVuZHN0cmVh bQplbmRvYmoKCjQyMyAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlw ZSAvSW1hZ2UKL05hbWUgL0ltNDIzCi9XaWR0aCA3Ci9IZWlnaHQgMQovQml0 c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNl UkdCIDEgPGU3ZTdlN2U0ZTRlND5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxh dGVEZWNvZGUKPj4Kc3RyZWFtCnjaYxEAAAAaABUKZW5kc3RyZWFtCmVuZG9i agoKNDI0IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFn ZQovTmFtZSAvSW00MjQKL1dpZHRoIDgKL0hlaWdodCAxCi9CaXRzUGVyQ29t cG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8 ZmZmZmZmZTdlN2U3ZTRlNGU0ZjBmMGYwPl0KL0xlbmd0aCAxMAovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTSgcAAJ0AggplbmRzdHJlYW0K ZW5kb2JqCgo0MjUgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTQyNQovV2lkdGggNAovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiAxIDxlNGU0ZTRlN2U3ZTc+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVE ZWNvZGUKPj4Kc3RyZWFtCnjaYwQAAAIAAgplbmRzdHJlYW0KZW5kb2JqCgo0 MjYgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9O YW1lIC9JbTQyNgovV2lkdGggMTUKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9u ZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNCA8ZmZm ZmZmZTdlN2U3ZTRlNGU0ZjNmM2YzZWFlYWVhPl0KL0xlbmd0aCAxNgovRmls dGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjEFJUFGZScgAAAscAzApl bmRzdHJlYW0KZW5kb2JqCgo0MjcgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QK L1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTQyNwovV2lkdGggOQovSGVpZ2h0 IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQg L0RldmljZVJHQiA0IDxmMGYwZjBlN2U3ZTdlNGU0ZTRmYWZhZmFmY2ZjZmM+ XQovTGVuZ3RoIDEzCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4 2mMUMlEUAAABQAB5CmVuZHN0cmVhbQplbmRvYmoKCjQyOCAwIG9iago8PAov VHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltNDI4Ci9X aWR0aCA3Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNw YWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPGY5ZjlmOWU3ZTdlN2U0ZTRl ND5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFt CnjakwoBAACKAG8KZW5kc3RyZWFtCmVuZG9iagoKNDI5IDAgb2JqCjw8Ci9U eXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW00MjkKL1dp ZHRoIDcKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3Bh Y2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8ZTdlN2U3ZTRlNGU0ZjBmMGYw Pl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0K eNoTiwAAAIYAbwplbmRzdHJlYW0KZW5kb2JqCgo0MzAgMCBvYmoKPDwKL1R5 cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTQzMAovV2lk dGggMTAKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3Bh Y2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8ZWRlZGVkZTRlNGU0ZTdlN2U3 Pl0KL0xlbmd0aCAxMQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0K eNoTDVsAAAGOAQwKZW5kc3RyZWFtCmVuZG9iagoKNDMxIDAgb2JqCjw8Ci9U eXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW00MzEKL1dp ZHRoIDQKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3Bh Y2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8ZTRlNGU0ZTdlN2U3ZjBmMGYw Pl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4 2mMDAAAHAAcKZW5kc3RyZWFtCmVuZG9iagoKNDMyIDAgb2JqCjw8Ci9UeXBl IC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW00MzIKL1dpZHRo IDI0Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNl IFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMgPGZmZmZmZmU0ZTRlNGZjZmNmY2U3 ZTdlNz5dCi9MZW5ndGggMTQKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3Ry ZWFtCnjaE20/XBh6HQAJBwL9CmVuZHN0cmVhbQplbmRvYmoKCjQzMyAwIG9i ago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0lt NDMzCi9XaWR0aCA3Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9D b2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMgPGVkZWRlZGU0ZTRl NGU3ZTdlN2ZmZmZmZj5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjak8oBAACiAIcKZW5kc3RyZWFtCmVuZG9iagoKNDM0 IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFt ZSAvSW00MzQKL1dpZHRoIDUKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50 IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8ZmZmZmZm ZTdlN2U3ZTRlNGU0Pl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNoTYwAAAC4AFwplbmRzdHJlYW0KZW5kb2JqCgo0MzUg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTQzNQovV2lkdGggOAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg MgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAzIDxmNGY0ZjRl N2U3ZTdlNGU0ZTRmZmZmZmY+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRl RGVjb2RlCj4+CnN0cmVhbQp42pO+CQABEQD1CmVuZHN0cmVhbQplbmRvYmoK CjQzNiAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UK L05hbWUgL0ltNDM2Ci9XaWR0aCA3Ci9IZWlnaHQgMQovQml0c1BlckNvbXBv bmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPGZm ZmZmZmU3ZTdlN2U0ZTRlND5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVE ZWNvZGUKPj4Kc3RyZWFtCnjaE50CAADAAKoKZW5kc3RyZWFtCmVuZG9iagoK NDM3IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQov TmFtZSAvSW00MzcKL1dpZHRoIDE0Ci9IZWlnaHQgMQovQml0c1BlckNvbXBv bmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPGU3 ZTdlN2U0ZTRlNGZmZmZmZj5dCi9MZW5ndGggMTIKL0ZpbHRlciAvRmxhdGVE ZWNvZGUKPj4Kc3RyZWFtCnjaE2VUYAAAAJsANwplbmRzdHJlYW0KZW5kb2Jq Cgo0MzggMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdl Ci9OYW1lIC9JbTQzOAovV2lkdGggNQovSGVpZ2h0IDEKL0JpdHNQZXJDb21w b25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAzIDxm ZmZmZmZlNGU0ZTRlN2U3ZTdlZGVkZWQ+XQovTGVuZ3RoIDEwCi9GaWx0ZXIg L0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hM7AAAA7gDXCmVuZHN0cmVhbQpl bmRvYmoKCjQzOSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAv SW1hZ2UKL05hbWUgL0ltNDM5Ci9XaWR0aCA0Ci9IZWlnaHQgMQovQml0c1Bl ckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdC IDEgPGZmZmZmZmU3ZTdlNz5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURl Y29kZQo+PgpzdHJlYW0KeNoTAQAAFQAVCmVuZHN0cmVhbQplbmRvYmoKCjQ0 MCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05h bWUgL0ltNDQwCi9XaWR0aCA0Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVu dCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPGU3ZTdl N2U0ZTRlNGY3ZjdmNz5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNpjAwAABwAHCmVuZHN0cmVhbQplbmRvYmoKCjQ0MSAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltNDQxCi9XaWR0aCA0Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAy Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEgPGZmZmZmZmU3 ZTdlNz5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl YW0KeNoTBQAAFgAWCmVuZHN0cmVhbQplbmRvYmoKCjQ0MiAwIG9iago8PAov VHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltNDQyCi9X aWR0aCA0Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNw YWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPGYzZjNmM2U0ZTRlNGU3ZTdl Nz5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0K eNoTAwAAFwAXCmVuZHN0cmVhbQplbmRvYmoKCjQ0MyAwIG9iago8PAovVHlw ZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltNDQzCi9XaWR0 aCA3Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNl IFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPGYzZjNmM2U0ZTRlNGZmZmZmZj5d Ci9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja E40AAACEAG4KZW5kc3RyZWFtCmVuZG9iagoKNDQ0IDAgb2JqCjw8Ci9UeXBl IC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW00NDQKL1dpZHRo IDExCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNl IFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPGU3ZTdlN2U0ZTRlNGZmZmZmZj5d Ci9MZW5ndGggMTEKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja Yw31AAABBACjCmVuZHN0cmVhbQplbmRvYmoKCjQ0NSAwIG9iago8PAovVHlw ZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltNDQ1Ci9XaWR0 aCAxNAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFj ZSBbL0luZGV4ZWQgL0RldmljZVJHQiA0IDxmMGYwZjBlNGU0ZTRmZmZmZmZl N2U3ZTdmYWZhZmE+XQovTGVuZ3RoIDE1Ci9GaWx0ZXIgL0ZsYXRlRGVjb2Rl Cj4+CnN0cmVhbQp42mMUVBIWUTYEAAIdALAKZW5kc3RyZWFtCmVuZG9iagoK NDQ2IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQov TmFtZSAvSW00NDYKL1dpZHRoIDQKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9u ZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8ZTdl N2U3ZTRlNGU0ZjlmOWY5Pl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVj b2RlCj4+CnN0cmVhbQp42hMDAAAXABcKZW5kc3RyZWFtCmVuZG9iagoKNDQ3 IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFt ZSAvSW00NDcKL1dpZHRoIDUKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50 IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8ZmZmZmZm ZTRlNGU0ZmFmYWZhPl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNoTbQAAAKwAlgplbmRzdHJlYW0KZW5kb2JqCgo0NDgg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTQ0OAovV2lkdGggNgovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg MgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDxmZmZmZmZl NGU0ZTRlZGVkZWQ+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2Rl Cj4+CnN0cmVhbQp42hNtAAAArACWCmVuZHN0cmVhbQplbmRvYmoKCjQ0OSAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltNDQ5Ci9XaWR0aCAzCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAy Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPGVhZWFlYWU3 ZTdlN2U0ZTRlND5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+ PgpzdHJlYW0KeNqTAAAAGQAZCmVuZHN0cmVhbQplbmRvYmoKCjQ1MCAwIG9i ago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0lt NDUwCi9XaWR0aCA0Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9D b2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPGZmZmZmZmU3ZTdl N2U0ZTRlND5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+Pgpz dHJlYW0KeNqTBAAAGgAaCmVuZHN0cmVhbQplbmRvYmoKCjQ1MSAwIG9iago8 PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltNDUx Ci9XaWR0aCAyMAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29s b3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA0IDxlYWVhZWFlN2U3ZTdl NGU0ZTRmZmZmZmZmY2ZjZmM+XQovTGVuZ3RoIDE4Ci9GaWx0ZXIgL0ZsYXRl RGVjb2RlCj4+CnN0cmVhbQp42mNUFFJUdhQUVFQGAAWnASAKZW5kc3RyZWFt CmVuZG9iagoKNDUyIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBl IC9JbWFnZQovTmFtZSAvSW00NTIKL1dpZHRoIDYKL0hlaWdodCAxCi9CaXRz UGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VS R0IgMiA8ZTdlN2U3ZTRlNGU0ZmZmZmZmPl0KL0xlbmd0aCAxMAovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjSAAAAGIAYQplbmRzdHJlYW0K ZW5kb2JqCgo0NTMgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTQ1MwovV2lkdGggNwovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiAyIDxlN2U3ZTdlNGU0ZTRmZmZmZmY+XQovTGVuZ3RoIDEwCi9GaWx0ZXIg L0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNbAAAArgCnCmVuZHN0cmVhbQpl bmRvYmoKCjQ1NCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAv SW1hZ2UKL05hbWUgL0ltNDU0Ci9XaWR0aCA1Ci9IZWlnaHQgMQovQml0c1Bl ckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdC IDMgPGZmZmZmZmU0ZTRlNGU3ZTdlN2YwZjBmMD5dCi9MZW5ndGggMTAKL0Zp bHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjakzoAAAD2ANsKZW5kc3Ry ZWFtCmVuZG9iagoKNDU1IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0 eXBlIC9JbWFnZQovTmFtZSAvSW00NTUKL1dpZHRoIDQKL0hlaWdodCAxCi9C aXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZp Y2VSR0IgMSA8ZWFlYWVhZTdlN2U3Pl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0Zs YXRlRGVjb2RlCj4+CnN0cmVhbQp42hMFAAAWABYKZW5kc3RyZWFtCmVuZG9i agoKNDU2IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFn ZQovTmFtZSAvSW00NTYKL1dpZHRoIDE3Ci9IZWlnaHQgMQovQml0c1BlckNv bXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDUg PGU3ZTdlN2ZmZmZmZmYzZjNmM2VhZWFlYWZhZmFmYWU0ZTRlND5dCi9MZW5n dGggMTcKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY2AQYGAy EQgIAAACcwD3CmVuZHN0cmVhbQplbmRvYmoKCjQ1NyAwIG9iago8PAovVHlw ZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltNDU3Ci9XaWR0 aCA2Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNl IFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPGZmZmZmZmU0ZTRlNGU3ZTdlNz5d Ci9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja E10AAADMALYKZW5kc3RyZWFtCmVuZG9iagoKNDU4IDAgb2JqCjw8Ci9UeXBl IC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW00NTgKL1dpZHRo IDQKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2Ug Wy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8ZmZmZmZmZTdlN2U3ZjBmMGYwPl0K L0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hMD AAAXABcKZW5kc3RyZWFtCmVuZG9iagoKNDU5IDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW00NTkKL1dpZHRoIDUK L0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9J bmRleGVkIC9EZXZpY2VSR0IgMyA8ZjRmNGY0ZTRlNGU0ZTdlN2U3ZjZmNmY2 Pl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0K eNoTOwAAAO4A1wplbmRzdHJlYW0KZW5kb2JqCgo0NjAgMCBvYmoKPDwKL1R5 cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTQ2MAovV2lk dGggOQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFj ZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxIDxlNGU0ZTRlN2U3ZTc+XQovTGVu Z3RoIDExCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hMUcAAA AJYAYgplbmRzdHJlYW0KZW5kb2JqCgo0NjEgMCBvYmoKPDwKL1R5cGUgL1hP YmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTQ2MQovV2lkdGggOQov SGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0lu ZGV4ZWQgL0RldmljZVJHQiAyIDxmZmZmZmZlN2U3ZTdlNGU0ZTQ+XQovTGVu Z3RoIDExCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hNb2gAA Ag8BPAplbmRzdHJlYW0KZW5kb2JqCgo0NjIgMCBvYmoKPDwKL1R5cGUgL1hP YmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTQ2MgovV2lkdGggOQov SGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0lu ZGV4ZWQgL0RldmljZVJHQiA2IDxlYWVhZWFlN2U3ZTdlNGU0ZTRlZGVkZWRm NmY2ZjZmM2YzZjNmZmZmZmY+XQovTGVuZ3RoIDEzCi9GaWx0ZXIgL0ZsYXRl RGVjb2RlCj4+CnN0cmVhbQp42mNUMglMAAACMAEJCmVuZHN0cmVhbQplbmRv YmoKCjQ2MyAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1h Z2UKL05hbWUgL0ltNDYzCi9XaWR0aCA4Ci9IZWlnaHQgMQovQml0c1BlckNv bXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDUg PGU3ZTdlN2VhZWFlYWYzZjNmM2VkZWRlZGU0ZTRlNGZmZmZmZj5dCi9MZW5n dGggMTIKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1R2YQUA AP4AbgplbmRzdHJlYW0KZW5kb2JqCgo0NjQgMCBvYmoKPDwKL1R5cGUgL1hP YmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTQ2NAovV2lkdGggNgov SGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0lu ZGV4ZWQgL0RldmljZVJHQiAyIDxmZmZmZmZlNGU0ZTRlN2U3ZTc+XQovTGVu Z3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hNLAAAA jgB3CmVuZHN0cmVhbQplbmRvYmoKCjQ2NSAwIG9iago8PAovVHlwZSAvWE9i amVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltNDY1Ci9XaWR0aCA4Ci9I ZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5k ZXhlZCAvRGV2aWNlUkdCIDMgPGVhZWFlYWU3ZTdlN2U0ZTRlNGY0ZjRmND5d Ci9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja k44EAACRAHUKZW5kc3RyZWFtCmVuZG9iagoKNDY2IDAgb2JqCjw8Ci9UeXBl IC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW00NjYKL1dpZHRo IDgKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2Ug Wy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8ZmZmZmZmZTdlN2U3ZWRlZGVkZjNm M2YzPl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl YW0KeNqTDgUAAI0AcQplbmRzdHJlYW0KZW5kb2JqCgo0NjcgMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTQ2Nwov V2lkdGggMTAKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8ZWFlYWVhZTRlNGU0ZTdl N2U3ZmZmZmZmPl0KL0xlbmd0aCAxMQovRmlsdGVyIC9GbGF0ZURlY29kZQo+ PgpzdHJlYW0KeNoTy9oAAAHJATEKZW5kc3RyZWFtCmVuZG9iagoKNDY4IDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW00NjgKL1dpZHRoIDgKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIK L0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8ZTdlN2U3ZTRl NGU0ZWFlYWVhPl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+ PgpzdHJlYW0KeNpjCAIAAFQAUwplbmRzdHJlYW0KZW5kb2JqCgo0NjkgMCBv YmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9J bTQ2OQovV2lkdGggNgovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgov Q29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAzIDxlZGVkZWRlN2U3 ZTdlNGU0ZTRmZmZmZmY+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVj b2RlCj4+CnN0cmVhbQp42pMqAAAApgCLCmVuZHN0cmVhbQplbmRvYmoKCjQ3 MCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05h bWUgL0ltNDcwCi9XaWR0aCA3Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVu dCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEgPGU0ZTRl NGU3ZTdlNz5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4K c3RyZWFtCnjaYxQBAAAYABYKZW5kc3RyZWFtCmVuZG9iagoKNDcxIDAgb2Jq Cjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW00 NzEKL1dpZHRoIDUKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0Nv bG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8ZmZmZmZmZTRlNGU0 ZTdlN2U3ZjBmMGYwPl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNoTOwAAAO4A1wplbmRzdHJlYW0KZW5kb2JqCgo0NzIg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTQ3MgovV2lkdGggMTcKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50 IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNSA8ZWRlZGVk ZTRlNGU0ZWFlYWVhZTdlN2U3ZjBmMGYwZmZmZmZmPl0KL0xlbmd0aCAxNwov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjFBQSNDE0NA4AAASP AU8KZW5kc3RyZWFtCmVuZG9iagoKNDczIDAgb2JqCjw8Ci9UeXBlIC9YT2Jq ZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW00NzMKL1dpZHRoIDUKL0hl aWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRl eGVkIC9EZXZpY2VSR0IgMSA8ZTdlN2U3ZTRlNGU0Pl0KL0xlbmd0aCAxMAov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTYQAAACoAFQplbmRz dHJlYW0KZW5kb2JqCgo0NzQgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1 YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTQ3NAovV2lkdGggNAovSGVpZ2h0IDEK L0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rl dmljZVJHQiAzIDxmOWY5ZjllN2U3ZTdlNGU0ZTRmZmZmZmY+XQovTGVuZ3Ro IDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjakwYAABwAHApl bmRzdHJlYW0KZW5kb2JqCgo0NzUgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QK L1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTQ3NQovV2lkdGggNQovSGVpZ2h0 IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQg L0RldmljZVJHQiAyIDxmZmZmZmZlN2U3ZTdlNGU0ZTQ+XQovTGVuZ3RoIDEw Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42pN0AAAAdABaCmVu ZHN0cmVhbQplbmRvYmoKCjQ3NiAwIG9iago8PAovVHlwZSAvWE9iamVjdAov U3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltNDc2Ci9XaWR0aCA5Ci9IZWlnaHQg MQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAv RGV2aWNlUkdCIDIgPGU3ZTdlN2U0ZTRlNGVkZWRlZD5dCi9MZW5ndGggMTEK L0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaEw1sAAABZADnCmVu ZHN0cmVhbQplbmRvYmoKCjQ3NyAwIG9iago8PAovVHlwZSAvWE9iamVjdAov U3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltNDc3Ci9XaWR0aCA4Ci9IZWlnaHQg MQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAv RGV2aWNlUkdCIDIgPGU3ZTdlN2U0ZTRlNGVkZWRlZD5dCi9MZW5ndGggMTAK L0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY5kAAACaAJUKZW5k c3RyZWFtCmVuZG9iagoKNDc4IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9T dWJ0eXBlIC9JbWFnZQovTmFtZSAvSW00NzgKL1dpZHRoIDgKL0hlaWdodCAx Ci9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9E ZXZpY2VSR0IgMiA8ZTdlN2U3ZTRlNGU0ZmZmZmZmPl0KL0xlbmd0aCAxMAov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjFAIAABYAFAplbmRz dHJlYW0KZW5kb2JqCgo0NzkgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1 YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTQ3OQovV2lkdGggNwovSGVpZ2h0IDEK L0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rl dmljZVJHQiAxIDxlN2U3ZTdlYWVhZWE+XQovTGVuZ3RoIDEwCi9GaWx0ZXIg L0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNgAQAABgAFCmVuZHN0cmVhbQpl bmRvYmoKCjQ4MCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAv SW1hZ2UKL05hbWUgL0ltNDgwCi9XaWR0aCA1Ci9IZWlnaHQgMQovQml0c1Bl ckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdC IDEgPGU3ZTdlN2U0ZTRlND5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVE ZWNvZGUKPj4Kc3RyZWFtCnjaY2EAAAAKAAUKZW5kc3RyZWFtCmVuZG9iagoK NDgxIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQov TmFtZSAvSW00ODEKL1dpZHRoIDgKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9u ZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8ZmNm Y2ZjZTdlN2U3ZTRlNGU0ZjBmMGYwPl0KL0xlbmd0aCAxMAovRmlsdGVyIC9G bGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTuwoAAQMA7AplbmRzdHJlYW0KZW5k b2JqCgo0ODIgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0lt YWdlCi9OYW1lIC9JbTQ4MgovV2lkdGggOAovSGVpZ2h0IDEKL0JpdHNQZXJD b21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAy IDxmY2ZjZmNlN2U3ZTdmZmZmZmY+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0Zs YXRlRGVjb2RlCj4+CnN0cmVhbQp42hMNAwAAggBsCmVuZHN0cmVhbQplbmRv YmoKCjQ4MyAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1h Z2UKL05hbWUgL0ltNDgzCi9XaWR0aCAxMAovSGVpZ2h0IDEKL0JpdHNQZXJD b21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAy IDxlN2U3ZTdlNGU0ZTRmZmZmZmY+XQovTGVuZ3RoIDExCi9GaWx0ZXIgL0Zs YXRlRGVjb2RlCj4+CnN0cmVhbQp42mMQVAAAAEUAMgplbmRzdHJlYW0KZW5k b2JqCgo0ODQgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0lt YWdlCi9OYW1lIC9JbTQ4NAovV2lkdGggNgovSGVpZ2h0IDEKL0JpdHNQZXJD b21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAz IDxmMGYwZjBlN2U3ZTdlNGU0ZTRmNGY0ZjQ+XQovTGVuZ3RoIDEwCi9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hMrAAAAngCHCmVuZHN0cmVh bQplbmRvYmoKCjQ4NSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlw ZSAvSW1hZ2UKL05hbWUgL0ltNDg1Ci9XaWR0aCA1Ci9IZWlnaHQgMQovQml0 c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNl UkdCIDEgPGU3ZTdlN2ZmZmZmZj5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxh dGVEZWNvZGUKPj4Kc3RyZWFtCnjaY3AAAABCAEEKZW5kc3RyZWFtCmVuZG9i agoKNDg2IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFn ZQovTmFtZSAvSW00ODYKL1dpZHRoIDcKL0hlaWdodCAxCi9CaXRzUGVyQ29t cG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNCA8 ZmZmZmZmZWFlYWVhZTRlNGU0ZTdlN2U3ZWRlZGVkPl0KL0xlbmd0aCAxMgov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVFZ2AAAA9wCICmVu ZHN0cmVhbQplbmRvYmoKCjQ4NyAwIG9iago8PAovVHlwZSAvWE9iamVjdAov U3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltNDg3Ci9XaWR0aCA0Ci9IZWlnaHQg MQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAv RGV2aWNlUkdCIDEgPGVhZWFlYWU3ZTdlNz5dCi9MZW5ndGggOQovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTAQAAFQAVCmVuZHN0cmVhbQpl bmRvYmoKCjQ4OCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAv SW1hZ2UKL05hbWUgL0ltNDg4Ci9XaWR0aCAxNQovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiA0IDxlYWVhZWFlN2U3ZTdmM2YzZjNmZmZmZmZlNGU0ZTQ+XQovTGVuZ3Ro IDE2Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMUMhQ0FHE0 AAADuwEMCmVuZHN0cmVhbQplbmRvYmoKCjQ4OSAwIG9iago8PAovVHlwZSAv WE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltNDg5Ci9XaWR0aCA1 Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsv SW5kZXhlZCAvRGV2aWNlUkdCIDMgPGVkZWRlZGU0ZTRlNGU3ZTdlN2YzZjNm Mz5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFt CnjakzwAAAD0ANoKZW5kc3RyZWFtCmVuZG9iagoKNDkwIDAgb2JqCjw8Ci9U eXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW00OTAKL1dp ZHRoIDQKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3Bh Y2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8ZWFlYWVhZTdlN2U3ZTllOWU5 Pl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4 2pMAAAAZABkKZW5kc3RyZWFtCmVuZG9iagoKNDkxIDAgb2JqCjw8Ci9UeXBl IC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW00OTEKL1dpZHRo IDgKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2Ug Wy9JbmRleGVkIC9EZXZpY2VSR0IgNCA8ZTdlN2U3ZTRlNGU0ZWFlYWVhZmZm ZmZmZjNmM2YzPl0KL0xlbmd0aCAxMgovRmlsdGVyIC9GbGF0ZURlY29kZQo+ PgpzdHJlYW0KeNpjFDJgAQAAogBICmVuZHN0cmVhbQplbmRvYmoKCjQ5MiAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltNDkyCi9XaWR0aCA0Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAy Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPGZmZmZmZmU3 ZTdlN2VkZWRlZD5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+ PgpzdHJlYW0KeNoTAwAAFwAXCmVuZHN0cmVhbQplbmRvYmoKCjQ5MyAwIG9i ago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0lt NDkzCi9XaWR0aCAzCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9D b2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEgPGVhZWFlYWVkZWRl ZD5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0K eNoTAAAAEQARCmVuZHN0cmVhbQplbmRvYmoKCjQ5NCAwIG9iago8PAovVHlw ZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltNDk0Ci9XaWR0 aCA2Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNl IFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPGY0ZjRmNGU3ZTdlN2YzZjNmMz5d Ci9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja E00AAACMAHYKZW5kc3RyZWFtCmVuZG9iagoKNDk1IDAgb2JqCjw8Ci9UeXBl IC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW00OTUKL1dpZHRo IDYKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2Ug Wy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8ZjlmOWY5ZWFlYWVhZTdlN2U3ZmZm ZmZmPl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl YW0KeNqTKgAAAKYAiwplbmRzdHJlYW0KZW5kb2JqCgo0OTYgMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTQ5Ngov V2lkdGggNAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JT cGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDxlYWVhZWFlN2U3ZTdmMGYw ZjA+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFt CnjaEwMAABcAFwplbmRzdHJlYW0KZW5kb2JqCgo0OTcgMCBvYmoKPDwKL1R5 cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTQ5NwovV2lk dGggNwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFj ZSBbL0luZGV4ZWQgL0RldmljZVJHQiAzIDxmYWZhZmFlN2U3ZTdmZmZmZmZl ZGVkZWQ+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0 cmVhbQp42hP6AwABIgEPCmVuZHN0cmVhbQplbmRvYmoKCjQ5OCAwIG9iago8 PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltNDk4 Ci9XaWR0aCA3Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xv clNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMgPGZmZmZmZmYzZjNmM2U3 ZTdlN2VkZWRlZD5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUK Pj4Kc3RyZWFtCnjak9oAAADmAMsKZW5kc3RyZWFtCmVuZG9iagoKNDk5IDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW00OTkKL1dpZHRoIDUKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIK L0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8ZWFlYWVhZTRl NGU0ZTdlN2U3ZmZmZmZmPl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURl Y29kZQo+PgpzdHJlYW0KeNoTOwAAAO4A1wplbmRzdHJlYW0KZW5kb2JqCgo1 MDAgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9O YW1lIC9JbTUwMAovV2lkdGggNgovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25l bnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxIDxlN2U3 ZTdlNGU0ZTQ+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+ CnN0cmVhbQp42mN1AAAATABGCmVuZHN0cmVhbQplbmRvYmoKCjUwMSAwIG9i ago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0lt NTAxCi9XaWR0aCA2Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9D b2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPGU3ZTdlN2U0ZTRl NGZmZmZmZj5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4K c3RyZWFtCnjaE00AAACMAHYKZW5kc3RyZWFtCmVuZG9iagoKNTAyIDAgb2Jq Cjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW01 MDIKL1dpZHRoIDQKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0Nv bG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8ZTdlN2U3ZWRlZGVk Pl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4 2mMEAAACAAIKZW5kc3RyZWFtCmVuZG9iagoKNTAzIDAgb2JqCjw8Ci9UeXBl IC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW01MDMKL1dpZHRo IDQKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2Ug Wy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8ZmNmY2ZjZmFmYWZhZjlmOWY5ZmZm ZmZmPl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVh bQp42pMGAAAcABwKZW5kc3RyZWFtCmVuZG9iagoKNTA0IDAgb2JqCjw8Ci9U eXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW01MDQKL1dp ZHRoIDQKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3Bh Y2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8ZjdmN2Y3ZmZmZmZmPl0KL0xl bmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMEAAAC AAIKZW5kc3RyZWFtCmVuZG9iagoKNTA1IDAgb2JqCjw8Ci9UeXBlIC9YT2Jq ZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW01MDUKL1dpZHRoIDQKL0hl aWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRl eGVkIC9EZXZpY2VSR0IgMiA8ZjBmMGYwZWRlZGVkZmFmYWZhPl0KL0xlbmd0 aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hMDAAAXABcK ZW5kc3RyZWFtCmVuZG9iagoKNTA2IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0 Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW01MDYKL1dpZHRoIDQKL0hlaWdo dCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVk IC9EZXZpY2VSR0IgMSA8ZTdlN2U3ZjNmM2YzPl0KL0xlbmd0aCA5Ci9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMEAAACAAIKZW5kc3RyZWFt CmVuZG9iagoKNTA3IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBl IC9JbWFnZQovTmFtZSAvSW01MDcKL1dpZHRoIDkKL0hlaWdodCAxCi9CaXRz UGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VS R0IgMiA8ZjZmNmY2ZjRmNGY0ZjNmM2YzPl0KL0xlbmd0aCAxMQovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTnOoAAAGgAOcKZW5kc3RyZWFt CmVuZG9iagoKNTA4IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBl IC9JbWFnZQovTmFtZSAvSW01MDgKL1dpZHRoIDIKL0hlaWdodCAxCi9CaXRz UGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VS R0IgMSA8ZmZmZmZmZWFlYWVhPl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRl RGVjb2RlCj4+CnN0cmVhbQp42hMAAAARABEKZW5kc3RyZWFtCmVuZG9iagoK NTA5IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQov TmFtZSAvSW01MDkKL1dpZHRoIDQKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9u ZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8ZTdl N2U3ZTRlNGU0ZjZmNmY2Pl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVj b2RlCj4+CnN0cmVhbQp42hMCAAATABMKZW5kc3RyZWFtCmVuZG9iagoKNTEw IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFt ZSAvSW01MTAKL1dpZHRoIDQKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50 IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8ZTRlNGU0 ZTdlN2U3ZWRlZGVkPl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2Rl Cj4+CnN0cmVhbQp42mMDAAAHAAcKZW5kc3RyZWFtCmVuZG9iagoKNTExIDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW01MTEKL1dpZHRoIDQKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIK L0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8ZTdlN2U3ZTRl NGU0ZjNmM2YzPl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+ CnN0cmVhbQp42hMCAAATABMKZW5kc3RyZWFtCmVuZG9iagoKNTEyIDAgb2Jq Cjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW01 MTIKL1dpZHRoIDkKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0Nv bG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8ZTdlN2U3ZTRlNGU0 Pl0KL0xlbmd0aCAxMQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0K eNoTFXEAAACqAGoKZW5kc3RyZWFtCmVuZG9iagoKNTEzIDAgb2JqCjw8Ci9U eXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW01MTMKL1dp ZHRoIDQKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3Bh Y2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8ZTdlN2U3ZTRlNGU0ZjRmNGY0 Pl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4 2hMDAAAXABcKZW5kc3RyZWFtCmVuZG9iagoKNTE0IDAgb2JqCjw8Ci9UeXBl IC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW01MTQKL1dpZHRo IDQKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2Ug Wy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8ZTdlN2U3ZTRlNGU0ZWRlZGVkPl0K L0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hMC AAATABMKZW5kc3RyZWFtCmVuZG9iagoKNTE1IDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW01MTUKL1dpZHRoIDkK L0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9J bmRleGVkIC9EZXZpY2VSR0IgMSA8ZTdlN2U3ZTRlNGU0Pl0KL0xlbmd0aCAx MQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTDHUAAAEgAKcK ZW5kc3RyZWFtCmVuZG9iagoKNTE2IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0 Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW01MTYKL1dpZHRoIDQKL0hlaWdo dCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVk IC9EZXZpY2VSR0IgMiA8ZTRlNGU0ZTdlN2U3ZjRmNGY0Pl0KL0xlbmd0aCA5 Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hMCAAATABMKZW5k c3RyZWFtCmVuZG9iagoKNTE3IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9T dWJ0eXBlIC9JbWFnZQovTmFtZSAvSW01MTcKL1dpZHRoIDQKL0hlaWdodCAx Ci9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9E ZXZpY2VSR0IgMiA8ZTdlN2U3ZTRlNGU0ZjNmM2YzPl0KL0xlbmd0aCA5Ci9G aWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hMDAAAXABcKZW5kc3Ry ZWFtCmVuZG9iagoKNTE4IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0 eXBlIC9JbWFnZQovTmFtZSAvSW01MTgKL1dpZHRoIDkKL0hlaWdodCAxCi9C aXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZp Y2VSR0IgMyA8ZTdlN2U3ZTRlNGU0ZjBmMGYwZjNmM2YzPl0KL0xlbmd0aCAx MQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTWHUAAAJHAXsK ZW5kc3RyZWFtCmVuZG9iagoKNTE5IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0 Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW01MTkKL1dpZHRoIDIKL0hlaWdo dCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVk IC9EZXZpY2VSR0IgMSA8ZmFmYWZhZmZmZmZmPl0KL0xlbmd0aCA5Ci9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hMAAAARABEKZW5kc3RyZWFt CmVuZG9iagoKNTIwIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBl IC9JbWFnZQovTmFtZSAvSW01MjAKL1dpZHRoIDkKL0hlaWdodCAxCi9CaXRz UGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VS R0IgNCA8ZTllOWU5ZTRlNGU0ZTdlN2U3ZmZmZmZmZWRlZGVkPl0KL0xlbmd0 aCAxMwovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjFDIUcgAA AUkAlwplbmRzdHJlYW0KZW5kb2JqCgo1MjEgMCBvYmoKPDwKL1R5cGUgL1hP YmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTUyMQovV2lkdGggNwov SGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0lu ZGV4ZWQgL0RldmljZVJHQiAzIDxmOWY5ZjllNGU0ZTRlN2U3ZTdmZmZmZmY+ XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4 2hPNAQAAmACCCmVuZHN0cmVhbQplbmRvYmoKCjUyMiAwIG9iago8PAovVHlw ZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltNTIyCi9XaWR0 aCA3Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNl IFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMgPGY2ZjZmNmU0ZTRlNGU3ZTdlN2Yw ZjBmMD5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3Ry ZWFtCnjaE10DAADYAMIKZW5kc3RyZWFtCmVuZG9iagoKNTIzIDAgb2JqCjw8 Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW01MjMK L1dpZHRoIDYKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8ZTdlN2U3ZTRlNGU0ZWFl YWVhPl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl YW0KeNoTVAAAAEQAMgplbmRzdHJlYW0KZW5kb2JqCgo1MjQgMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTUyNAov V2lkdGggNwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JT cGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDxlNGU0ZTRlN2U3ZTdlZGVk ZWQ+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVh bQp42mPxAAAAUgBNCmVuZHN0cmVhbQplbmRvYmoKCjUyNSAwIG9iago8PAov VHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltNTI1Ci9X aWR0aCA5Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNw YWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDQgPGVhZWFlYWU0ZTRlNGU3ZTdl N2ZmZmZmZmYzZjNmMz5dCi9MZW5ndGggMTMKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjaY1Q0FHIAAAGFAKYKZW5kc3RyZWFtCmVuZG9iagoK NTI2IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQov TmFtZSAvSW01MjYKL1dpZHRoIDYKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9u ZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8ZWFl YWVhZTRlNGU0ZTdlN2U3ZTllOWU5Pl0KL0xlbmd0aCAxMAovRmlsdGVyIC9G bGF0ZURlY29kZQo+PgpzdHJlYW0KeNqT3AAAAOQAygplbmRzdHJlYW0KZW5k b2JqCgo1MjcgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0lt YWdlCi9OYW1lIC9JbTUyNwovV2lkdGggMTAKL0hlaWdodCAxCi9CaXRzUGVy Q29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0Ig MyA8ZmNmY2ZjZTdlN2U3ZTRlNGU0ZWRlZGVkPl0KL0xlbmd0aCAxMQovRmls dGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTmlkAAAHzASQKZW5kc3Ry ZWFtCmVuZG9iagoKNTI4IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0 eXBlIC9JbWFnZQovTmFtZSAvSW01MjgKL1dpZHRoIDgKL0hlaWdodCAxCi9C aXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZp Y2VSR0IgMiA8ZmNmY2ZjZTdlN2U3ZTRlNGU0Pl0KL0xlbmd0aCAxMAovRmls dGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTmwkAAMcAsAplbmRzdHJl YW0KZW5kb2JqCgo1MjkgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5 cGUgL0ltYWdlCi9OYW1lIC9JbTUyOQovV2lkdGggOQovSGVpZ2h0IDEKL0Jp dHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rldmlj ZVJHQiAyIDxlN2U3ZTdlNGU0ZTRmZmZmZmY+XQovTGVuZ3RoIDExCi9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hNY1QAAAgcBOwplbmRzdHJl YW0KZW5kb2JqCgo1MzAgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5 cGUgL0ltYWdlCi9OYW1lIC9JbTUzMAovV2lkdGggOAovSGVpZ2h0IDEKL0Jp dHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rldmlj ZVJHQiAzIDxmZmZmZmZlNGU0ZTRlN2U3ZTdmMGYwZjA+XQovTGVuZ3RoIDEw Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hONBgAAhwBxCmVu ZHN0cmVhbQplbmRvYmoKCjUzMSAwIG9iago8PAovVHlwZSAvWE9iamVjdAov U3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltNTMxCi9XaWR0aCA2Ci9IZWlnaHQg MQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAv RGV2aWNlUkdCIDEgPGU3ZTdlN2U0ZTRlND5dCi9MZW5ndGggMTAKL0ZpbHRl ciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaE2UAAAAsABYKZW5kc3RyZWFt CmVuZG9iagoKNTMyIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBl IC9JbWFnZQovTmFtZSAvSW01MzIKL1dpZHRoIDgKL0hlaWdodCAxCi9CaXRz UGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VS R0IgMiA8ZTdlN2U3ZTRlNGU0ZjlmOWY5Pl0KL0xlbmd0aCAxMAovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjcAIAAEQAQwplbmRzdHJlYW0K ZW5kb2JqCgo1MzMgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTUzMwovV2lkdGggMTAKL0hlaWdodCAxCi9CaXRz UGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VS R0IgMyA8ZmZmZmZmZTdlN2U3ZTRlNGU0ZjNmM2YzPl0KL0xlbmd0aCAxMQov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTmlUAAAH1ASUKZW5k c3RyZWFtCmVuZG9iagoKNTM0IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9T dWJ0eXBlIC9JbWFnZQovTmFtZSAvSW01MzQKL1dpZHRoIDgKL0hlaWdodCAx Ci9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9E ZXZpY2VSR0IgMyA8ZjBmMGYwZTdlN2U3ZTRlNGU0ZWFlYWVhPl0KL0xlbmd0 aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTWg4AAN0A wgplbmRzdHJlYW0KZW5kb2JqCgo1MzUgMCBvYmoKPDwKL1R5cGUgL1hPYmpl Y3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTUzNQovV2lkdGggMTAKL0hl aWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRl eGVkIC9EZXZpY2VSR0IgMyA8ZTdlN2U3ZTRlNGU0ZWFlYWVhZWRlZGVkPl0K L0xlbmd0aCAxMQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpj VTAAAACCAFYKZW5kc3RyZWFtCmVuZG9iagoKNTM2IDAgb2JqCjw8Ci9UeXBl IC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW01MzYKL1dpZHRo IDQKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2Ug Wy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8ZTdlN2U3ZjBmMGYwPl0KL0xlbmd0 aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMEAAACAAIK ZW5kc3RyZWFtCmVuZG9iagoKNTM3IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0 Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW01MzcKL1dpZHRoIDgKL0hlaWdo dCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVk IC9EZXZpY2VSR0IgNCA8ZWRlZGVkZTRlNGU0ZTdlN2U3ZmZmZmZmZjNmM2Yz Pl0KL0xlbmd0aCAxMgovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0K eNpjVFZSAQAA2QBrCmVuZHN0cmVhbQplbmRvYmoKCjUzOCAwIG9iago8PAov VHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltNTM4Ci9X aWR0aCA5Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNw YWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEgPGU3ZTdlN2U0ZTRlND5dCi9M ZW5ndGggMTEKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY3Vh AAAAmgBKCmVuZHN0cmVhbQplbmRvYmoKCjUzOSAwIG9iago8PAovVHlwZSAv WE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltNTM5Ci9XaWR0aCA2 Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsv SW5kZXhlZCAvRGV2aWNlUkdCIDIgPGYwZjBmMGU0ZTRlNGY0ZjRmND5dCi9M ZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaE1UA AABMADYKZW5kc3RyZWFtCmVuZG9iagoKNTQwIDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW01NDAKL1dpZHRoIDEw Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsv SW5kZXhlZCAvRGV2aWNlUkdCIDQgPGVhZWFlYWU0ZTRlNGU3ZTdlN2YzZjNm M2VkZWRlZD5dCi9MZW5ndGggMTMKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4K c3RyZWFtCnjaY1Q0EVQGAAFvAIsKZW5kc3RyZWFtCmVuZG9iagoKNTQxIDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW01NDEKL1dpZHRoIDkKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIK L0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8ZTdlN2U3ZTRl NGU0ZmZmZmZmPl0KL0xlbmd0aCAxMQovRmlsdGVyIC9GbGF0ZURlY29kZQo+ PgpzdHJlYW0KeNoTEmkAAADhAKcKZW5kc3RyZWFtCmVuZG9iagoKNTQyIDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW01NDIKL1dpZHRoIDQKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIK L0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8ZTdlN2U3ZTRl NGU0Pl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVh bQp42mMFAAAGAAYKZW5kc3RyZWFtCmVuZG9iagoKNTQzIDAgb2JqCjw8Ci9U eXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW01NDMKL1dp ZHRoIDQKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3Bh Y2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8ZTRlNGU0ZTdlN2U3ZmZmZmZm Pl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4 2hMDAAAXABcKZW5kc3RyZWFtCmVuZG9iagoKNTQ0IDAgb2JqCjw8Ci9UeXBl IC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW01NDQKL1dpZHRo IDgKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2Ug Wy9JbmRleGVkIC9EZXZpY2VSR0IgNCA8ZjlmOWY5ZTdlN2U3ZjBmMGYwZTRl NGU0ZjNmM2YzPl0KL0xlbmd0aCAxMgovRmlsdGVyIC9GbGF0ZURlY29kZQo+ PgpzdHJlYW0KeNpjFBIWAQAAeAA7CmVuZHN0cmVhbQplbmRvYmoKCjU0NSAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltNTQ1Ci9XaWR0aCA5Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAy Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEgPGU3ZTdlN2U0 ZTRlND5dCi9MZW5ndGggMTEKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3Ry ZWFtCnjaEwllAAAA6QBqCmVuZHN0cmVhbQplbmRvYmoKCjU0NiAwIG9iago8 PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltNTQ2 Ci9XaWR0aCA3Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xv clNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMgPGYzZjNmM2U0ZTRlNGU3 ZTdlN2ZmZmZmZj5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUK Pj4Kc3RyZWFtCnjaE+sBAAC6AKMKZW5kc3RyZWFtCmVuZG9iagoKNTQ3IDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW01NDcKL1dpZHRoIDcKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIK L0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8ZmNmY2ZjZWRl ZGVkZWFlYWVhZTRlNGU0Pl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURl Y29kZQo+PgpzdHJlYW0KeNoT+wMAASoBEwplbmRzdHJlYW0KZW5kb2JqCgo1 NDggMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9O YW1lIC9JbTU0OAovV2lkdGggOAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25l bnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAzIDxlNGU0 ZTRlN2U3ZTdmM2YzZjNmZmZmZmY+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0Zs YXRlRGVjb2RlCj4+CnN0cmVhbQp42hM7AAAA7gDXCmVuZHN0cmVhbQplbmRv YmoKCjU0OSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1h Z2UKL05hbWUgL0ltNTQ5Ci9XaWR0aCA1Ci9IZWlnaHQgMQovQml0c1BlckNv bXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMg PGY0ZjRmNGU0ZTRlNGU3ZTdlN2ZmZmZmZj5dCi9MZW5ndGggMTAKL0ZpbHRl ciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaEzsAAADuANcKZW5kc3RyZWFt CmVuZG9iagoKNTUwIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBl IC9JbWFnZQovTmFtZSAvSW01NTAKL1dpZHRoIDE4Ci9IZWlnaHQgMQovQml0 c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNl UkdCIDUgPGU0ZTRlNGU3ZTdlN2VkZWRlZGZmZmZmZmVhZWFlYWYzZjNmMz5d Ci9MZW5ndGggMTcKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja YxAyYBBgYBEQBQACegB8CmVuZHN0cmVhbQplbmRvYmoKCjU1MSAwIG9iago8 PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltNTUx Ci9XaWR0aCA5Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xv clNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMgPGU3ZTdlN2U0ZTRlNGU5 ZTllOWVhZWFlYT5dCi9MZW5ndGggMTEKL0ZpbHRlciAvRmxhdGVEZWNvZGUK Pj4Kc3RyZWFtCnjaE91/AAACgAGVCmVuZHN0cmVhbQplbmRvYmoKCjU1MiAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltNTUyCi9XaWR0aCA4Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAy Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMgPGZmZmZmZmU3 ZTdlN2U0ZTRlNGVkZWRlZD5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVE ZWNvZGUKPj4Kc3RyZWFtCnjaE10NAADXAMEKZW5kc3RyZWFtCmVuZG9iagoK NTUzIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQov TmFtZSAvSW01NTMKL1dpZHRoIDkKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9u ZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8ZmZm ZmZmZTdlN2U3ZTRlNGU0Pl0KL0xlbmd0aCAxMQovRmlsdGVyIC9GbGF0ZURl Y29kZQo+PgpzdHJlYW0KeNqTnOUAAAHCAPQKZW5kc3RyZWFtCmVuZG9iagoK NTU0IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQov TmFtZSAvSW01NTQKL1dpZHRoIDgKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9u ZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8ZTRl NGU0ZjBmMGYwZmZmZmZmZTdlN2U3Pl0KL0xlbmd0aCAxMAovRmlsdGVyIC9G bGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjbAYAAIcAhQplbmRzdHJlYW0KZW5k b2JqCgo1NTUgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0lt YWdlCi9OYW1lIC9JbTU1NQovV2lkdGggNQovSGVpZ2h0IDEKL0JpdHNQZXJD b21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAz IDxmOWY5ZjllNGU0ZTRlN2U3ZTdmY2ZjZmM+XQovTGVuZ3RoIDEwCi9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hM7AAAA7gDXCmVuZHN0cmVh bQplbmRvYmoKCjU1NiAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlw ZSAvSW1hZ2UKL05hbWUgL0ltNTU2Ci9XaWR0aCA0Ci9IZWlnaHQgMQovQml0 c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNl UkdCIDEgPGU0ZTRlNGVkZWRlZD5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0 ZURlY29kZQo+PgpzdHJlYW0KeNpjBAAAAgACCmVuZHN0cmVhbQplbmRvYmoK CjU1NyAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UK L05hbWUgL0ltNTU3Ci9XaWR0aCAxMwovSGVpZ2h0IDEKL0JpdHNQZXJDb21w b25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAzIDxl NGU0ZTRlN2U3ZTdlYWVhZWFmM2YzZjM+XQovTGVuZ3RoIDEyCi9GaWx0ZXIg L0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hNknXoAAAJBAWwKZW5kc3RyZWFt CmVuZG9iagoKNTU4IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBl IC9JbWFnZQovTmFtZSAvSW01NTgKL1dpZHRoIDcKL0hlaWdodCAxCi9CaXRz UGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VS R0IgMiA8ZmZmZmZmZTdlN2U3ZTRlNGU0Pl0KL0xlbmd0aCAxMAovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTWgIAANoAvwplbmRzdHJlYW0K ZW5kb2JqCgo1NTkgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTU1OQovV2lkdGggOQovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiAzIDxlN2U3ZTdlNGU0ZTRmZmZmZmZmN2Y3Zjc+XQovTGVuZ3RoIDExCi9G aWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hPZwgAAAacAyQplbmRz dHJlYW0KZW5kb2JqCgo1NjAgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1 YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTU2MAovV2lkdGggOAovSGVpZ2h0IDEK L0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rl dmljZVJHQiAzIDxlNGU0ZTRlN2U3ZTdmMGYwZjBmZmZmZmY+XQovTGVuZ3Ro IDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hM6AAAA5gDT CmVuZHN0cmVhbQplbmRvYmoKCjU2MSAwIG9iago8PAovVHlwZSAvWE9iamVj dAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltNTYxCi9XaWR0aCA1Ci9IZWln aHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhl ZCAvRGV2aWNlUkdCIDMgPGY2ZjZmNmU3ZTdlN2U0ZTRlNGZmZmZmZj5dCi9M ZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjakzwA AAD0ANoKZW5kc3RyZWFtCmVuZG9iagoKNTYyIDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW01NjIKL1dpZHRoIDEw Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsv SW5kZXhlZCAvRGV2aWNlUkdCIDMgPGU3ZTdlN2U0ZTRlNGZmZmZmZmVkZWRl ZD5dCi9MZW5ndGggMTEKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFt CnjaY11oAAABhADXCmVuZHN0cmVhbQplbmRvYmoKCjU2MyAwIG9iago8PAov VHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltNTYzCi9X aWR0aCA0Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNw YWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPGU3ZTdlN2U0ZTRlNGYzZjNm Mz5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0K eNpjAwAABwAHCmVuZHN0cmVhbQplbmRvYmoKCjU2NCAwIG9iago8PAovVHlw ZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltNTY0Ci9XaWR0 aCA5Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNl IFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPGU3ZTdlN2U0ZTRlNGZmZmZmZj5d Ci9MZW5ndGggMTEKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja E1nVAAACEwE/CmVuZHN0cmVhbQplbmRvYmoKCjU2NSAwIG9iago8PAovVHlw ZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltNTY1Ci9XaWR0 aCA1Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNl IFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMgPGU3ZTdlN2U0ZTRlNGZjZmNmY2Zm ZmZmZj5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3Ry ZWFtCnjaYzsAAADOAMcKZW5kc3RyZWFtCmVuZG9iagoKNTY2IDAgb2JqCjw8 Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW01NjYK L1dpZHRoIDQKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8ZTdlN2U3ZmZmZmZmPl0K L0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mME AAACAAIKZW5kc3RyZWFtCmVuZG9iagoKNTY3IDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW01NjcKL1dpZHRoIDQK L0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9J bmRleGVkIC9EZXZpY2VSR0IgMiA8ZWRlZGVkZTRlNGU0ZTdlN2U3Pl0KL0xl bmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hMDAAAX ABcKZW5kc3RyZWFtCmVuZG9iagoKNTY4IDAgb2JqCjw8Ci9UeXBlIC9YT2Jq ZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW01NjgKL1dpZHRoIDEwCi9I ZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5k ZXhlZCAvRGV2aWNlUkdCIDQgPGU3ZTdlN2U0ZTRlNGY5ZjlmOWY2ZjZmNmYz ZjNmMz5dCi9MZW5ndGggMTMKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3Ry ZWFtCnjaYxRUFhQBAADtAFsKZW5kc3RyZWFtCmVuZG9iagoKNTY5IDAgb2Jq Cjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW01 NjkKL1dpZHRoIDMKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0Nv bG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8ZTRlNGU0ZTdlN2U3 Pl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4 2hMAAAARABEKZW5kc3RyZWFtCmVuZG9iagoKNTcwIDAgb2JqCjw8Ci9UeXBl IC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW01NzAKL1dpZHRo IDEwCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNl IFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPGVkZWRlZGU3ZTdlN2U0ZTRlND5d Ci9MZW5ndGggMTEKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja k8pyAAABZQDFCmVuZHN0cmVhbQplbmRvYmoKCjU3MSAwIG9iago8PAovVHlw ZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltNTcxCi9XaWR0 aCA4Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNl IFsvSW5kZXhlZCAvRGV2aWNlUkdCIDQgPGVkZWRlZGU3ZTdlN2U0ZTRlNGZj ZmNmY2Y2ZjZmNj5dCi9MZW5ndGggMTIKL0ZpbHRlciAvRmxhdGVEZWNvZGUK Pj4Kc3RyZWFtCnjaY1RkdgQAALIAZwplbmRzdHJlYW0KZW5kb2JqCgo1NzIg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTU3MgovV2lkdGggMTgKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50 IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNSA8ZTdlN2U3 ZTRlNGU0ZmZmZmZmZWRlZGVkZjZmNmY2ZWFlYWVhPl0KL0xlbmd0aCAxNwov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjFGRkZFIwCRQAAAJ/ AMwKZW5kc3RyZWFtCmVuZG9iagoKNTczIDAgb2JqCjw8Ci9UeXBlIC9YT2Jq ZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW01NzMKL1dpZHRoIDUKL0hl aWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRl eGVkIC9EZXZpY2VSR0IgMSA8ZTdlN2U3ZTRlNGU0Pl0KL0xlbmd0aCAxMAov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjZQAAAAwABgplbmRz dHJlYW0KZW5kb2JqCgo1NzQgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1 YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTU3NAovV2lkdGggOQovSGVpZ2h0IDEK L0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rl dmljZVJHQiAyIDxlNGU0ZTRlN2U3ZTdmMGYwZjA+XQovTGVuZ3RoIDExCi9G aWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mOd6AAAAXQA1wplbmRz dHJlYW0KZW5kb2JqCgo1NzUgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1 YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTU3NQovV2lkdGggMTAKL0hlaWdodCAx Ci9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9E ZXZpY2VSR0IgMyA8ZmFmYWZhZTdlN2U3ZTRlNGU0ZjBmMGYwPl0KL0xlbmd0 aCAxMQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTWrUBAAJV AXUKZW5kc3RyZWFtCmVuZG9iagoKNTc2IDAgb2JqCjw8Ci9UeXBlIC9YT2Jq ZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW01NzYKL1dpZHRoIDgKL0hl aWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRl eGVkIC9EZXZpY2VSR0IgMiA8ZWRlZGVkZTdlN2U3ZTRlNGU0Pl0KL0xlbmd0 aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTWgkAAN8A xAplbmRzdHJlYW0KZW5kb2JqCgo1NzcgMCBvYmoKPDwKL1R5cGUgL1hPYmpl Y3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTU3NwovV2lkdGggMTAKL0hl aWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRl eGVkIC9EZXZpY2VSR0IgMyA8ZmZmZmZmZTdlN2U3ZTRlNGU0ZWRlZGVkPl0K L0xlbmd0aCAxMQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoT TSsAAAF+AOwKZW5kc3RyZWFtCmVuZG9iagoKNTc4IDAgb2JqCjw8Ci9UeXBl IC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW01NzgKL1dpZHRo IDcKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2Ug Wy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8ZTdlN2U3ZTRlNGU0Pl0KL0xlbmd0 aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTDAAAAHQA YgplbmRzdHJlYW0KZW5kb2JqCgo1NzkgMCBvYmoKPDwKL1R5cGUgL1hPYmpl Y3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTU3OQovV2lkdGggMTgKL0hl aWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRl eGVkIC9EZXZpY2VSR0IgMyA8ZTdlN2U3ZTRlNGU0ZmZmZmZmZjlmOWY5Pl0K L0xlbmd0aCAxMwovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpj FNAQNAAAARQAewplbmRzdHJlYW0KZW5kb2JqCgo1ODAgMCBvYmoKPDwKL1R5 cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTU4MAovV2lk dGggNQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFj ZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxIDxlN2U3ZTdlNGU0ZTQ+XQovTGVu Z3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hNlAAAA LAAWCmVuZHN0cmVhbQplbmRvYmoKCjU4MSAwIG9iago8PAovVHlwZSAvWE9i amVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltNTgxCi9XaWR0aCA5Ci9I ZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5k ZXhlZCAvRGV2aWNlUkdCIDIgPGVkZWRlZGU3ZTdlN2U0ZTRlND5dCi9MZW5n dGggMTEKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaE/V0AAAB FACfCmVuZHN0cmVhbQplbmRvYmoKCjU4MiAwIG9iago8PAovVHlwZSAvWE9i amVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltNTgyCi9XaWR0aCA5Ci9I ZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5k ZXhlZCAvRGV2aWNlUkdCIDMgPGVhZWFlYWU3ZTdlN2U0ZTRlNGYwZjBmMD5d Ci9MZW5ndGggMTEKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja k5I6AAABRQD1CmVuZHN0cmVhbQplbmRvYmoKCjU4MyAwIG9iago8PAovVHlw ZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltNTgzCi9XaWR0 aCA3Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNl IFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPGU0ZTRlNGU3ZTdlN2ZmZmZmZj5d Ci9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja Y40AAABkAF4KZW5kc3RyZWFtCmVuZG9iagoKNTg0IDAgb2JqCjw8Ci9UeXBl IC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW01ODQKL1dpZHRo IDkKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2Ug Wy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8ZmZmZmZmZTRlNGU0ZTdlN2U3ZWRl ZGVkPl0KL0xlbmd0aCAxMQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl YW0KeNqT1DoAAAFiAQQKZW5kc3RyZWFtCmVuZG9iagoKNTg1IDAgb2JqCjw8 Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW01ODUK L1dpZHRoIDYKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8ZjBmMGYwZTRlNGU0ZTdl N2U3Pl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl YW0KeNoTawAAAK4AlwplbmRzdHJlYW0KZW5kb2JqCgo1ODYgMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTU4Ngov V2lkdGggNAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JT cGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDxlYWVhZWFlN2U3ZTdmNGY0 ZjQ+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFt CnjaEwMAABcAFwplbmRzdHJlYW0KZW5kb2JqCgo1ODcgMCBvYmoKPDwKL1R5 cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTU4NwovV2lk dGggMTcKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3Bh Y2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8ZTdlN2U3ZWFlYWVhZmZmZmZm ZjBmMGYwPl0KL0xlbmd0aCAxMwovRmlsdGVyIC9GbGF0ZURlY29kZQo+Pgpz dHJlYW0KeNpjYcxmbAAAAeAA8gplbmRzdHJlYW0KZW5kb2JqCgo1ODggMCBv YmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9J bTU4OAovV2lkdGggNQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgov Q29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAzIDxmZmZmZmZlN2U3 ZTdlNGU0ZTRmYWZhZmE+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVj b2RlCj4+CnN0cmVhbQp42pM8AAAA9ADaCmVuZHN0cmVhbQplbmRvYmoKCjU4 OSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05h bWUgL0ltNTg5Ci9XaWR0aCA4Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVu dCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDYgPGYwZjBm MGU0ZTRlNGU3ZTdlN2ZmZmZmZmZjZmNmY2VkZWRlZGVhZWFlYT5dCi9MZW5n dGggMTIKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1R2DQMA AVEAwAplbmRzdHJlYW0KZW5kb2JqCgo1OTAgMCBvYmoKPDwKL1R5cGUgL1hP YmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTU5MAovV2lkdGggMwov SGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0lu ZGV4ZWQgL0RldmljZVJHQiAyIDxlYWVhZWFlNGU0ZTRlZGVkZWQ+XQovTGVu Z3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjakwAAABkA GQplbmRzdHJlYW0KZW5kb2JqCgo1OTEgMCBvYmoKPDwKL1R5cGUgL1hPYmpl Y3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTU5MQovV2lkdGggNAovSGVp Z2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4 ZWQgL0RldmljZVJHQiAxIDxlZGVkZWRmOWY5Zjk+XQovTGVuZ3RoIDkKL0Zp bHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYwQAAAIAAgplbmRzdHJl YW0KZW5kb2JqCgo1OTIgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5 cGUgL0ltYWdlCi9OYW1lIC9JbTU5MgovV2lkdGggNAovSGVpZ2h0IDEKL0Jp dHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rldmlj ZVJHQiAyIDxmY2ZjZmNlN2U3ZTdmN2Y3Zjc+XQovTGVuZ3RoIDkKL0ZpbHRl ciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaEwMAABcAFwplbmRzdHJlYW0K ZW5kb2JqCgo1OTMgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTU5MwovV2lkdGggMzAwCi9IZWlnaHQgNzYKL0Jp dHNQZXJDb21wb25lbnQgOAovQ29sb3JTcGFjZSAvRGV2aWNlUkdCCi9MZW5n dGggNTY5NgovRmlsdGVyIC9EQ1REZWNvZGUKPj4Kc3RyZWFtCv/Y/+AAEEpG SUYAAQEAAAEAAQAA/9sAQwAFAwQEBAMFBAQEBQUFBgcMCAcHBwcPCwsJDBEP EhIRDxERExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEFBQUH BgcOCAgOHhQRFB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4e/8AAEQgATAEsAwEiAAIRAQMRAf/EAB8AAAEFAQEB AQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQEC AwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYn KCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SF hoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV 1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAA AAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYS QVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4 OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKT lJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj 5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A+y6KKKACiiigAooooAKK KKACiiigAooooAKKKjlngix5s0aZ6bmApOSW7AkorPuNb0mDPmahb5H8Kvub 8AOTVOTxb4fjB3X/ACDggQvkH06Vn7eltzIHpublFc3B420KWbyfNlSQjIVk 5P5Gn6f4v0u+upba2jumki++CgXH5mpliaMFeUkgj7+kdToaKz01e1dWKBzt 6jAyP1pV1ey25d2jOcYZT/SsI5nhJOyqL7zT2U+xfoqpDqVlKpZZsAdSylR+ vWpkuIHxtmjbPTDDmumNanP4ZJkuLW6JaKTcvqKNw9RWpItFGR60UAFFFFAB RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFBIAJJwK5/WfFenWK yLbh72VByIRlR9W6fzqZTjBXkxSko7nQVUv9T0+wUm8vIIcDOHcA/lXB3Pir UdSt2ljuILOBT0BO78cHIrItnmPmsoea6bLxPIRj/ac9B39O9cFXHpPlhb5m Pt1a6TZ3N94xsYow1nDNd5zgohC4HfOMVz194y1e5na3t/I01FG7z5BuyPph q52XRWubIDzjLMq7VWFyqlsjJHHTipoPD5F21zfSR3LmMRwfKyiLHoVbn61h zVpK8p/doYvGX2iOl8VXDqZn1+3n2EgiOWQb/cLtAqvp2sxXtsxhN091yY1B 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 9dGrqNNYhxg16tL4EexD4UeyeENSJZBur13w1c+Yi89q8B8Hu3mJzXt3g9iY kzWhR3kBytSVDbf6sVNQB//ZCmVuZHN0cmVhbQplbmRvYmoKCjU5NCAwIG9i ago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0lt NTk0Ci9XaWR0aCAzMDAKL0hlaWdodCA3NgovQml0c1BlckNvbXBvbmVudCA4 Ci9Db2xvclNwYWNlIC9EZXZpY2VSR0IKL0xlbmd0aCA1MDE4Ci9GaWx0ZXIg L0RDVERlY29kZQo+PgpzdHJlYW0K/9j/4AAQSkZJRgABAQAAAQABAAD/2wBD AAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8SEhEPERETFhwXExQaFRER GCEYGh0dHx8fExciJCIeJBweHx7/2wBDAQUFBQcGBw4ICA4eFBEUHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh7/ wAARCABMASwDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQF BgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJx FDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdI SUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKj pKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx 8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QA tREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHB CSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldY WVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmq srO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6 /9oADAMBAAIRAxEAPwD7LooooAbIoeNkPRhg15BqudF8SPLbAeUspDjdnI9x XsNcl490xpY/tsaFwBhwOSPQ/SuXF0VUhYyqucVzQ3Rzr+JbGWGZLO4UyLl8 TKCSO4UHNc3OL25mXU0y8EpKlpOdg/HjH0FITFZ3v2qXzDnhsbQoXvxjmrmu 3+mPZwrBcRxSNjymikKY9tqjJ/Ovg85w06S9yVj28sxiqr3lqZcNjoiXDukc CSYPlvIWkCD2LdfpUdzHezWZjsrudZXyxYWxRCvvkf1xUx0q5lmee4uYzCoG 0yMV2j0Abr9TVLU4o7bzpbG6la2lx5kaybkY+pKkfoa8WMG7Sq+8elzJ35Tm lsLuQXCie0c5xtZkkaQ+oU/dxVW20S2acO0c8iwRYleORVSOTjkZAA6H1+td YIPPszLJdxpdrgJCIjGCPUAt+tZOqPaMzrIwu74g8MQIwfwPP410LEU3JRg3 6ETiuW7OZvbu3e9ilu9VgNpECqxxtuI9sYJP1FZ2pw2mpu09rZXUcUfyny5V jLj1JbPH5VV1BFuGjvr6KFzuKmPcAVH9B+NOkiufssA+y5VVzGyoVjC+oB4b 64r6nC5XGCVTmevZ2Pm8bmTk/ZwSa80c1rRs5SsFsHWKM4QADr3ORkH6ms24 MZ81pZpDMmRGyuD+GOgrr5dHlv5HvpIkdYUAUyhsL9OQv51k3cFpDPC5urZp JW2yQKxLj3IxgCvUpVFf2anqu558qTSUuXc563t1ubUNDDPNcYyzLGVVPqc/ 0qOaC4ltDbk28uSPLlyzHB9cngfgK357eG4dYrSC6EFvhvOCny3yOpOM/lSX NtYSRJA+o7oQMSKgK7sdMnggfrTioTesrtf10CTnFaRsYE0UdvctNAEkfiNt jsEVR3XAGfzqvb2k07u08ghDNiJZVIJX1B7/AJ1a1gQvMHg2JFHhUMcRVBj3 A5+prrJdQt49MhjjvTHM8YZmOQmfbI+b6Vz43E1KatBHZgqFJu9Qx9K0yKKw aeJ2lZsc+SBx36nr9K6BWsU0z7JaXVrNIFGwT53A+uCcisS1vZQpcSopC4a4 G1i47bc/cqvNcxRD7PITJezjKrGwYn9M18/UpzrS95n0VOoqatFaF9tWns4H tbq+nedF3nbhkz/dVOhB9fYVl29rJeXj6zfWslraP8wjW3yufU8jJp9ha3CS YP7yYcyFcnYPTqK6rTtOt0+y3d5CsiMwJS7mPH+0qnt9R+NaTqewj5gm6rsV dDS1vL+GedXREgIVCxycY5KgcV0WkNcWKyGcpfRkkr5Q3NEnZefT1xVW/a2v L27ksJ1WcREQzQ3BR+TyMAYI4HWo9Ka3hjF1qJleQnbI8+0Kzf3Qx4x9K86p NzV2/kdEY8uhatZF1EtJE3nRRtlgspWVfTeVQDH1IrV01Ld8pPPJdXEpx54O HQ9guCeKqx3S3EDJ9pZQcgW9tlwo+uDmnRfY7KzRYZLySaTP7lJxvI7krjgD 6VzTTnpsO+txutK0ckem3bXFwwHmZ2jEoHTpz3rQuPtS2g1KOfbE6D5SC20H sqkY/Wuc0SHUrBblrSeDUS3+su1DkRAfwg8gH6LUcmv3VnGkcbYVmzJAku9w P74JHH0wK2+ruy5WtCHUS0Znala3mh3uJlkit7iQukjEEMPXjpWZfXyTfNKT gZCsOV/+tWr4s1CzbRI3x5ECSEwzMWbcO4z/ABk8fT8a5mS/geMpHEyJ1UuF y+fbtX1eArSqUve3R8jmmFVOrdbMjvpdqEKc56EVhahKkcP3Ru74HU1dvB5Y LI7AnnnpVOws5L++QkMsSHc+cjP0r0oRUnY46NPU6Dw5EItKhIZiZB5hz2J7 D2roNPzuFUIhyK2dKgLMOK9SKsrHqJWVjt/B2fNT617l4Oz5SV494Ps23ocV 7T4TiKxrxTGdpa/6sVNUVsMJUtABRRRQAUyaJJomikUMrDBBFPooA8q8aeHj ZXTyvEZoHPyk8j8feuQmtLqOb7TY3xhlQ52Ftq49Cor3vUbO3vrZre5jEkbd Qa818U+Eruyle4tJHe3PcKMqPQ/415+JwkZJ3V0ck6c6cuamzg9V1KTy3kZY 12DL5YuD64LcisrT/FFpd2zb5T5iAB1QkHb26gr+tbOoWMMYkaaJWlHPzZJ/ LpXP39nAQhESsSu/y8BlOe5UcCvDqZZhYK3w3No5liuivY0LjVdBS5Ivre4s QyZEkkZbPoflzxVS71TSzYhYHsSit/rZJFXH0xjJ9smsW4ijZ/NkU25wRhnK qfYFcZ+maow2NtathELyMdymUAY+meTXA+HIPVTZ0x4gktHA2LtNJeCKURML +Ri323Oc/wDARwfzrNlguVWSOO6gmkIzvbKn2wACar2lrcLcSSRRSRbz87yE AD/dXn+dTXC3W7bK07L3aGQpke4B5rehl+Ow7tCqreZlWzDBVlepTdzPjhm0 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 9FAHA6t4USQMUXBPXFc3caBd2LEpbWs6gEBZYQce+Vw364r2BkVuoqtNYxSD BUVEoRl8SGm0eF6gDEG+06DHI3HzxSlMevUH+dZd5caPtdWXUoQOgePdn8ia 90vPD1tNnMYOawr/AMGWkmf3Q/KsHgqL+yJ67njI/sa4uI449VghZ+Ns8Mih fqxAUfnim3Om6bFKf+JxYT7umL9P5Z/rXo2o+AoGyViH5VzWo/D4nOyL9Kze Ah0bM/ZROYuNOkt4iitCzDp++X+hrHuobjICRwq/+3cY/pXQXvw9nycRH8qy bj4e3nOIm/Kj6lbaTIeGpvdGE+n6hO5DyKGP9xgR+ZNVptLihPlXN1a+Yp4W W5UED6ZxWzJ8P74H/VN+VRN4Cvs/6pvyqo4RLeRH1SBh3trDbyxvLqdqFcHC xyLLj6iMHH41XaXTI2ZlmeQr6Rn5vpnpXRf8IHff88m/Knp4Bvz/AMsm/Kr+ qwvuNYSC3OWa/tkYiC2dwRwXODn6DNRm8nYfJBCjA8OFywHpzx+ldtD8Pr7P MTflWnafD2643RH8q1VGC6GsaMI7I8zkF7cDEsksi+hJx+VLHps79I2/KvZr D4eyZG6L9K6PTfh/GMboR+VWlY0PBrTQbmQj9235V0Wl+D5pSMxN+Ve+af4G tUAzEPyrfsvCtrFjEY/KmB4vongJm2lo/wBK7vRPA8cO0mMflXotrpMEIGEH 5VfjhROgoA53TPD8MCj5BW5b2ccYwFFWgAOlFACKoA4FLRRQAUUUUAFFFFAB RRRQAUUUUAFFFFABRRRQAUUUUAFFFFABSFQeopaKAI2hjbqoqJrOBuqCrNFA FJtNtj/yzX8qibR7Q/8ALJfyrSooAyH0O0P/ACyX8qhbQLUn/VL+VbtFAGD/ AMI/a/8APJfyqRNBtB/yyX8q2qKAMtNGtB/yyX8qlXSrUf8ALNfyq/RQBVWw t16Iv5VIttEvRRU1FADQijoKdRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH/9kK ZW5kc3RyZWFtCmVuZG9iagoKNTk1IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0 Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW01OTUKL1dpZHRoIDEKL0hlaWdo dCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVk IC9EZXZpY2VSR0IgMCA8ZmNmN2Y3Pl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0Zs YXRlRGVjb2RlCj4+CnN0cmVhbQp42mMAAAABAAEKZW5kc3RyZWFtCmVuZG9i agoKNTk2IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFn ZQovTmFtZSAvSW01OTYKL1dpZHRoIDcKL0hlaWdodCAxCi9CaXRzUGVyQ29t cG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8 ZmNmN2Y3ZjBmMWYyPl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNpjCAEAAFYAVQplbmRzdHJlYW0KZW5kb2JqCgo1OTcg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTU5NwovV2lkdGggNAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg MgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxIDxmY2Y3Zjdm MGYxZjI+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3Ry ZWFtCnjaEwEAABUAFQplbmRzdHJlYW0KZW5kb2JqCgo1OTggMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTU5OAov V2lkdGggNwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JT cGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxIDxmY2Y3ZjdmZmVkZWU+XQov TGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMQ AQAAFgAVCmVuZHN0cmVhbQplbmRvYmoKCjU5OSAwIG9iago8PAovVHlwZSAv WE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltNTk5Ci9XaWR0aCAz Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsv SW5kZXhlZCAvRGV2aWNlUkdCIDEgPGZjZjdmN2YwZjFmMj5dCi9MZW5ndGgg OQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTAAAAEQARCmVu ZHN0cmVhbQplbmRvYmoKCjYwMCAwIG9iago8PAovVHlwZSAvWE9iamVjdAov U3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltNjAwCi9XaWR0aCAzCi9IZWlnaHQg MQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAv RGV2aWNlUkdCIDEgPGZjZjdmN2YwZjFmMj5dCi9MZW5ndGggOQovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTAQAAFQAVCmVuZHN0cmVhbQpl bmRvYmoKCjYwMSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAv SW1hZ2UKL05hbWUgL0ltNjAxCi9XaWR0aCA4Ci9IZWlnaHQgMQovQml0c1Bl ckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdC IDEgPGZjZjdmN2ZmZWRlZT5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVE ZWNvZGUKPj4Kc3RyZWFtCnjaYwwBAABYAFYKZW5kc3RyZWFtCmVuZG9iagoK NjAyIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQov TmFtZSAvSW02MDIKL1dpZHRoIDUKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9u ZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8ZmNm N2Y3ZTRmM2UyZTVlNmUzZjBmMWYyPl0KL0xlbmd0aCAxMAovRmlsdGVyIC9G bGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjOwAAAM4AxwplbmRzdHJlYW0KZW5k b2JqCgo2MDMgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0lt YWdlCi9OYW1lIC9JbTYwMwovV2lkdGggOQovSGVpZ2h0IDEKL0JpdHNQZXJD b21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAy IDxmY2Y3ZjdmZmVkZWVmZmU2ZTQ+XQovTGVuZ3RoIDExCi9GaWx0ZXIgL0Zs YXRlRGVjb2RlCj4+CnN0cmVhbQp42mPMcgAAARoArAplbmRzdHJlYW0KZW5k b2JqCgo2MDQgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0lt YWdlCi9OYW1lIC9JbTYwNAovV2lkdGggNgovSGVpZ2h0IDEKL0JpdHNQZXJD b21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAz IDxmY2Y3ZjdmMGYxZjJlNWU2ZTNlMmRkZDQ+XQovTGVuZ3RoIDEwCi9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42pN+AAABGAD8CmVuZHN0cmVh bQplbmRvYmoKCjYwNSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlw ZSAvSW1hZ2UKL05hbWUgL0ltNjA1Ci9XaWR0aCA5Ci9IZWlnaHQgMQovQml0 c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNl UkdCIDQgPGZjZjdmN2ZmZWRlZWZmZTZlNGZmZDhkMWZmYmNjYj5dCi9MZW5n dGggMTMKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1QycWIA AAGyAJoKZW5kc3RyZWFtCmVuZG9iagoKNjA2IDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW02MDYKL1dpZHRoIDkK L0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9J bmRleGVkIC9EZXZpY2VSR0IgNSA8ZmNmN2Y3ZjBmMWYyZTVlNmUzZTJkZGQ0 Y2NjY2NjYmJiZGJmPl0KL0xlbmd0aCAxMwovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNpjVDIJYQAAAdYArAplbmRzdHJlYW0KZW5kb2JqCgo2 MDcgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9O YW1lIC9JbTYwNwovV2lkdGggMTEKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9u ZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNSA8ZmNm N2Y3ZmZlZGVlZmZlNmU0ZmZkOGQxZmZiOWI4ZmZhOGIwPl0KL0xlbmd0aCAx NAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVDYJNWQAAALs AN8KZW5kc3RyZWFtCmVuZG9iagoKNjA4IDAgb2JqCjw8Ci9UeXBlIC9YT2Jq ZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW02MDgKL1dpZHRoIDQKL0hl aWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRl eGVkIC9EZXZpY2VSR0IgMSA8ZTVlNmUzYmJiZGJmPl0KL0xlbmd0aCA5Ci9G aWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hMBAAAVABUKZW5kc3Ry ZWFtCmVuZG9iagoKNjA5IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0 eXBlIC9JbWFnZQovTmFtZSAvSW02MDkKL1dpZHRoIDEwCi9IZWlnaHQgMQov Qml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2 aWNlUkdCIDYgPGZjZjdmN2YwZjFmMmU1ZTZlM2UyZGRkNGNjY2NjY2JiYmRi ZmE5YWRiMD5dCi9MZW5ndGggMTMKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4K c3RyZWFtCnjaY1Q2CUsEAAI/ARAKZW5kc3RyZWFtCmVuZG9iagoKNjEwIDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW02MTAKL1dpZHRoIDEyCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAy Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEgPGZjZjdmN2Zm ZWRlZT5dCi9MZW5ndGggMTEKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3Ry ZWFtCnjaY2BwAAAAQwBBCmVuZHN0cmVhbQplbmRvYmoKCjYxMSAwIG9iago8 PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltNjEx Ci9XaWR0aCAxMQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29s b3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA2IDxmZmVkZWVmZmU2ZTRm ZmQ4ZDFmZmI5YjhmZmE4YjBmZmJjY2JmY2Y3Zjc+XQovTGVuZ3RoIDE0Ci9G aWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUMnEJTAAAA1QBTQpl bmRzdHJlYW0KZW5kb2JqCgo2MTIgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QK L1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTYxMgovV2lkdGggNgovSGVpZ2h0 IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQg L0RldmljZVJHQiAxIDxmY2Y3ZjdmMGYxZjI+XQovTGVuZ3RoIDEwCi9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNlAAAADAAGCmVuZHN0cmVh bQplbmRvYmoKCjYxMyAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlw ZSAvSW1hZ2UKL05hbWUgL0ltNjEzCi9XaWR0aCA0Ci9IZWlnaHQgMQovQml0 c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNl UkdCIDMgPGUyZGRkNDk5OTk5OTczNzU3N2JiYmRiZj5dCi9MZW5ndGggOQov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTBgAAHAAcCmVuZHN0 cmVhbQplbmRvYmoKCjYxNCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3Vi dHlwZSAvSW1hZ2UKL05hbWUgL0ltNjE0Ci9XaWR0aCAxMQovSGVpZ2h0IDEK L0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rl dmljZVJHQiA3IDxmMGYxZjJlNWU2ZTNlMmRkZDRjY2NjY2NiYmJkYmY5OTk5 OTlhOWFkYjBmY2Y3Zjc+XQovTGVuZ3RoIDE0Ci9GaWx0ZXIgL0ZsYXRlRGVj b2RlCj4+CnN0cmVhbQp42mNgVDYJKwAAAk8BHwplbmRzdHJlYW0KZW5kb2Jq Cgo2MTUgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdl Ci9OYW1lIC9JbTYxNQovV2lkdGggMTMKL0hlaWdodCAxCi9CaXRzUGVyQ29t cG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8 ZmNmN2Y3ZmZlZGVlZmZlNmU0Pl0KL0xlbmd0aCAxMgovRmlsdGVyIC9GbGF0 ZURlY29kZQo+PgpzdHJlYW0KeNpjDF3KAAACUQD8CmVuZHN0cmVhbQplbmRv YmoKCjYxNiAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1h Z2UKL05hbWUgL0ltNjE2Ci9XaWR0aCAxOAovSGVpZ2h0IDEKL0JpdHNQZXJD b21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA3 IDxmY2Y3ZjdmZmVkZWVmZmU2ZTRmZmQ4ZDFmZmJjY2JmZmI5YjhmZmE4YjBm Zjk5OTk+XQovTGVuZ3RoIDE3Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0 cmVhbQp42mNgEBQyCSsvVQAABbcBugplbmRzdHJlYW0KZW5kb2JqCgo2MTcg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTYxNwovV2lkdGggNAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg MgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxIDxmY2Y3Zjdm MGYxZjI+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3Ry ZWFtCnjaYwEAAAUABQplbmRzdHJlYW0KZW5kb2JqCgo2MTggMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTYxOAov V2lkdGggOQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JT cGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDxmMGYxZjJlNWU2ZTNmY2Y3 Zjc+XQovTGVuZ3RoIDExCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVh bQp42mMMaAAAASYA0gplbmRzdHJlYW0KZW5kb2JqCgo2MTkgMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTYxOQov V2lkdGggNAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JT cGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAzIDxjY2NjY2M3Mzc1Nzc5OTk5 OTlmY2Y3Zjc+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4K c3RyZWFtCnjakwYAABwAHAplbmRzdHJlYW0KZW5kb2JqCgo2MjAgMCBvYmoK PDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTYy MAovV2lkdGggMTQKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0Nv bG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgOCA8ZmNmN2Y3YTlhZGIw NWM1ZDVkODQ4ODhhY2NjY2NjZTVlNmUzZTJkZGQ0YmJiZGJmNzM3NTc3Pl0K L0xlbmd0aCAxNQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpj VDIJc7cwBQAEsAFiCmVuZHN0cmVhbQplbmRvYmoKCjYyMSAwIG9iago8PAov VHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltNjIxCi9X aWR0aCAzNQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JT cGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxMSA8ZmNmN2Y3ZmZlZGVlZmZk OGQxZmZlNmU0ZmY3Nzc4ZWM1MzUxZmY2NjY2ZmY5OTk5ZmZiY2NiZmZiOWI4 ZmZhOGIwZmQ4NzhhPl0KL0xlbmd0aCAyNgovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNpjFBQUUlI2YGBgck1X6ly1xVMAABcwA7sKZW5kc3Ry ZWFtCmVuZG9iagoKNjIyIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0 eXBlIC9JbWFnZQovTmFtZSAvSW02MjIKL1dpZHRoIDEKL0hlaWdodCAxCi9C aXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZp Y2VSR0IgMCA8ZjBmMWYyPl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVj b2RlCj4+CnN0cmVhbQp42mMAAAABAAEKZW5kc3RyZWFtCmVuZG9iagoKNjIz IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFt ZSAvSW02MjMKL1dpZHRoIDUKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50 IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8ZmNmN2Y3 ZjBmMWYyPl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+Pgpz dHJlYW0KeNoTdQAAAGwAVgplbmRzdHJlYW0KZW5kb2JqCgo2MjQgMCBvYmoK PDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTYy NAovV2lkdGggMTQKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0Nv bG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNSA8ZjBmMWYyZTVlNmUz Y2NjY2NjZTJkZGQ0ODQ4ODhhNzM3NTc3Pl0KL0xlbmd0aCAxNQovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjFDIUZDAJAgACbQDcCmVuZHN0 cmVhbQplbmRvYmoKCjYyNSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3Vi dHlwZSAvSW1hZ2UKL05hbWUgL0ltNjI1Ci9XaWR0aCAxMwovSGVpZ2h0IDEK L0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rl dmljZVJHQiA4IDxiYmJkYmY1YzVkNWQ0MjQyM2ZlNWU2ZTNlMmRkZDRjY2Nj Y2M5OTk5OTk3Mzc1NzdhOWFkYjA+XQovTGVuZ3RoIDE1Ci9GaWx0ZXIgL0Zs YXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUZHYJK2wAAARXAbEKZW5kc3RyZWFt CmVuZG9iagoKNjI2IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBl IC9JbWFnZQovTmFtZSAvSW02MjYKL1dpZHRoIDM2Ci9IZWlnaHQgMQovQml0 c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNl UkdCIDExIDxmY2Y3ZjdmZmVkZWVmZmU2ZTRmZmQ4ZDFmZmI5YjhmZmJjY2Jm Zjc3NzhjMTQwNDBmZjY2NjZmZmE4YjBmZjk5OTlmZDg3OGE+XQovTGVuZ3Ro IDI2Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMUUjJxNTZi YGBK7zQOmbms2wAAHrIEhwplbmRzdHJlYW0KZW5kb2JqCgo2MjcgMCBvYmoK PDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTYy NwovV2lkdGggMQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29s b3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAwIDxlNGU0ZjI+XQovTGVu Z3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYwAAAAEA AQplbmRzdHJlYW0KZW5kb2JqCgo2MjggMCBvYmoKPDwKL1R5cGUgL1hPYmpl Y3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTYyOAovV2lkdGggNgovSGVp Z2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4 ZWQgL0RldmljZVJHQiAyIDxmY2Y3ZjdmMGYxZjJlNGU0ZjI+XQovTGVuZ3Ro IDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42pOaAAAAxgCr CmVuZHN0cmVhbQplbmRvYmoKCjYyOSAwIG9iago8PAovVHlwZSAvWE9iamVj dAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltNjI5Ci9XaWR0aCAxNQovSGVp Z2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4 ZWQgL0RldmljZVJHQiA3IDxmY2Y3ZjdmMGYxZjJlNWU2ZTNlMmRkZDRjY2Nj Y2M5OTk5OTk1YzVkNWQ3Mzc1Nzc+XQovTGVuZ3RoIDE2Ci9GaWx0ZXIgL0Zs YXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUdjE2Uk1XAAAFwQF6CmVuZHN0cmVh bQplbmRvYmoKCjYzMCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlw ZSAvSW1hZ2UKL05hbWUgL0ltNjMwCi9XaWR0aCAxNAovSGVpZ2h0IDEKL0Jp dHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rldmlj ZVJHQiA5IDxmY2Y3ZjdiYmJkYmY1YzVkNWQyZTJjMmE3Mzc1NzdjY2NjY2Nl NWU2ZTNlMmRkZDQ4NDg4OGE3ODZkNWU+XQovTGVuZ3RoIDE1Ci9GaWx0ZXIg L0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUdk0vlZgJAAX9AfcKZW5kc3Ry ZWFtCmVuZG9iagoKNjMxIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0 eXBlIC9JbWFnZQovTmFtZSAvSW02MzEKL1dpZHRoIDM2Ci9IZWlnaHQgMQov Qml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2 aWNlUkdCIDEwIDxmY2Y3ZjdmZmVkZWVmZmU2ZTRmZmI5YjhmZmE4YjBmZmJj Y2JmZmQ4ZDFlYzUzNTFmZjc3NzhmZjk5OTlmZjY2NjY+XQovTGVuZ3RoIDI2 Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUUjIxNk1TFBQu b00NNpm5ygkAJB4E+gplbmRzdHJlYW0KZW5kb2JqCgo2MzIgMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTYzMgov V2lkdGggNgovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JT cGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAzIDxkM2QzZTlhOGE5ZTFiOWJk ZTlmY2Y3Zjc+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+ CnN0cmVhbQp42pMyAAAAZgBLCmVuZHN0cmVhbQplbmRvYmoKCjYzMyAwIG9i ago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0lt NjMzCi9XaWR0aCA3Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9D b2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMgPGYwZjFmMmU0ZTRm MmQzZDNlOWZjZjdmNz5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjaE5sDAADKALMKZW5kc3RyZWFtCmVuZG9iagoKNjM0 IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFt ZSAvSW02MzQKL1dpZHRoIDM1Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVu dCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEyIDxmY2Y3 ZjdmMGYxZjJlNWU2ZTNiYmJkYmZjY2NjY2NlMmRkZDQ3Mzc1Nzc0MjQyM2Y4 NDg4OGE5OTk5OTkyZTJjMmFhOWFkYjA1YzVkNWQ+XQovTGVuZ3RoIDI2Ci9G aWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNgVDZxcTWrUBAUmlWt pOpicQAAIQMEawplbmRzdHJlYW0KZW5kb2JqCgo2MzUgMCBvYmoKPDwKL1R5 cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTYzNQovV2lk dGggMzgKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3Bh Y2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMTIgPGZjZjdmN2ZmZWRlZWZmZTZl NGZmZDhkMWZmOTk5OWZmYThiMGZmYjliOGZmNzc3OGMxNDA0MGVjNTM1MWZm YmNjYmZkODc4YWZmNjY2Nj5dCi9MZW5ndGggMjcKL0ZpbHRlciAvRmxhdGVE ZWNvZGUKPj4Kc3RyZWFtCnjaY1RSMgkNS0s2Nq6YYrVqWaj3aQMANV8GhQpl bmRzdHJlYW0KZW5kb2JqCgo2MzYgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QK L1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTYzNgovV2lkdGggNgovSGVpZ2h0 IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQg L0RldmljZVJHQiAxIDxmY2Y3ZjdmMGYxZjI+XQovTGVuZ3RoIDEwCi9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hNgAAAAIgARCmVuZHN0cmVh bQplbmRvYmoKCjYzNyAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlw ZSAvSW1hZ2UKL05hbWUgL0ltNjM3Ci9XaWR0aCA3Ci9IZWlnaHQgMQovQml0 c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNl UkdCIDQgPGZjZjdmN2QzZDNlOWYwZjFmMmI5YmRlOWE4YTllMT5dCi9MZW5n dGggMTIKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYxQyUQAA AMYAaAplbmRzdHJlYW0KZW5kb2JqCgo2MzggMCBvYmoKPDwKL1R5cGUgL1hP YmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTYzOAovV2lkdGggMTIK L0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9J bmRleGVkIC9EZXZpY2VSR0IgNCA8ZTRlNGYyYjliZGU5ZDNkM2U5ZmNmN2Y3 ZjBmMWYyPl0KL0xlbmd0aCAxNAovRmlsdGVyIC9GbGF0ZURlY29kZQo+Pgpz dHJlYW0KeNpjFDJ2UFQAAAJUAMgKZW5kc3RyZWFtCmVuZG9iagoKNjM5IDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW02MzkKL1dpZHRoIDM1Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0 Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEwIDxmY2Y3Zjdl NWU2ZTNiYmJkYmY4NDg4OGFjY2NjY2M0MjQyM2ZhOWFkYjA1YzVkNWQyZTJj MmFlMmRkZDQ3Mzc1Nzc+XQovTGVuZ3RoIDI2Ci9GaWx0ZXIgL0ZsYXRlRGVj b2RlCj4+CnN0cmVhbQp42mMQMlJSUQ5NFBRUb3eUnOmSxQAAHnsD1QplbmRz dHJlYW0KZW5kb2JqCgo2NDAgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1 YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTY0MAovV2lkdGggMzgKL0hlaWdodCAx Ci9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9E ZXZpY2VSR0IgMTIgPGZjZjdmN2ZmZWRlZWZmZTZlNGZmYThiMGZmOTk5OWZm YjliOGZmZDhkMWVjNTM1MWMxNDA0MGZmNjY2NmZmYmNjYmZkODc4YWZmNzc3 OD5dCi9MZW5ndGggMjcKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFt CnjaY1RSMnExNjYNTamYumrVUmPvkwEAM74GrwplbmRzdHJlYW0KZW5kb2Jq Cgo2NDEgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdl Ci9OYW1lIC9JbTY0MQovV2lkdGggNwovSGVpZ2h0IDEKL0JpdHNQZXJDb21w b25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxIDxm Y2Y3ZjdmMGYxZjI+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2Rl Cj4+CnN0cmVhbQp42hNlAAAALAAWCmVuZHN0cmVhbQplbmRvYmoKCjY0MiAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltNjQyCi9XaWR0aCAxOAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg NAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA2IDxmMGYxZjJi OWJkZTlhOGE5ZTFlNGU0ZjI4NTg3ZDZmY2Y3ZjdkM2QzZTk+XQovTGVuZ3Ro IDE3Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUMHFxZGUT SgAABgUBWAplbmRzdHJlYW0KZW5kb2JqCgo2NDMgMCBvYmoKPDwKL1R5cGUg L1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTY0MwovV2lkdGgg MzUKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2Ug Wy9JbmRleGVkIC9EZXZpY2VSR0IgMTIgPGZjZjdmN2U1ZTZlMzk5OTk5OTVj NWQ1ZDg0ODg4YWE5YWRiMGJiYmRiZjczNzU3NzJlMmMyYWNjY2NjY2UyZGRk NDQyNDIzZmQzZDNlOT5dCi9MZW5ndGggMjYKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjaYxAyCUsLb89ctUq7SVBwzcwkAQA18gYkCmVuZHN0 cmVhbQplbmRvYmoKCjY0NCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3Vi dHlwZSAvSW1hZ2UKL05hbWUgL0ltNjQ0Ci9XaWR0aCAzNwovSGVpZ2h0IDEK L0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rl dmljZVJHQiAxMCA8ZmZlZGVlZmZlNmU0ZmZkOGQxZmY5OTk5ZmZhOGIwZmZi OWI4ZmY2NjY2YzE0MDQwZmQ4NzhhZmZiY2NiZmY3Nzc4Pl0KL0xlbmd0aCAy NgovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVFI2BgKT0PSK yJkzpzh3pTAAAC+jBcsKZW5kc3RyZWFtCmVuZG9iagoKNjQ1IDAgb2JqCjw8 Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW02NDUK L1dpZHRoIDkKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8ZmNmN2Y3ZjBmMWYyZTRl NGYyPl0KL0xlbmd0aCAxMQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl YW0KeNqTTGUAAAEYAH8KZW5kc3RyZWFtCmVuZG9iagoKNjQ2IDAgb2JqCjw8 Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW02NDYK L1dpZHRoIDIwCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xv clNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDggPGYwZjFmMmQzZDNlOTk5 OTljY2U0ZTRmMjg1ODdkNjYxNjJiY2I5YmRlOWZjZjdmN2E4YTllMT5dCi9M ZW5ndGggMTgKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1QS dk1UEWfOaAYACHMCBgplbmRzdHJlYW0KZW5kb2JqCgo2NDcgMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTY0Nwov V2lkdGggMzUKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMTQgPGZjZjdmN2U1ZTZlMzk5 OTk5OTQyNDIzZjVjNWQ1ZGE5YWRiMDg0ODg4YTczNzU3N2JiYmRiZmNjY2Nj Y2UyZGRkNDJlMmMyYWU0ZTRmMmQzZDNlOWM0ZDJkOD5dCi9MZW5ndGggMjcK L0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYxAyUVUNK+qcucLb 88yZtS9bJwAAOFQH+gplbmRzdHJlYW0KZW5kb2JqCgo2NDggMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTY0OAov V2lkdGggMzcKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMTEgPGZmZWRlZWZmZTZlNGZm ZDhkMWZmYmNjYmZkODc4YWZmOTk5OWZmYThiMGMxNDA0MGVjNTM1MWZmYjli OGZmNzc3OGZmNjY2Nj5dCi9MZW5ndGggMjcKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjaY1QycXFxcQ1NKW+dbDxzWqrXFgEAN3kGhgplbmRz dHJlYW0KZW5kb2JqCgo2NDkgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1 YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTY0OQovV2lkdGggMTUKL0hlaWdodCAx Ci9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9E ZXZpY2VSR0IgNiA8ZjBmMWYyZTRlNGYyZDNkM2U5YjliZGU5ODU4N2Q2N2I3 OWM1OTk5OWNjPl0KL0xlbmd0aCAxNgovRmlsdGVyIC9GbGF0ZURlY29kZQo+ PgpzdHJlYW0KeNpjEBQSFDQJUwAAAuwA8AplbmRzdHJlYW0KZW5kb2JqCgo2 NTAgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9O YW1lIC9JbTY1MAovV2lkdGggNAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25l bnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDxlNGU0 ZjI2MTYyYmM3Yjc5YzU+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjakwAAABkAGQplbmRzdHJlYW0KZW5kb2JqCgo2NTEg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTY1MQovV2lkdGggMTAKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50 IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNSA8YjliZGU5 N2I3OWM1YThhOWUxZjBmMWYyZTVlNmUzYmJiYmRiPl0KL0xlbmd0aCAxMwov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVDZxDQYAAg8A8Qpl bmRzdHJlYW0KZW5kb2JqCgo2NTIgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QK L1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTY1MgovV2lkdGggMzMKL0hlaWdo dCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVk IC9EZXZpY2VSR0IgMTEgPGU1ZTZlMzg0ODg4YTVjNWQ1ZDk5OTk5OWE5YWRi MGJiYmRiZmNjY2NjYzQyNDIzZjJlMmMyYWU0ZTRmMmQzZDNlOWM0ZDJkOD5d Ci9MZW5ndGggMjUKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja Y1QSNjZxCU1LrBCYOXPVtpAAACeOBbwKZW5kc3RyZWFtCmVuZG9iagoKNjUz IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFt ZSAvSW02NTMKL1dpZHRoIDM3Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVu dCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEwIDxmZmVk ZWVmZmU2ZTRmZmQ4ZDFmZmE4YjBmZDg3OGFmZjk5OTllYzUzNTFjMTQwNDBm ZjY2NjZmZmI5YjhmZjc3Nzg+XQovTGVuZ3RoIDI0Ci9GaWx0ZXIgL0ZsYXRl RGVjb2RlCj4+CnN0cmVhbQp42mNUMnEBglCz8s6ZQGDs1aUAADeTBn4KZW5k c3RyZWFtCmVuZG9iagoKNjU0IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9T dWJ0eXBlIC9JbWFnZQovTmFtZSAvSW02NTQKL1dpZHRoIDE1Ci9IZWlnaHQg MQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAv RGV2aWNlUkdCIDcgPGYwZjFmMmU0ZTRmMmE4YTllMWI5YmRlOTg1ODdkNjYx NjJiY2QzZDNlOWZjZjdmNz5dCi9MZW5ndGggMTYKL0ZpbHRlciAvRmxhdGVE ZWNvZGUKPj4Kc3RyZWFtCnjaYxRUFjQJdSsAAAR5AYYKZW5kc3RyZWFtCmVu ZG9iagoKNjU1IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9J bWFnZQovTmFtZSAvSW02NTUKL1dpZHRoIDE0Ci9IZWlnaHQgMQovQml0c1Bl ckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdC IDggPGU0ZTRmMjdiNzljNTYxNjJiY2JiYmJkYmQzZDNlOTk5OTljY2E4YTll MWYwZjFmMmU1ZTZlMz5dCi9MZW5ndGggMTUKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjaY1R2FSvvaAcABY0CBgplbmRzdHJlYW0KZW5kb2Jq Cgo2NTYgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdl Ci9OYW1lIC9JbTY1NgovV2lkdGggMzMKL0hlaWdodCAxCi9CaXRzUGVyQ29t cG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMTAg PGNjY2NjYzczNzU3Nzg0ODg4YTk5OTk5OWE5YWRiMGJiYmRiZjVjNWQ1ZDJl MmMyYTQyNDIzZmU0ZTRmMmQzZDNlOT5dCi9MZW5ndGggMjUKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYxRSUlJ2cQ0Iq/CcOXPVgtAAACUE BYwKZW5kc3RyZWFtCmVuZG9iagoKNjU3IDAgb2JqCjw8Ci9UeXBlIC9YT2Jq ZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW02NTcKL1dpZHRoIDQ2Ci9I ZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5k ZXhlZCAvRGV2aWNlUkdCIDEzIDxmY2Y3ZjdmMGYxZjJmZmU2ZTRmZmQ4ZDFm Zjk5OTljZjY3NmZmZjc3NzhmZDg3OGFlYzUzNTFjMTQwNDBmZmI5YjhmZmE4 YjBmZjY2NjZmZmJjY2I+XQovTGVuZ3RoIDMwCi9GaWx0ZXIgL0ZsYXRlRGVj b2RlCj4+CnN0cmVhbQp42mNgFGRgMnZNT0tLK/GYWbUKCHa7nbkAAEtFCToK ZW5kc3RyZWFtCmVuZG9iagoKNjU4IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0 Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW02NTgKL1dpZHRoIDI5Ci9IZWln aHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhl ZCAvRGV2aWNlUkdCIDEwIDxmMGYxZjJlNGU0ZjJiOWJkZTk3Yjc5YzVhOGE5 ZTFkM2QzZTk4NTg3ZDY2MTYyYmM0YzRjYTVmY2Y3ZjdmZmVkZWU+XQovTGVu Z3RoIDIzCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMUMglV qyiRZDE2TmXgmgAAF20DMQplbmRzdHJlYW0KZW5kb2JqCgo2NTkgMCBvYmoK PDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTY1 OQovV2lkdGggMzMKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0Nv bG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgOCA8Y2NjY2NjNzM3NTc3 ODQ4ODhhOTk5OTk5YTlhZGIwYmJiZGJmNDI0MjNmZTRlNGYyZDNkM2U5Pl0K L0xlbmd0aCAyNQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpj FBRSUjZxDQ1KZC8vr2gIDQAAHi4EfQplbmRzdHJlYW0KZW5kb2JqCgo2NjAg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTY2MAovV2lkdGggNDYKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50 IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMTEgPGZjZjdm N2YwZjFmMmZmZTZlNGZmZDhkMWZkODc4YWNmNjc2ZmZmNjY2NmZmNzc3OGZm OTk5OWZmYThiMGZmYjliOGZmYmNjYj5dCi9MZW5ndGggMzEKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY2AUFGBSdg0JTSt3aU/rXL179+4Z LeULAEmfCNwKZW5kc3RyZWFtCmVuZG9iagoKNjYxIDAgb2JqCjw8Ci9UeXBl IC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW02NjEKL1dpZHRo IDI0Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNl IFsvSW5kZXhlZCAvRGV2aWNlUkdCIDkgPGU0ZTRmMmQzZDNlOWE4YTllMTg1 ODdkNmI5YmRlOTYxNjJiYzdiNzljNTk5OTljY2YwZjFmMmZjZjdmNz5dCi9M ZW5ndGggMjAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1Q2 cnFxUWQxTZfoBAANiQKFCmVuZHN0cmVhbQplbmRvYmoKCjY2MiAwIG9iago8 PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltNjYy Ci9XaWR0aCAzNAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29s b3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxMiA8ZmZlZGVlZTJkZGQ0 ODQ4ODhhNWM1ZDVkNzM3NTc3OTk5OTk5YTlhZGIwYmJiZGJmY2NjY2NjYzRk MmQ4ZDNkM2U5ZTRlNGYyZTVlNmUzPl0KL0xlbmd0aCAyNgovRmlsdGVyIC9G bGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVDY2dlEKTSuvmLV7966VM+cAAC+n B0MKZW5kc3RyZWFtCmVuZG9iagoKNjYzIDAgb2JqCjw8Ci9UeXBlIC9YT2Jq ZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW02NjMKL1dpZHRoIDMzCi9I ZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5k ZXhlZCAvRGV2aWNlUkdCIDExIDxmY2Y3ZjdmZmU2ZTRmZmQ4ZDFmZmE4YjBj ZjY3NmZmZjY2NjZmZjc3NzhmZDg3OGFmZjk5OTlmZmI5YjhmZmJjY2JmZmVk ZWU+XQovTGVuZ3RoIDI1Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVh bQp42mNUdgkNS6/oMJ61atVii/aqDQA1IwcoCmVuZHN0cmVhbQplbmRvYmoK CjY2NCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UK L05hbWUgL0ltNjY0Ci9XaWR0aCAyMwovSGVpZ2h0IDEKL0JpdHNQZXJDb21w b25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA5IDxl NGU0ZjJiOWJkZTk4NTg3ZDZhOGE5ZTFkM2QzZTk3Yjc5YzViYmJiZGJlNWU2 ZTNmZmU2ZTRmZmVkZWU+XQovTGVuZ3RoIDIwCi9GaWx0ZXIgL0ZsYXRlRGVj b2RlCj4+CnN0cmVhbQp42mNUUjY2FnFxDk3vnAAADe0DHQplbmRzdHJlYW0K ZW5kb2JqCgo2NjUgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTY2NQovV2lkdGggMgovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiAxIDxmZGUwYjVmZmU2ZTQ+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVE ZWNvZGUKPj4Kc3RyZWFtCnjaEwAAABEAEQplbmRzdHJlYW0KZW5kb2JqCgo2 NjYgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9O YW1lIC9JbTY2NgovV2lkdGggMzMKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9u ZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMTIgPGU1 ZTZlMzk5OTk5OTVjNWQ1ZDQyNDIzZjczNzU3Nzg0ODg4YWE5YWRiMGJiYmRi ZmNjY2NjY2M0ZDJkOGQzZDNlOWU0ZTRmMmYwZjFmMj5dCi9MZW5ndGggMjYK L0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1RWVnIJFUwr71x9 5vSuVasOAAAvPweKCmVuZHN0cmVhbQplbmRvYmoKCjY2NyAwIG9iago8PAov VHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltNjY3Ci9X aWR0aCAzMAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JT cGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxMSA8ZmZlZGVlZTJkZGQ0YjVh NDhlY2Y2NzZmZmY2NjY2ZmY3Nzc4ZmQ4NzhhZmY5OTk5ZmZhOGIwZmZiY2Ni ZmZlNmU0ZmZkOGQxPl0KL0xlbmd0aCAyMwovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNpjVHZxDUsv75y5amZHR/oGAClFBm4KZW5kc3RyZWFt CmVuZG9iagoKNjY4IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBl IC9JbWFnZQovTmFtZSAvSW02NjgKL1dpZHRoIDI1Ci9IZWlnaHQgMQovQml0 c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNl UkdCIDkgPGYwZjFmMmI5YmRlOTg1ODdkNjk5OTljY2E4YTllMWQzZDNlOWNj Y2NjY2U1ZTZlM2ZmZWRlZWZjZjdmNz5dCi9MZW5ndGggMjEKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1RSNnYRDA11K6/omAAAErADxgpl bmRzdHJlYW0KZW5kb2JqCgo2NjkgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QK L1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTY2OQovV2lkdGggNAovSGVpZ2h0 IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQg L0RldmljZVJHQiAyIDxmZmU2ZTRmZmNlOGNmZmVkZWU+XQovTGVuZ3RoIDkK L0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaEwMAABcAFwplbmRz dHJlYW0KZW5kb2JqCgo2NzAgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1 YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTY3MAovV2lkdGggMzMKL0hlaWdodCAx Ci9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9E ZXZpY2VSR0IgMTIgPGZmZTZlNGE5YWRiMDVjNWQ1ZDQyNDIzZjczNzU3Nzg0 ODg4YTk5OTk5OWJiYmRiZmM0ZDJkOGU0ZTRmMmYwZjFmMmQzZDNlOWZjZjdm Nz5dCi9MZW5ndGggMjYKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFt CnjaY1Q2NlIJDUsUr5i5atXM3bsPAAAsLgcFCmVuZHN0cmVhbQplbmRvYmoK CjY3MSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UK L05hbWUgL0ltNjcxCi9XaWR0aCAzMAovSGVpZ2h0IDEKL0JpdHNQZXJDb21w b25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxMSA8 ZjBmMWYyZTRmM2UyZTJkZGQ0ZmY5OTk5ZmY2NjY2ZmY3Nzc4ZmQ4NzhhZmZh OGIwZmZiY2NiZmZlNmU0ZmZiOWI4ZmZlZGVlPl0KL0xlbmd0aCAyMwovRmls dGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjEDJxCU0zruic2dFRnjUb ACL+BZ8KZW5kc3RyZWFtCmVuZG9iagoKNjcyIDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW02NzIKL1dpZHRoIDI1 Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsv SW5kZXhlZCAvRGV2aWNlUkdCIDcgPGQzZDNlOTk5OTljYzg1ODdkNmE4YTll MWI5YmRlOWUyZGRkNGZmZTZlNGZjZjdmNz5dCi9MZW5ndGggMjEKL0ZpbHRl ciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1RSUjR2cWANDUtLKwAAD6oD CgplbmRzdHJlYW0KZW5kb2JqCgo2NzMgMCBvYmoKPDwKL1R5cGUgL1hPYmpl Y3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTY3MwovV2lkdGggNQovSGVp Z2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4 ZWQgL0RldmljZVJHQiAzIDxmZmVkZWVmZmNlOGNmZWFhMzNmZmU2ZTQ+XQov TGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42pM6 AAAA9gDbCmVuZHN0cmVhbQplbmRvYmoKCjY3NCAwIG9iago8PAovVHlwZSAv WE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltNjc0Ci9XaWR0aCAz MgovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiAxNCA8ZmZlZGVlY2NjY2NjNzg2ZDVlMmUy YzJhNDI0MjNmNWM1ZDVkNzM3NTc3ODQ4ODhhOTk5OTk5YTlhZGIwYmJiZGJm YzRkMmQ4ZTRlNGYyZjBmMWYyZDNkM2U5Pl0KL0xlbmd0aCAyNQovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVDZ2CU0r75i5+szdu2fOPQQA NRoImwplbmRzdHJlYW0KZW5kb2JqCgo2NzUgMCBvYmoKPDwKL1R5cGUgL1hP YmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTY3NQovV2lkdGggMzIK L0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9J bmRleGVkIC9EZXZpY2VSR0IgMTQgPGZjZjdmN2YwZjFmMmU0ZjNlMmQyZTlk NGUyZGRkNGZmYThiMGZmNjY2NmZmNzc3OGZkODc4YWZmOTk5OWZmYjliOGZm YmNjYmZmZTZlNGZmZWRlZWZmZDhkMT5dCi9MZW5ndGggMjUKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1Q2CUsr75i6+uy93bsi91wAADfe CFkKZW5kc3RyZWFtCmVuZG9iagoKNjc2IDAgb2JqCjw8Ci9UeXBlIC9YT2Jq ZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW02NzYKL1dpZHRoIDMyCi9I ZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5k ZXhlZCAvRGV2aWNlUkdCIDE0IDxlNGU0ZjJhOGE5ZTE3Yjc5YzU4NTg3ZDZi OWJkZTlkM2QzZTllMmRkZDRmZmQ4ZDFmZGUwYjVmZmVkZWVmZmJhNWNmMTkz MDZmZWFhMzNmZmNlOGNmY2Y3Zjc+XQovTGVuZ3RoIDI0Ci9GaWx0ZXIgL0Zs YXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUUjIWFHEJTUvvKJ+5es89ACAdBeEK ZW5kc3RyZWFtCmVuZG9iagoKNjc3IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0 Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW02NzcKL1dpZHRoIDMzCi9IZWln aHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhl ZCAvRGV2aWNlUkdCIDEyIDxmZmVkZWVlMmRkZDQ4NDg4OGE0MjQyM2YyZTJj MmE1YzVkNWQ3Mzc1Nzc5OTk5OTlhOWFkYjBiYmJkYmZjNGQyZDhlNGU0ZjJj Y2NjY2M+XQovTGVuZ3RoIDI1Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0 cmVhbQp42mMQMnExDk1TKu9cvXvNmVVrBAAvtgbfCmVuZHN0cmVhbQplbmRv YmoKCjY3OCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1h Z2UKL05hbWUgL0ltNjc4Ci9XaWR0aCAzMgovSGVpZ2h0IDEKL0JpdHNQZXJD b21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAx NCA8ZmNmN2Y3ZjBmMWYyZTRmM2UyZDJlOWQ0YTRkNWFmZmZhOGIwZmY2NjY2 ZmY3Nzc4ZmQ4NzhhZmY5OTk5ZmZiOWI4ZmZiY2NiZmZlNmU0ZmZlZGVlZmZk OGQxPl0KL0xlbmd0aCAyNQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl YW0KeNpjVDJ2CUsr75i15+7t3Vvj7gIANEEIDwplbmRzdHJlYW0KZW5kb2Jq Cgo2NzkgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdl Ci9OYW1lIC9JbTY3OQovV2lkdGggMzcKL0hlaWdodCAxCi9CaXRzUGVyQ29t cG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMTUg PGZjZjdmN2I5YmRlOTdiNzljNTYxNjJiYzg1ODdkNjk5OTljY2E4YTllMWNj Y2NjY2UyZGRkNGZmZDhkMWZkZTBiNWZmZTZlNGZmYmE1Y2MyNzcwNmYxOTMw NmZmY2M5OT5dCi9MZW5ndGggMjgKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4K c3RyZWFtCnjaY2BgEDI2cglLFCzvXLVq9dlX/z4AADCLCCgKZW5kc3RyZWFt CmVuZG9iagoKNjgwIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBl IC9JbWFnZQovTmFtZSAvSW02ODAKL1dpZHRoIDM0Ci9IZWlnaHQgMQovQml0 c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNl UkdCIDE0IDxmZmVkZWVmZmU2ZTRhOWFkYjA1YzVkNWQyZTJjMmE0MjQyM2Y3 Mzc1Nzc4NDg4OGE5OTk5OTliYmJkYmZjNGQyZDhkM2QzZTllNGU0ZjJjY2Nj Y2NmY2Y3Zjc+XQovTGVuZ3RoIDI1Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+ CnN0cmVhbQp42mMUVHZxCTZOK2+atWdFeoXSPQAsxwaACmVuZHN0cmVhbQpl bmRvYmoKCjY4MSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAv SW1hZ2UKL05hbWUgL0ltNjgxCi9XaWR0aCAzMgovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiAxMiA8ZmNmN2Y3ZTRmM2UyZDJlOWQ0YTRkNWFmZmZhOGIwZmY2NjY2ZmY3 Nzc4ZmQ4NzhhZmY5OTk5ZmZiOWI4ZmZiY2NiZmZlNmU0ZmZlZGVlPl0KL0xl bmd0aCAyNQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjFFQy NgkNS+9cfWbXqiWrDwAAKq0HIQplbmRzdHJlYW0KZW5kb2JqCgo2ODIgMCBv YmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9J bTY4MgovV2lkdGggNjkKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDgK L0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMjkgPGZjZjdmN2Zm ZWRlZWU0ZTRmMjg1ODdkNjYxNjJiYzdiNzljNWE4YTllMWI5YmRlOWNjY2Nj Y2UyZGRkNGZkZTBiNWZmY2I4MmZmY2M5OWYxOTMwNjkyNTkwNmZmYmE1Y2My NzcwNmZjYzU3YWZmZTZlNDg0ODg4YTQyNDIzZjJlMmMyYTVjNWQ1ZDczNzU3 Nzk5OTk5OWE5YWRiMGJiYmRiZmM0ZDJkOGQzZDNlOWYwZjFmMj5dCi9MZW5n dGggNjcKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaFcGJAkAg DADQzeiYiLYOxf//Jt4DRJxo/ixExhhrnfO8hhCYtz0iHydASsmL5pxVS6lV pF19jHv09uvPC1lJA84KZW5kc3RyZWFtCmVuZG9iagoKNjgzIDAgb2JqCjw8 Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW02ODMK L1dpZHRoIDQKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8ZjBmMWYyZDJlOWQ0ZTRm M2UyZmNmN2Y3Pl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+ CnN0cmVhbQp42pMGAAAcABwKZW5kc3RyZWFtCmVuZG9iagoKNjg0IDAgb2Jq Cjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW02 ODQKL1dpZHRoIDMyCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9D b2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEzIDxmY2Y3ZjdlNGYz ZTJkMmU5ZDRhNGQ1YWY3Y2MwODRmZjk5OTlmZjY2NjZmZDg3OGFmZmE4YjBm ZmJjY2JmZmU2ZTRmZmI5YjhmZmQ4ZDFmZmVkZWU+XQovTGVuZ3RoIDI1Ci9G aWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMUVFJ2Dksrj5i1auXM 3acuAAAo+wcBCmVuZHN0cmVhbQplbmRvYmoKCjY4NSAwIG9iago8PAovVHlw ZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltNjg1Ci9XaWR0 aCA3Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNl IFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPGZjZjdmN2ZmZWRlZWZmZTZlND5d Ci9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja Y4wAAABcAFoKZW5kc3RyZWFtCmVuZG9iagoKNjg2IDAgb2JqCjw8Ci9UeXBl IC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW02ODYKL1dpZHRo IDY4Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA4Ci9Db2xvclNwYWNl IFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMyIDxmY2Y3ZjdmZmVkZWVmZmU2ZTRm ZmQ4ZDFhOGE5ZTE2MTYyYmM0YzRjYTU3Yjc5YzU4NTg3ZDY5OTk5Y2NiOWJk ZTliYmJiZGJiYmJkYmZlMmRkZDRmZmNlOGNmZmJhNWNmZmNiODJmZmNjOTlm ZWFhMzM5MjU5MDZmMTkzMDZmY2M1N2FjMjc3MDY3Mzc1Nzc0MjQyM2YyZTJj MmE1YzVkNWQ4NDg4OGE5OTk5OTlhOWFkYjBjNGQyZDhjY2NjY2NlNWU2ZTM+ XQovTGVuZ3RoIDY3Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4 2i3K2wJAIAwAUGojTFqhdXH5/6/Ug/N8ul4pDYgD4mjMBDAvtNrNOcvsw374 k9toKEpKIjnHUmq9iO7f835mIQQ2CmVuZHN0cmVhbQplbmRvYmoKCjY4NyAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltNjg3Ci9XaWR0aCA4Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0 Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDQgPGYwZjFmMmNj Y2NjYzdjYzA4NGM0ZDJkOGZjZjdmNz5dCi9MZW5ndGggMTIKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1RSMgEAAOYAegplbmRzdHJlYW0K ZW5kb2JqCgo2ODggMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTY4OAovV2lkdGggMzEKL0hlaWdodCAxCi9CaXRz UGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VS R0IgMTUgPGYwZjFmMmU0ZjNlMmQyZTlkNGE0ZDVhZjdjYzA4NDNmYTE0NGZk ODc4YWZmNjY2NmZmNzc3OGZmOTk5OWZmYThiMGZmYmNjYmZmZDhkMWZmZTZl NGZmZWRlZWZjZjdmNz5dCi9MZW5ndGggMjUKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjaYxRUMglJ78hcfebM6VV7330AADJTCGgKZW5kc3Ry ZWFtCmVuZG9iagoKNjg5IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0 eXBlIC9JbWFnZQovTmFtZSAvSW02ODkKL1dpZHRoIDgKL0hlaWdodCAxCi9C aXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZp Y2VSR0IgMyA8ZmNmN2Y3ZmZlZGVlZmZkOGQxZmZlNmU0Pl0KL0xlbmd0aCAx MAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjjQYAAGcAYQpl bmRzdHJlYW0KZW5kb2JqCgo2OTAgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QK L1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTY5MAovV2lkdGggNzIKL0hlaWdo dCAxCi9CaXRzUGVyQ29tcG9uZW50IDgKL0NvbG9yU3BhY2UgWy9JbmRleGVk IC9EZXZpY2VSR0IgMzEgPGZjZjdmN2ZmZTZlNGZmZDhkMWNjY2NjYzdiNzlj NTYxNjJiYzRjNGNhNTg1ODdkNjk5OTljY2E4YTllMWJiYmJkYmJiYmRiZmZm YmE1Y2ZlYWEzM2ZjYzU3YWZmY2I4MmMyNzcwNjkyNTkwNmYxOTMwNmZkZTBi NWUyZGRkNGI1YTQ4ZTVjNWQ1ZDJlMmMyYTQyNDIzZjczNzU3Nzg0ODg4YTk5 OTk5OWE5YWRiMGM0ZDJkOGQzZDNlOWU1ZTZlMz5dCi9MZW5ndGggNzAKL0Zp bHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaFcyHAYAgDACwskVqwVUQ FP//UskBAQAQUiptrDVGOzd5PweFCxJRxLSmtMVdDMfJOZfCfNXa2h3CM/Su 3v/4AGQiA70KZW5kc3RyZWFtCmVuZG9iagoKNjkxIDAgb2JqCjw8Ci9UeXBl IC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW02OTEKL1dpZHRo IDQwCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA4Ci9Db2xvclNwYWNl IFsvSW5kZXhlZCAvRGV2aWNlUkdCIDE2IDxmMGYxZjJhNGQ1YWY3Y2MwODQ2 NWIzNmMzZmExNDRkMmU5ZDRmY2Y3ZjdlNGYzZTIyYTdmMmFiNWE0OGVmZDg3 OGFmZjc3NzhmZjk5OTlmZmE4YjBmZmI5YjhmZmQ4ZDFmZmVkZWU+XQovTGVu Z3RoIDQ0Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42g3CCRYA EAgFwPyUtND9T8u8oQGAJ4sq0RIRmG2P8Kz6K93P7dYHEb8BOgplbmRzdHJl YW0KZW5kb2JqCgo2OTIgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5 cGUgL0ltYWdlCi9OYW1lIC9JbTY5MgovV2lkdGggODQKL0hlaWdodCAxCi9C aXRzUGVyQ29tcG9uZW50IDgKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZp Y2VSR0IgMjggPGZjZjdmN2ZmZWRlZWZmZTZlNGZmZDhkMWZmYjliOGE4YTll MTYxNjJiYzdiNzljNTg1ODdkNjk5OTljY2I5YmRlOWNjY2NjY2YxOTMwNmMy NzcwNmZlYWEzM2ZmYmE1Y2ZjYzU3YWZkZTBiNWI1YTQ4ZTVjNWQ1ZDJlMmMy YTQyNDIzZjczNzU3Nzg0ODg4YTk5OTk5OWE5YWRiMGJiYmRiZmYwZjFmMmU0 ZjNlMj5dCi9MZW5ndGggNjkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3Ry ZWFtCnjaHcGJAoAQDADQmdbBpCK5/v87G+8BgELUCKAXVKgFrcO2H0TGWMvu 9OLyzOycx+l+QoxvCCl9OZcqylBb7w1+bEsD/wplbmRzdHJlYW0KZW5kb2Jq Cgo2OTMgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdl Ci9OYW1lIC9JbTY5MwovV2lkdGggMTAKL0hlaWdodCAxCi9CaXRzUGVyQ29t cG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNiA8 ZmNmN2Y3ZDJlOWQ0YTRkNWFmM2ZhMTQ0MmE3ZjJhNjViMzZjZTRmM2UyPl0K L0xlbmd0aCAxMwovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpj VBQyCQMAAYIAvwplbmRzdHJlYW0KZW5kb2JqCgo2OTQgMCBvYmoKPDwKL1R5 cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTY5NAovV2lk dGggMjkKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3Bh Y2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMTUgPGYwZjFmMmU0ZjNlMmQyZTlk NGE0ZDVhZjY1YjM2YzJhN2YyYTNmYTE0NGZmOTk5OWZmNzc3OGZkODc4YWVj NTM1MWZmNjY2NmZmYmNjYmZmZTZlNGZmZWRlZWZjZjdmNz5dCi9MZW5ndGgg MjMKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYxRUMgmr6Czv Wr27/ez7DwAo4QdaCmVuZHN0cmVhbQplbmRvYmoKCjY5NSAwIG9iago8PAov VHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltNjk1Ci9X aWR0aCA4NwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgOAovQ29sb3JT cGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAzNiA8ZmZlZGVlZmZlNmU0ZmZi Y2NiZmZkOGQxZmZhOGIwZmY5OTk5ZmQ4NzhhZmZiOWI4ZmNmN2Y3ZmY3Nzc4 Y2NjY2NjN2I3OWM1NjE2MmJjODU4N2Q2YThhOWUxYjliZGU5ZDNkM2U5ZmZj Yzk5YzI3NzA2ZjE5MzA2ZmVhYTMzZmZiYTVjZmNjNTdhZmZjYjgyZmRlMGI1 ZmZjZThjYjVhNDhlNzg2ZDVlNDI0MjNmNWM1ZDVkNzM3NTc3ODQ4ODhhOTk5 OTk5YTlhZGIwZTRmM2UyZDJlOWQ0ZjBmMWYyPl0KL0xlbmd0aCA4MgovRmls dGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoNy8kCgBAUQNGnJ7NEc1Go ///GnM1dXQAA0iHSnnFBqJSMo9LGGG3tMDg3+hCmuVnWze/LfCBpByD684ox pft+ci4lP61F1bep9RM/r18FwAplbmRzdHJlYW0KZW5kb2JqCgo2OTYgMCBv YmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9J bTY5NgovV2lkdGggMzUKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQK L0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMTUgPGYwZjFmMmE0 ZDVhZjJhN2YyYTY1YjM2Y2QyZTlkNGZjZjdmN2U0ZjNlMjNmYTE0NGZmOTk5 OWZmNzc3OGZkODc4YWZmYThiMGZmYjliOGZmZDhkMWZmZTZlNGZmZWRlZT5d Ci9MZW5ndGggMjYKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja Y1QyCUhLcRE071zRsXv32fehAQA33AeOCmVuZHN0cmVhbQplbmRvYmoKCjY5 NyAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05h bWUgL0ltNjk3Ci9XaWR0aCA5MQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25l bnQgOAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAzNCA8ZmNm N2Y3ZmZlNmU0ZmZiY2NiZmY5OTk5ZWM1MzUxZmQ4NzhhZmZkOGQxZmZlZGVl ZmY2NjY2YTlhZGIwN2I3OWM1NjE2MmJjODU4N2Q2YThhOWUxYjliZGU5ZDNk M2U5ZmZjYzk5YzI3NzA2ZjE5MzA2ZmVhYTMzZmZiYTVjZmNjNTdhZmZjZThj ZmRlMGI1YjVhNDhlNzg2ZDVlNWM1ZDVkNzM3NTc3ODQ4ODhhOTk5OTk5YmJi ZGJmZTVlNmUzZDJlOWQ0ZTRmM2UyZjBmMWYyPl0KL0xlbmd0aCA4MAovRmls dGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNolwQsWQCAQAMBatasUqfxK yP0PyWOG8RcANEJKJEIp2gZAad1pY6zt+8GNo/c+hBDjNC8vTowR4uLWbUsp 5byXoj7Hef1qrTd7ALFxBWsKZW5kc3RyZWFtCmVuZG9iagoKNjk4IDAgb2Jq Cjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW02 OTgKL1dpZHRoIDM2Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA4Ci9D b2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDE2IDxmMGYxZjJjNGQy ZDg3Y2MwODQzZmExNDQyYTdmMmFlNGYzZTJmY2Y3ZjdkMmU5ZDRhNGQ1YWZi NWE0OGVmZDg3OGFmZjk5OTlmZmE4YjBmZmJjY2JmZmQ4ZDFmZmU2ZTRmZmVk ZWU+XQovTGVuZ3RoIDQxCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVh bQp42gXBhwEAIAgDMDYKqP3/WhNiUTPxIHLPTF6iu6q7Z+bcByA+DTcBCwpl bmRzdHJlYW0KZW5kb2JqCgo2OTkgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QK L1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTY5OQovV2lkdGggNTMKL0hlaWdo dCAxCi9CaXRzUGVyQ29tcG9uZW50IDgKL0NvbG9yU3BhY2UgWy9JbmRleGVk IC9EZXZpY2VSR0IgMjQgPGZjZjdmN2ZmZTZlNGZmZDhkMWZmYThiMGZmYjli OGZkODc4YWVjNTM1MWZmNjY2NmZmNzc3OGZmYmNjYmI1YTQ4ZTk5OTljYzg1 ODdkNjdiNzljNWE4YTllMWI5YmRlOWNjY2NjY2YxOTMwNmMyNzcwNmZlYWEz M2ZmYmE1Y2ZjYzU3YWZmY2M5OWZkZTBiNWZmZWRlZT5dCi9MZW5ndGggNTQK L0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaDcEHAgAQCABAKntG xv9fyp3SAIBEaKwjTcZ5DF9MuZScam2t8xjMPKeIrH0OXPUAK1ACRQplbmRz dHJlYW0KZW5kb2JqCgo3MDAgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1 YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTcwMAovV2lkdGggNzQKL0hlaWdodCAx Ci9CaXRzUGVyQ29tcG9uZW50IDgKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9E ZXZpY2VSR0IgMjQgPGZmZTZlNGZmZDhkMWZmY2M5OWI1YTQ4ZTk5OTk5OTg0 ODg4YWE5YWRiMGJiYmRiZmNjY2NjY2QyZTlkNGE0ZDVhZmM0ZDJkOGU0ZjNl MjdjYzA4NDNmYTE0NDJhN2YyYTY1YjM2Y2YwZjFmMmZkODc4YWZmNzc3OGZm OTk5OWZmYjliOGZmYmNjYmZmZWRlZWZjZjdmNz5dCi9MZW5ndGggNjQKL0Zp bHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaHchZEoAwCAXBYHCBqCBR yf1P6iv7b6YQ0VQr8wzMvKywiWpr8tuhHaeZuVyAxFV1j94j7uelkpljfFfB AysKZW5kc3RyZWFtCmVuZG9iagoKNzAxIDAgb2JqCjw8Ci9UeXBlIC9YT2Jq ZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW03MDEKL1dpZHRoIDUyCi9I ZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA4Ci9Db2xvclNwYWNlIFsvSW5k ZXhlZCAvRGV2aWNlUkdCIDIyIDxmY2Y3ZjdmZmU2ZTRmZmQ4ZDFmZmE4YjBm ZDg3OGFmZmI5YjhlYzUzNTFmZjc3NzhmZjY2NjZmZmJjY2JmZjk5OTliOWJk ZTlhOGE5ZTE5OTk5Y2M4NTg3ZDZiYmJkYmZmZWFhMzNjMjc3MDZmMTkzMDZm ZmJhNWNmZmNlOGNmZmNjOTlmZGUwYjU+XQovTGVuZ3RoIDUzCi9GaWx0ZXIg L0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42g3BAQLAEAwDQEuGlaLTzf+fyl24 AN6RZMrkk3IERKSwauu9qdZh7zGnmbt//0LYJlMCBQplbmRzdHJlYW0KZW5k b2JqCgo3MDIgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0lt YWdlCi9OYW1lIC9JbTcwMgovV2lkdGggNzMKL0hlaWdodCAxCi9CaXRzUGVy Q29tcG9uZW50IDgKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0Ig MjMgPGZmZWRlZWZmZTZlNGZmZDhkMWZkZTBiNWZmY2U4Y2UyZGRkNGNjY2Nj Y2JiYmRiZmU1ZTZlMzdjYzA4NGE0ZDVhZmM0ZDJkOGQyZTlkNDNmYTE0NDJh N2YyYWYwZjFmMmU0ZjNlMjY1YjM2Y2ZmOTk5OWZmNjY2NmZmNzc3OGZmYThi MGZmYjliOGZjZjdmNz5dCi9MZW5ndGggNjAKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjaHcEJAoAgCAAwpKRAQLPD//80cYOEuO2Z6AhE+aTA MpWgKmzubqx1aU21iFzW76e/H2ICgDF+WF4C3AplbmRzdHJlYW0KZW5kb2Jq Cgo3MDMgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdl Ci9OYW1lIC9JbTcwMwovV2lkdGggNTEKL0hlaWdodCAxCi9CaXRzUGVyQ29t cG9uZW50IDgKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMjEg PGZmZTZlNGZmZDhkMWZmOTk5OWZmNzc3OGZkODc4YWZmYThiMGZmNjY2NmZm YmNjYmZmYjliOGU0ZTRmMmQzZDNlOWI5YmRlOWNjY2NjY2ZmYmE1Y2MyNzcw NjkyNTkwNmYxOTMwNmZlYWEzM2ZjYzU3YWZmY2U4Y2ZmY2M5OWZjZjdmNz5d Ci9MZW5ndGggNDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja HcGHEQAgCAQweXsDsey/qp6JIYLF4zxCQKQnJo+cS/1aZxHmMVS1z7XpXB0P AbgKZW5kc3RyZWFtCmVuZG9iagoKNzA0IDAgb2JqCjw8Ci9UeXBlIC9YT2Jq ZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW03MDQKL1dpZHRoIDcxCi9I ZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5k ZXhlZCAvRGV2aWNlUkdCIDE1IDxmZmVkZWVmZmQ4ZDFmZGUwYjVmZmU2ZTRl NWU2ZTNmMGYxZjJlMmRkZDRjY2NjY2NhNGQ1YWY3Y2MwODQ2NWIzNmMzZmEx NDQyYTdmMmFlNGYzZTJkMmU5ZDRmY2Y3Zjc+XQovTGVuZ3RoIDQyCi9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMQUnYBAtew8ooZHUAwa8+Z nb2hoaGx7951zGoUFDZg+P8BAAY4EA4KZW5kc3RyZWFtCmVuZG9iagoKNzA1 IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFt ZSAvSW03MDUKL1dpZHRoIDI1MQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25l bnQgOAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyOCA8ZmVi ZjAwZDQwMDI5Y2Y2NzZmZWM1MzUxYzI3NzA2OTI1OTA2ZjE5MzA2ZmVhYTMz ZmZiYTVjZmNjNTdhZmZjYzk5ZmZkOGQxZmZlZGVlZmNmN2Y3ZmRlMGI1ZmZj ZThjZmZlNmU0ZmY3Nzc4YzE0MDQwY2YwYjY4N2NjMDg0M2ZhMTQ0YTRkNWFm NjViMzZjMmE3ZjJhZDJlOWQ0ZTRmM2UyODQ4ODhhZGUxMjY2Pl0KL0xlbmd0 aCA3NwovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqtyksSQDAM ANDqL7SlaKSC+5/TmMx0ZcdbP6V+0X2njbHOOWu9B4B+CDGNaco5zjGEZZVU hMYNkUTdH5X4aJiZCOt5NeXFDY2iB/4KZW5kc3RyZWFtCmVuZG9iagoKNzA2 IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFt ZSAvSW03MDYKL1dpZHRoIDI1MQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25l bnQgOAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyNyA8ZmVi ZjAwZmZjYzAwZDQwMDI5YzE0MDQwYzI3NzA2OTI1OTA2ZjE5MzA2ZmVhYTMz ZmZiYTVjZmNjNTdhZmZjYzk5ZmZkOGQxZmZlZGVlZmZlNmU0ZmRlMGI1ZmY5 OTk5ZWM1MzUxY2YwYjY4Y2Y2NzZmM2ZhMTQ0MmE3ZjJhN2NjMDg0YTRkNWFm NjViMzZjZDJlOWQ0ZTRmM2UyZTRlNGYyZGUxMjY2Pl0KL0xlbmd0aCA3OAov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqtykkSgCAMRFHUCBIH xBCJev97GpWlS97qV1cbU0PT1tBBrwCsdW7wOE6zd9q4YFjLJX42SsS8v5go qcxyqPMhIrrnfBXx1w2YRAelCmVuZHN0cmVhbQplbmRvYmoKCjcwNyAwIG9i ago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0lt NzA3Ci9XaWR0aCA4Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9D b2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEgPGZjZjdmN2ZmZWRl ZT5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFt CnjaYxAFAAAXABYKZW5kc3RyZWFtCmVuZG9iagoKNzA4IDAgb2JqCjw8Ci9U eXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW03MDgKL1dp ZHRoIDIKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3Bh Y2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8ZmNmN2Y3ZjBmMWYyPl0KL0xl bmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hMAAAAR ABEKZW5kc3RyZWFtCmVuZG9iagoKNzA5IDAgb2JqCjw8Ci9UeXBlIC9YT2Jq ZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW03MDkKL1dpZHRoIDkKL0hl aWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRl eGVkIC9EZXZpY2VSR0IgMSA8ZmNmN2Y3ZmZlZGVlPl0KL0xlbmd0aCAxMQov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjDGUAAACwAFcKZW5k c3RyZWFtCmVuZG9iagoKNzEwIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9T dWJ0eXBlIC9JbWFnZQovTmFtZSAvSW03MTAKL1dpZHRoIDQKL0hlaWdodCAx Ci9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9E ZXZpY2VSR0IgMiA8ZmNmN2Y3ZTVlNmUzZjBmMWYyPl0KL0xlbmd0aCA5Ci9G aWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMDAAAHAAcKZW5kc3Ry ZWFtCmVuZG9iagoKNzExIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0 eXBlIC9JbWFnZQovTmFtZSAvSW03MTEKL1dpZHRoIDEwCi9IZWlnaHQgMQov Qml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2 aWNlUkdCIDIgPGZjZjdmN2ZmZWRlZWZmZTZlND5dCi9MZW5ndGggMTEKL0Zp bHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY8yaAAABagD8CmVuZHN0 cmVhbQplbmRvYmoKCjcxMiAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3Vi dHlwZSAvSW1hZ2UKL05hbWUgL0ltNzEyCi9XaWR0aCA1Ci9IZWlnaHQgMQov Qml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2 aWNlUkdCIDMgPGZjZjdmN2YwZjFmMmUyZGRkNGU1ZTZlMz5dCi9MZW5ndGgg MTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjakzoAAAD2ANsK ZW5kc3RyZWFtCmVuZG9iagoKNzEzIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0 Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW03MTMKL1dpZHRoIDEwCi9IZWln aHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhl ZCAvRGV2aWNlUkdCIDQgPGZjZjdmN2ZmZWRlZWZmZTZlNGZmZDhkMWZmYmNj Yj5dCi9MZW5ndGggMTMKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFt CnjaY1QydlEAAAHTALsKZW5kc3RyZWFtCmVuZG9iagoKNzE0IDAgb2JqCjw8 Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW03MTQK L1dpZHRoIDgKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNSA8ZmNmN2Y3ZjBmMWYyZTVl NmUzZTJkZGQ0Y2NjY2NjYmJiZGJmPl0KL0xlbmd0aCAxMgovRmlsdGVyIC9G bGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVHZ1AAABOwCqCmVuZHN0cmVhbQpl bmRvYmoKCjcxNSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAv SW1hZ2UKL05hbWUgL0ltNzE1Ci9XaWR0aCAxMgovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiA2IDxmY2Y3ZjdmZmVkZWVmZmU2ZTRmZmQ4ZDFmZmJjY2JmZmI5YjhmZmE4 YjA+XQovTGVuZ3RoIDE0Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVh bQp42mNUNglLFgAAA2MBIgplbmRzdHJlYW0KZW5kb2JqCgo3MTYgMCBvYmoK PDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTcx NgovV2lkdGggOQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29s b3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA2IDxmY2Y3ZjdmMGYxZjJl NWU2ZTNlMmRkZDRjY2NjY2NiYmJkYmZhOWFkYjA+XQovTGVuZ3RoIDEzCi9G aWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUdk0TAAACQQDgCmVu ZHN0cmVhbQplbmRvYmoKCjcxNyAwIG9iago8PAovVHlwZSAvWE9iamVjdAov U3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltNzE3Ci9XaWR0aCAxMgovSGVpZ2h0 IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQg L0RldmljZVJHQiA2IDxmZmVkZWVmZmU2ZTRmZmQ4ZDFmZmJjY2JmZmI5Yjhm ZmE4YjBmY2Y3Zjc+XQovTGVuZ3RoIDE0Ci9GaWx0ZXIgL0ZsYXRlRGVjb2Rl Cj4+CnN0cmVhbQp42mNUMgkNFgMAA0EBFgplbmRzdHJlYW0KZW5kb2JqCgo3 MTggMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9O YW1lIC9JbTcxOAovV2lkdGggMTAKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9u ZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNiA8ZjBm MWYyZTJkZGQ0Y2NjY2NjYmJiZGJmOTk5OTk5YTlhZGIwZmNmN2Y3Pl0KL0xl bmd0aCAxMwovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjYFQy CQMAAS0ArgplbmRzdHJlYW0KZW5kb2JqCgo3MTkgMCBvYmoKPDwKL1R5cGUg L1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTcxOQovV2lkdGgg MTkKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2Ug Wy9JbmRleGVkIC9EZXZpY2VSR0IgNyA8ZmNmN2Y3ZmZlZGVlZmZlNmU0ZmZk OGQxZmZiY2NiZmZiOWI4ZmZhOGIwZmY5OTk5Pl0KL0xlbmd0aCAxOAovRmls dGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjYBAUMnFNLw9iAAAHRgHN CmVuZHN0cmVhbQplbmRvYmoKCjcyMCAwIG9iago8PAovVHlwZSAvWE9iamVj dAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltNzIwCi9XaWR0aCAxMwovSGVp Z2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4 ZWQgL0RldmljZVJHQiA4IDxmY2Y3ZjdhOWFkYjA1YzVkNWQ4NDg4OGFlNWU2 ZTNlMmRkZDRjY2NjY2NiYmJkYmY3Mzc1Nzc+XQovTGVuZ3RoIDE1Ci9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUMgkrbnYAAAXVAeQKZW5k c3RyZWFtCmVuZG9iagoKNzIxIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9T dWJ0eXBlIC9JbWFnZQovTmFtZSAvSW03MjEKL1dpZHRoIDM2Ci9IZWlnaHQg MQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAv RGV2aWNlUkdCIDExIDxmY2Y3ZjdmZmVkZWVmZmQ4ZDFmZmU2ZTRmZjc3Nzhl YzUzNTFmZjY2NjZmZjk5OTlmZmJjY2JmZmI5YjhmZmE4YjBmZDg3OGE+XQov TGVuZ3RoIDI2Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMU FBRSUjZgYGByTVfqmLXaZSIAF0cEHQplbmRzdHJlYW0KZW5kb2JqCgo3MjIg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTcyMgovV2lkdGggMTIKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50 IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgOCA8YmJiZGJm NWM1ZDVkNDI0MjNmZTVlNmUzZTJkZGQ0Y2NjY2NjOTk5OTk5NzM3NTc3YTlh ZGIwPl0KL0xlbmd0aCAxNAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl YW0KeNpjVDRxTZcAAAM2ARsKZW5kc3RyZWFtCmVuZG9iagoKNzIzIDAgb2Jq Cjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW03 MjMKL1dpZHRoIDM3Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9D b2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDExIDxmY2Y3ZjdmZmVk ZWVmZmU2ZTRmZmQ4ZDFmZmI5YjhmZmJjY2JmZjc3NzhjMTQwNDBmZjY2NjZm ZmE4YjBmZjk5OTlmZDg3OGE+XQovTGVuZ3RoIDI3Ci9GaWx0ZXIgL0ZsYXRl RGVjb2RlCj4+CnN0cmVhbQp42mMUUjJxNTZiYGBK7zQO9ZyVsZkBACIcBIwK ZW5kc3RyZWFtCmVuZG9iagoKNzI0IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0 Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW03MjQKL1dpZHRoIDE0Ci9IZWln aHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhl ZCAvRGV2aWNlUkdCIDkgPGZjZjdmN2JiYmRiZjVjNWQ1ZDJlMmMyYTczNzU3 N2U1ZTZlM2UyZGRkNGNjY2NjYzg0ODg4YTc4NmQ1ZT5dCi9MZW5ndGggMTUK L0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1R2TSvsnAoABssC XwplbmRzdHJlYW0KZW5kb2JqCgo3MjUgMCBvYmoKPDwKL1R5cGUgL1hPYmpl Y3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTcyNQovV2lkdGggMzcKL0hl aWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRl eGVkIC9EZXZpY2VSR0IgMTAgPGZjZjdmN2ZmZWRlZWZmZTZlNGZmYjliOGZm YThiMGZmYmNjYmZmZDhkMWVjNTM1MWZmNzc3OGZmOTk5OWZmNjY2Nj5dCi9M ZW5ndGggMjcKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1RS MjE2TVMUFC5vTQ019py1RAEAKJMFHQplbmRzdHJlYW0KZW5kb2JqCgo3MjYg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTcyNgovV2lkdGggMzUKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50 IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMTIgPGZjZjdm N2YwZjFmMmU1ZTZlM2JiYmRiZmNjY2NjY2UyZGRkNDczNzU3NzQyNDIzZjg0 ODg4YTk5OTk5OTJlMmMyYWE5YWRiMDVjNWQ1ZD5dCi9MZW5ndGggMjYKL0Zp bHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY2BUNnFxNatQEBSaVa0U 4tyzAQAiVATdCmVuZHN0cmVhbQplbmRvYmoKCjcyNyAwIG9iago8PAovVHlw ZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltNzI3Ci9XaWR0 aCAzOQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFj ZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxMiA8ZmNmN2Y3ZmZlZGVlZmZlNmU0 ZmZkOGQxZmY5OTk5ZmZhOGIwZmZiOWI4ZmY3Nzc4YzE0MDQwZWM1MzUxZmZi Y2NiZmQ4NzhhZmY2NjY2Pl0KL0xlbmd0aCAyOAovRmlsdGVyIC9GbGF0ZURl Y29kZQo+PgpzdHJlYW0KeNpjVFIyCQ1LSzY2rphitWpVasiezQwAPUkHFgpl bmRzdHJlYW0KZW5kb2JqCgo3MjggMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QK L1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTcyOAovV2lkdGggMzUKL0hlaWdo dCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVk IC9EZXZpY2VSR0IgMTAgPGZjZjdmN2U1ZTZlM2JiYmRiZjg0ODg4YWNjY2Nj YzQyNDIzZmE5YWRiMDVjNWQ1ZDJlMmMyYWUyZGRkNDczNzU3Nz5dCi9MZW5n dGggMjYKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYxAyUlJR Dk0UFFRvd5w5xW0VAwAhbQSSCmVuZHN0cmVhbQplbmRvYmoKCjcyOSAwIG9i ago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0lt NzI5Ci9XaWR0aCAzOQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAov Q29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxMiA8ZmNmN2Y3ZmZl ZGVlZmZlNmU0ZmZhOGIwZmY5OTk5ZmZiOWI4ZmZkOGQxZWM1MzUxYzE0MDQw ZmY2NjY2ZmZiY2NiZmQ4NzhhZmY3Nzc4Pl0KL0xlbmd0aCAyOAovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVFIycTE2Ng1NqZi6atWqYJM9 UxkAOzIG9QplbmRzdHJlYW0KZW5kb2JqCgo3MzAgMCBvYmoKPDwKL1R5cGUg L1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTczMAovV2lkdGgg MzUKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2Ug Wy9JbmRleGVkIC9EZXZpY2VSR0IgMTIgPGZjZjdmN2U1ZTZlMzk5OTk5OTVj NWQ1ZDg0ODg4YWE5YWRiMGJiYmRiZjczNzU3NzJlMmMyYWNjY2NjY2UyZGRk NDQyNDIzZmQzZDNlOT5dCi9MZW5ndGggMjYKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjaYxAyCUsLb89ctUq7SVDq5DQVAQA2DgYJCmVuZHN0 cmVhbQplbmRvYmoKCjczMSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3Vi dHlwZSAvSW1hZ2UKL05hbWUgL0ltNzMxCi9XaWR0aCAzOAovSGVpZ2h0IDEK L0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rl dmljZVJHQiAxMCA8ZmZlZGVlZmZlNmU0ZmZkOGQxZmY5OTk5ZmZhOGIwZmZi OWI4ZmY2NjY2YzE0MDQwZmQ4NzhhZmZiY2NiZmY3Nzc4Pl0KL0xlbmd0aCAy NgovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVFI2BgKT0PSK yJkzZ7pYLHMAAC+OBgEKZW5kc3RyZWFtCmVuZG9iagoKNzMyIDAgb2JqCjw8 Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW03MzIK L1dpZHRoIDM1Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xv clNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDE0IDxmY2Y3ZjdlNWU2ZTM5 OTk5OTk0MjQyM2Y1YzVkNWRhOWFkYjA4NDg4OGE3Mzc1NzdiYmJkYmZjY2Nj Y2NlMmRkZDQyZTJjMmFlNGU0ZjJkM2QzZTljNGQyZDg+XQovTGVuZ3RoIDI3 Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMQMlFVDSvqnLnC 2/PMqXszgiYAADe1B6UKZW5kc3RyZWFtCmVuZG9iagoKNzMzIDAgb2JqCjw8 Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW03MzMK L1dpZHRoIDM4Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xv clNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDExIDxmZmVkZWVmZmU2ZTRm ZmQ4ZDFmZmJjY2JmZDg3OGFmZjk5OTlmZmE4YjBjMTQwNDBlYzUzNTFmZmI5 YjhmZjc3NzhmZjY2NjY+XQovTGVuZ3RoIDI3Ci9GaWx0ZXIgL0ZsYXRlRGVj b2RlCj4+CnN0cmVhbQp42mNUMnFxcXENTSlvnWxsOTMtZLUjADWJBlwKZW5k c3RyZWFtCmVuZG9iagoKNzM0IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9T dWJ0eXBlIC9JbWFnZQovTmFtZSAvSW03MzQKL1dpZHRoIDMzCi9IZWlnaHQg MQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAv RGV2aWNlUkdCIDExIDxlNWU2ZTM4NDg4OGE1YzVkNWQ5OTk5OTlhOWFkYjBi YmJkYmZjY2NjY2M0MjQyM2YyZTJjMmFlNGU0ZjJkM2QzZTljNGQyZDg+XQov TGVuZ3RoIDI1Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNU EjY2cQlNS6wQmDlrdapzAAAmggVcCmVuZHN0cmVhbQplbmRvYmoKCjczNSAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltNzM1Ci9XaWR0aCAzOAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg NAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxMCA8ZmZlZGVl ZmZlNmU0ZmZkOGQxZmZhOGIwZmQ4NzhhZmY5OTk5ZWM1MzUxYzE0MDQwZmY2 NjY2ZmZiOWI4ZmY3Nzc4Pl0KL0xlbmd0aCAyNAovRmlsdGVyIC9GbGF0ZURl Y29kZQo+PgpzdHJlYW0KeNpjVDJxAYJQs/LOmUAw2WTFIgA5jwdoCmVuZHN0 cmVhbQplbmRvYmoKCjczNiAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3Vi dHlwZSAvSW1hZ2UKL05hbWUgL0ltNzM2Ci9XaWR0aCAzMwovSGVpZ2h0IDEK L0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rl dmljZVJHQiAxMCA8Y2NjY2NjNzM3NTc3ODQ4ODhhOTk5OTk5YTlhZGIwYmJi ZGJmNWM1ZDVkMmUyYzJhNDI0MjNmZTRlNGYyZDNkM2U5Pl0KL0xlbmd0aCAy NQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjFFJSUnZxDQir 8Jw5axVrSAAAIzYE8QplbmRzdHJlYW0KZW5kb2JqCgo3MzcgMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTczNwov V2lkdGggNDcKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMTMgPGZjZjdmN2YwZjFmMmZm ZTZlNGZmZDhkMWZmOTk5OWNmNjc2ZmZmNzc3OGZkODc4YWVjNTM1MWMxNDA0 MGZmYjliOGZmYThiMGZmNjY2NmZmYmNjYj5dCi9MZW5ndGggMzEKL0ZpbHRl ciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY2AUZGAydk1PS0sr8ZhZtQoI Vm/JOcsAAFTBCTUKZW5kc3RyZWFtCmVuZG9iagoKNzM4IDAgb2JqCjw8Ci9U eXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW03MzgKL1dp ZHRoIDMzCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNw YWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDggPGNjY2NjYzczNzU3Nzg0ODg4 YTk5OTk5OWE5YWRiMGJiYmRiZjQyNDIzZmU0ZTRmMmQzZDNlOT5dCi9MZW5n dGggMjUKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYxQUUlI2 cQ0NSmQvL+9gDQ0AABz9BBIKZW5kc3RyZWFtCmVuZG9iagoKNzM5IDAgb2Jq Cjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW03 MzkKL1dpZHRoIDQ3Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9D b2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDExIDxmY2Y3ZjdmMGYx ZjJmZmU2ZTRmZmQ4ZDFmZDg3OGFjZjY3NmZmZjY2NjZmZjc3NzhmZjk5OTlm ZmE4YjBmZmI5YjhmZmJjY2I+XQovTGVuZ3RoIDMyCi9GaWx0ZXIgL0ZsYXRl RGVjb2RlCj4+CnN0cmVhbQp42mNgFBRgUnYNCU0rd2lP61y9e/funR3uVQwA UlQIqwplbmRzdHJlYW0KZW5kb2JqCgo3NDAgMCBvYmoKPDwKL1R5cGUgL1hP YmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTc0MAovV2lkdGggMjgK L0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9J bmRleGVkIC9EZXZpY2VSR0IgMTAgPGZjZjdmN2U0ZTRmMmI5YmRlOTYxNjJi Yzg1ODdkNmE4YTllMTdiNzljNWYwZjFmMmM0ZDJkOGU1ZTZlM2ZmZWRlZT5d Ci9MZW5ndGggMjIKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja YxQyUVIKMVMvSjbpXMAAABQ7A28KZW5kc3RyZWFtCmVuZG9iagoKNzQxIDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW03NDEKL1dpZHRoIDMzCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0 Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDkgPGUyZGRkNDg0 ODg4YTVjNWQ1ZDczNzU3Nzk5OTk5OWE5YWRiMGJiYmRiZmQzZDNlOWU0ZTRm MmNjY2NjYz5dCi9MZW5ndGggMjUKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4K c3RyZWFtCnjaY1QyNhZ0CU1LC6voaK+cOY0BACf1BYUKZW5kc3RyZWFtCmVu ZG9iagoKNzQyIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9J bWFnZQovTmFtZSAvSW03NDIKL1dpZHRoIDQ2Ci9IZWlnaHQgMQovQml0c1Bl ckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdC IDEyIDxmY2Y3ZjdmMGYxZjJlNWU2ZTNmZmVkZWVlMmRkZDRmZjk5OTlmZDg3 OGFjZjY3NmZmZjY2NjZmZjc3NzhmZmE4YjBmZmI5YjhmZmJjY2I+XQovTGVu Z3RoIDMyCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNgVBIw ck1Lr+iYmRYatXrPmTNnVoXNPAAAXAQKSgplbmRzdHJlYW0KZW5kb2JqCgo3 NDMgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9O YW1lIC9JbTc0MwovV2lkdGggMzQKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9u ZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMTIgPGZm ZWRlZWUyZGRkNDg0ODg4YTVjNWQ1ZDczNzU3Nzk5OTk5OWE5YWRiMGJiYmRi ZmNjY2NjY2M0ZDJkOGQzZDNlOWU0ZTRmMmU1ZTZlMz5dCi9MZW5ndGggMjUK L0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1Q2NnZRCk0rr5i1 e/eqmTN7AC8nBxMKZW5kc3RyZWFtCmVuZG9iagoKNzQ0IDAgb2JqCjw8Ci9U eXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW03NDQKL1dp ZHRoIDM0Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNw YWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDExIDxmY2Y3ZjdmZmU2ZTRmZmQ4 ZDFmZmE4YjBjZjY3NmZmZjY2NjZmZjc3NzhmZDg3OGFmZjk5OTlmZmI5Yjhm ZmJjY2JmZmVkZWU+XQovTGVuZ3RoIDI1Ci9GaWx0ZXIgL0ZsYXRlRGVjb2Rl Cj4+CnN0cmVhbQp42mNUdgkNS6/oMJ61atUq447y1QA1KgcjCmVuZHN0cmVh bQplbmRvYmoKCjc0NSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlw ZSAvSW1hZ2UKL05hbWUgL0ltNzQ1Ci9XaWR0aCAzCi9IZWlnaHQgMQovQml0 c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNl UkdCIDIgPGZmZDhkMWZkZTBiNWZmZTZlND5dCi9MZW5ndGggOQovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTAAAAGQAZCmVuZHN0cmVhbQpl bmRvYmoKCjc0NiAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAv SW1hZ2UKL05hbWUgL0ltNzQ2Ci9XaWR0aCAzMwovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiAxMiA8ZTVlNmUzOTk5OTk5NWM1ZDVkNDI0MjNmNzM3NTc3ODQ4ODhhYTlh ZGIwYmJiZGJmY2NjY2NjYzRkMmQ4ZDNkM2U5ZTRlNGYyZjBmMWYyPl0KL0xl bmd0aCAyNgovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVFZW cgkVTCvvXH1m96pVKw4AAC6rB2gKZW5kc3RyZWFtCmVuZG9iagoKNzQ3IDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW03NDcKL1dpZHRoIDMxCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0 Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDExIDxmZmVkZWVl MmRkZDRiNWE0OGVjZjY3NmZmZjY2NjZmZjc3NzhmZDg3OGFmZjk5OTlmZmE4 YjBmZmJjY2JmZmU2ZTRmZmQ4ZDE+XQovTGVuZ3RoIDI0Ci9GaWx0ZXIgL0Zs YXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUdnENSy/vnLlq5YyOtmoGADBWBngK ZW5kc3RyZWFtCmVuZG9iagoKNzQ4IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0 Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW03NDgKL1dpZHRoIDUKL0hlaWdo dCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVk IC9EZXZpY2VSR0IgMyA8ZmZlNmU0ZmZjZThjZmZiYTVjZmZlZGVlPl0KL0xl bmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTPAAA APQA2gplbmRzdHJlYW0KZW5kb2JqCgo3NDkgMCBvYmoKPDwKL1R5cGUgL1hP YmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTc0OQovV2lkdGggMzMK L0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9J bmRleGVkIC9EZXZpY2VSR0IgMTMgPGZmZTZlNGE5YWRiMDVjNWQ1ZDQyNDIz ZjczNzU3Nzg0ODg4YTk5OTk5OWJiYmRiZmM0ZDJkOGU0ZTRmMmYwZjFmMmQz ZDNlOWNjY2NjY2ZjZjdmNz5dCi9MZW5ndGggMjYKL0ZpbHRlciAvRmxhdGVE ZWNvZGUKPj4Kc3RyZWFtCnjaY1Q2NlIJDUsUr5i5auXs3XsuAAAsQwcXCmVu ZHN0cmVhbQplbmRvYmoKCjc1MCAwIG9iago8PAovVHlwZSAvWE9iamVjdAov U3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltNzUwCi9XaWR0aCAzMQovSGVpZ2h0 IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQg L0RldmljZVJHQiAxMSA8ZjBmMWYyZTRmM2UyZTJkZGQ0ZmY5OTk5ZmY2NjY2 ZmY3Nzc4ZmQ4NzhhZmZhOGIwZmZiY2NiZmZlNmU0ZmZiOWI4ZmZlZGVlPl0K L0xlbmd0aCAyNAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpj EDJxCU0zruicOaOjvWzlBgAqLQaJCmVuZHN0cmVhbQplbmRvYmoKCjc1MSAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltNzUxCi9XaWR0aCA2Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0 Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDQgPGZmZWRlZWZm Y2U4Y2ZlYWEzM2ZmYmE1Y2ZmZTZlND5dCi9MZW5ndGggMTEKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1QyAQAAfgBYCmVuZHN0cmVhbQpl bmRvYmoKCjc1MiAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAv SW1hZ2UKL05hbWUgL0ltNzUyCi9XaWR0aCAzMgovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiAxNCA8ZmZlZGVlY2NjY2NjNzg2ZDVlMmUyYzJhNDI0MjNmNWM1ZDVkNzM3 NTc3ODQ4ODhhOTk5OTk5YTlhZGIwYmJiZGJmYzRkMmQ4ZTRlNGYyZjBmMWYy ZDNkM2U5Pl0KL0xlbmd0aCAyNQovRmlsdGVyIC9GbGF0ZURlY29kZQo+Pgpz dHJlYW0KeNpjVDZ2CU0r75i5+szdO2feyQIANJIH9gplbmRzdHJlYW0KZW5k b2JqCgo3NTMgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0lt YWdlCi9OYW1lIC9JbTc1MwovV2lkdGggMzMKL0hlaWdodCAxCi9CaXRzUGVy Q29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0Ig MTQgPGZjZjdmN2YwZjFmMmU0ZjNlMmQyZTlkNGUyZGRkNGZmYThiMGZmNjY2 NmZmNzc3OGZkODc4YWZmOTk5OWZmYjliOGZmYmNjYmZmZTZlNGZmZWRlZWZm ZDhkMT5dCi9MZW5ndGggMjYKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3Ry ZWFtCnjaY1Q2CUsr75i6+uzd17uXzj7LAABCHAixCmVuZHN0cmVhbQplbmRv YmoKCjc1NCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1h Z2UKL05hbWUgL0ltNzU0Ci9XaWR0aCAzMwovSGVpZ2h0IDEKL0JpdHNQZXJD b21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAx NCA8ZTRlNGYyYThhOWUxN2I3OWM1ODU4N2Q2YjliZGU5ZDNkM2U5ZTJkZGQ0 ZmZkOGQxZmRlMGI1ZmZlZGVlZmZiYTVjZjE5MzA2ZmVhYTMzZmZjZThjZmNm N2Y3Pl0KL0xlbmd0aCAyNQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl YW0KeNpjVFIyFhRxCU1L7yifuXrP2QcAJrwGsAplbmRzdHJlYW0KZW5kb2Jq Cgo3NTUgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdl Ci9OYW1lIC9JbTc1NQovV2lkdGggMzIKL0hlaWdodCAxCi9CaXRzUGVyQ29t cG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMTIg PGZmZWRlZWUyZGRkNDg0ODg4YTQyNDIzZjJlMmMyYTVjNWQ1ZDczNzU3Nzk5 OTk5OWE5YWRiMGJiYmRiZmM0ZDJkOGU0ZTRmMmNjY2NjYz5dCi9MZW5ndGgg MjQKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYxAycTEOTVMq 71y9+8ypVQcBKWYHAgplbmRzdHJlYW0KZW5kb2JqCgo3NTYgMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTc1Ngov V2lkdGggMzMKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMTQgPGZjZjdmN2YwZjFmMmU0 ZjNlMmQyZTlkNGE0ZDVhZmZmYThiMGZmNjY2NmZmNzc3OGZkODc4YWZmOTk5 OWZmYjliOGZmYmNjYmZmZTZlNGZmZWRlZWZmZDhkMT5dCi9MZW5ndGggMjYK L0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1QydglLK++Ytefu 3d27Q99eAAA9SQjuCmVuZHN0cmVhbQplbmRvYmoKCjc1NyAwIG9iago8PAov VHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltNzU3Ci9X aWR0aCA2OQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgOAovQ29sb3JT cGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyOSA8ZmNmN2Y3ZmZlZGVlZTRl NGYyODU4N2Q2NjE2MmJjN2I3OWM1YThhOWUxYjliZGU5Y2NjY2NjZTJkZGQ0 ZmRlMGI1ZmZjYjgyZmZjYzk5ZjE5MzA2OTI1OTA2ZmZiYTVjYzI3NzA2ZmNj NTdhZmZlNmU0ODQ4ODhhNDI0MjNmMmUyYzJhNWM1ZDVkNzM3NTc3OTk5OTk5 YTlhZGIwYmJiZGJmYzRkMmQ4ZDNkM2U5ZjBmMWYyPl0KL0xlbmd0aCA2Ngov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoVwQcCQDAMAMBE6IjU 6Nbw/2/iDhBxovmzEBljrHXO8yoizGHbkcNxAsQYfcqllJxrbS2lfg3VW/tv PC9YJwPBCmVuZHN0cmVhbQplbmRvYmoKCjc1OCAwIG9iago8PAovVHlwZSAv WE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltNzU4Ci9XaWR0aCAz MwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiAxMyA8ZmNmN2Y3ZTRmM2UyZDJlOWQ0YTRk NWFmN2NjMDg0ZmY5OTk5ZmY2NjY2ZmQ4NzhhZmZhOGIwZmZiY2NiZmZlNmU0 ZmZiOWI4ZmZkOGQxZmZlZGVlPl0KL0xlbmd0aCAyNgovRmlsdGVyIC9GbGF0 ZURlY29kZQo+PgpzdHJlYW0KeNpjFFRSdg5LK4+YtWrVzNl71jIAAC8SBrEK ZW5kc3RyZWFtCmVuZG9iagoKNzU5IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0 Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW03NTkKL1dpZHRoIDgKL0hlaWdo dCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVk IC9EZXZpY2VSR0IgMiA8ZmNmN2Y3ZmZlZGVlZmZlNmU0Pl0KL0xlbmd0aCAx MAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjjAQAAF0AWwpl bmRzdHJlYW0KZW5kb2JqCgo3NjAgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QK L1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTc2MAovV2lkdGggNjgKL0hlaWdo dCAxCi9CaXRzUGVyQ29tcG9uZW50IDgKL0NvbG9yU3BhY2UgWy9JbmRleGVk IC9EZXZpY2VSR0IgMzIgPGZjZjdmN2ZmZWRlZWZmZTZlNGZmZDhkMWE4YTll MTYxNjJiYzRjNGNhNTdiNzljNTg1ODdkNjk5OTljY2I5YmRlOWJiYmJkYmJi YmRiZmUyZGRkNGZmY2U4Y2ZmYmE1Y2ZmY2I4MmZmY2M5OWZlYWEzMzkyNTkw NmYxOTMwNmZjYzU3YWMyNzcwNjczNzU3NzQyNDIzZjJlMmMyYTVjNWQ1ZDg0 ODg4YTk5OTk5OWE5YWRiMGM0ZDJkOGNjY2NjY2U1ZTZlMz5dCi9MZW5ndGgg NjkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY2BkYmJmYWVl Y2Vl5+DgZGHh4ubh5eMXEOATFBQSFhEVEhYTBCoBAh5xCUlJCQkpKXFpaRkZ WR4eOQiQVwAAZdEEKwplbmRzdHJlYW0KZW5kb2JqCgo3NjEgMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTc2MQov V2lkdGggMzIKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMTUgPGYwZjFmMmU0ZjNlMmQy ZTlkNGE0ZDVhZjdjYzA4NDNmYTE0NGZkODc4YWZmNjY2NmZmNzc3OGZmOTk5 OWZmYThiMGZmYmNjYmZmZDhkMWZmZTZlNGZmZWRlZWZjZjdmNz5dCi9MZW5n dGggMjUKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYxRUMglJ 78hcfebMmV2r770HADJBCFYKZW5kc3RyZWFtCmVuZG9iagoKNzYyIDAgb2Jq Cjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW03 NjIKL1dpZHRoIDkKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0Nv bG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8ZmNmN2Y3ZmZlZGVl ZmZkOGQxZmZlNmU0Pl0KL0xlbmd0aCAxMQovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNpjjWYAAADIAGEKZW5kc3RyZWFtCmVuZG9iagoKNzYz IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFt ZSAvSW03NjMKL1dpZHRoIDcyCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVu dCA4Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMxIDxmY2Y3 ZjdmZmU2ZTRmZmQ4ZDFjY2NjY2M3Yjc5YzU2MTYyYmM0YzRjYTU4NTg3ZDY5 OTk5Y2NhOGE5ZTFiYmJiZGJiYmJkYmZmZmJhNWNmZWFhMzNmY2M1N2FmZmNi ODJjMjc3MDY5MjU5MDZmMTkzMDZmZGUwYjVlMmRkZDRiNWE0OGU1YzVkNWQy ZTJjMmE0MjQyM2Y3Mzc1Nzc4NDg4OGE5OTk5OTlhOWFkYjBjNGQyZDhkM2Qz ZTllNWU2ZTM+XQovTGVuZ3RoIDcwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+ CnN0cmVhbQp42hXMCQKAEBAAwHWn1aIDUfr/L2keMAAAjHMhldZKSWMWa1cU bnNE5F2IIcTdH+x3XinnUlK6a23tQXyn3sU3jwFjhAOxCmVuZHN0cmVhbQpl bmRvYmoKCjc2NCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAv SW1hZ2UKL05hbWUgL0ltNzY0Ci9XaWR0aCA0MQovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgOAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiAxNiA8ZjBmMWYyYTRkNWFmN2NjMDg0NjViMzZjM2ZhMTQ0ZDJlOWQ0ZmNm N2Y3ZTRmM2UyMmE3ZjJhYjVhNDhlZmQ4NzhhZmY3Nzc4ZmY5OTk5ZmZhOGIw ZmZiOWI4ZmZkOGQxZmZlZGVlPl0KL0xlbmd0aCA0NAovRmlsdGVyIC9GbGF0 ZURlY29kZQo+PgpzdHJlYW0KeNoNxAESACAEBEDRSaT8/7WZ2VkazCxToEq0 ALDZ9gg/ma1zv69KPxMLAUcKZW5kc3RyZWFtCmVuZG9iagoKNzY1IDAgb2Jq Cjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW03 NjUKL1dpZHRoIDg2Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA4Ci9D b2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDI4IDxmY2Y3ZjdmZmVk ZWVmZmU2ZTRmZmQ4ZDFmZmI5YjhhOGE5ZTE2MTYyYmM3Yjc5YzU4NTg3ZDY5 OTk5Y2NiOWJkZTljY2NjY2NmMTkzMDZjMjc3MDZmZWFhMzNmZmJhNWNmY2M1 N2FmZGUwYjViNWE0OGU1YzVkNWQyZTJjMmE0MjQyM2Y3Mzc1Nzc4NDg4OGE5 OTk5OTlhOWFkYjBiYmJkYmZmMGYxZjJlNGYzZTI+XQovTGVuZ3RoIDcwCi9G aWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42h3BiQKAEBAFwGelw5GK hPX/39nWDABFpAmAnkiRFmb+LOtmjLXO+bBHcUQvQoj0O6+U851SKU+trYsm Oo/BjBdvcQQNCmVuZHN0cmVhbQplbmRvYmoKCjc2NiAwIG9iago8PAovVHlw ZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltNzY2Ci9XaWR0 aCAzMAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFj ZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxNSA8ZjBmMWYyZTRmM2UyZDJlOWQ0 YTRkNWFmNjViMzZjMmE3ZjJhM2ZhMTQ0ZmY5OTk5ZmY3Nzc4ZmQ4NzhhZWM1 MzUxZmY2NjY2ZmZiY2NiZmZlNmU0ZmZlZGVlZmNmN2Y3Pl0KL0xlbmd0aCAy MwovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjFFQyCavoLO9a tXtHzb3/ACiZBzcKZW5kc3RyZWFtCmVuZG9iagoKNzY3IDAgb2JqCjw8Ci9U eXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW03NjcKL1dp ZHRoIDg3Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA4Ci9Db2xvclNw YWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDM0IDxmZmVkZWVmZmQ4ZDFmZmU2 ZTRmZmE4YjBmZDg3OGFmZjk5OTlmZmI5Yjg5OTk5Y2M2MTYyYmM3Yjc5YzU4 NTg3ZDZhOGE5ZTFiOWJkZTljY2NjY2NmZmNjOTljMjc3MDZmZWFhMzNmZmJh NWNmZmNiODJmY2M1N2FmZmNlOGM5MjU5MDZlMmRkZDRiNWE0OGU1YzVkNWQ0 MjQyM2Y3Mzc1Nzc4NDg4OGE5OTk5OTlhOWFkYjBlNWU2ZTNkMmU5ZDRlNGYz ZTJmMGYxZjJmY2Y3Zjc+XQovTGVuZ3RoIDc2Ci9GaWx0ZXIgL0ZsYXRlRGVj b2RlCj4+CnN0cmVhbQp42h3GWQJAIAAFwF4kFKUsLSLuf0hlvoaQAqAETcso GOsA8L4YRi6ElNOslF4qY+xq1aZBf/vhvPfOhRjPlFIMNdd155yf9wOJDwT2 CmVuZHN0cmVhbQplbmRvYmoKCjc2OCAwIG9iago8PAovVHlwZSAvWE9iamVj dAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltNzY4Ci9XaWR0aCA1Ci9IZWln aHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhl ZCAvRGV2aWNlUkdCIDIgPGQyZTlkNDNmYTE0NDJhN2YyYT5dCi9MZW5ndGgg MTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjak2QAAAA0ABoK ZW5kc3RyZWFtCmVuZG9iagoKNzY5IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0 Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW03NjkKL1dpZHRoIDI5Ci9IZWln aHQgMQovQml0c1BlckNvbXBvbmVudCA4Ci9Db2xvclNwYWNlIFsvSW5kZXhl ZCAvRGV2aWNlUkdCIDE2IDxmMGYxZjJlNGYzZTJkMmU5ZDRjNGQyZDhhNGQ1 YWY3Y2MwODQzZmExNDQ4Y2E5OTNmZDg3OGFmZjk5OTlmZjc3NzhmZjY2NjZm ZmE4YjBmZmJjY2JmZmU2ZTRmZmVkZWVmY2Y3Zjc+XQovTGVuZ3RoIDM3Ci9G aWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNgZGRkYmJmYWVj5+Dg 4OTk4ubm5uLi5OHl4xcQAAAJZADpCmVuZHN0cmVhbQplbmRvYmoKCjc3MCAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltNzcwCi9XaWR0aCA4OQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg OAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAzNiA8ZmZlZGVl ZmZlNmU0ZmZiY2NiZmZkOGQxZmZhOGIwZmQ4NzhhZmY5OTk5ZmZiOWI4ZmNm N2Y3ZmY3Nzc4Y2NjY2NjN2I3OWM1NjE2MmJjODU4N2Q2YThhOWUxYjliZGU5 ZDNkM2U5ZmZjYzk5YzI3NzA2ZjE5MzA2ZmVhYTMzZmZiYTVjZmNjNTdhZmZj YjgyZmRlMGI1ZmZjZThjYjVhNDhlNzg2ZDVlNDI0MjNmNWM1ZDVkNzM3NTc3 ODQ4ODhhOTk5OTk5YTlhZGIwZTRmM2UyZDJlOWQ0ZjBmMWYyPl0KL0xlbmd0 aCA4MwovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoVy9kCQCAQ AMDNSqWScpMu/v8bZd4HAIA0iC3tKOOkFYIy7KVSSmo9DMaM1rlprpZ1s7td 5gNJPYBoz8v7+w4hppRziiHlvjy/Ul7+AbWQBdkKZW5kc3RyZWFtCmVuZG9i agoKNzcxIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFn ZQovTmFtZSAvSW03NzEKL1dpZHRoIDM2Ci9IZWlnaHQgMQovQml0c1BlckNv bXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDE1 IDxmMGYxZjJhNGQ1YWYyYTdmMmE2NWIzNmNkMmU5ZDRmY2Y3ZjdlNGYzZTIz ZmExNDRmZjk5OTlmZjc3NzhmZDg3OGFmZmE4YjBmZmI5YjhmZmQ4ZDFmZmU2 ZTRmZmVkZWU+XQovTGVuZ3RoIDI2Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+ CnN0cmVhbQp42mNUMglIS3ERNO9c0bF79557X0MBOKoIEQplbmRzdHJlYW0K ZW5kb2JqCgo3NzIgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTc3MgovV2lkdGggOTMKL0hlaWdodCAxCi9CaXRz UGVyQ29tcG9uZW50IDgKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VS R0IgMzQgPGZjZjdmN2ZmZTZlNGZmYmNjYmZmOTk5OWVjNTM1MWZmNjY2NmZk ODc4YWZmZDhkMWZmZWRlZWE5YWRiMDdiNzljNTYxNjJiYzg1ODdkNmE4YTll MWI5YmRlOWQzZDNlOWZmY2M5OWMyNzcwNmYxOTMwNmZlYWEzM2ZmYmE1Y2Zj YzU3YWZmY2U4Y2ZkZTBiNWI1YTQ4ZTc4NmQ1ZTVjNWQ1ZDczNzU3Nzg0ODg4 YTk5OTk5OWJiYmRiZmU1ZTZlM2QyZTlkNGU0ZjNlMmYwZjFmMj5dCi9MZW5n dGggODIKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaLcGLEkAg EADAc6k7Eak8ipD//0jM2IXqhYiilkoRM6laCsRG61Z3nTF9P9hxdM5570OY Zru8KgZgosWuMaaUtm3Pufkc5/UrpdzwALr0BZ8KZW5kc3RyZWFtCmVuZG9i agoKNzczIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFn ZQovTmFtZSAvSW03NzMKL1dpZHRoIDM3Ci9IZWlnaHQgMQovQml0c1BlckNv bXBvbmVudCA4Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDE2 IDxmMGYxZjJjNGQyZDg3Y2MwODQzZmExNDQyYTdmMmFlNGYzZTJmY2Y3Zjdk MmU5ZDRhNGQ1YWZiNWE0OGVmZDg3OGFmZjk5OTlmZmE4YjBmZmJjY2JmZmQ4 ZDFmZmU2ZTRmZmVkZWU+XQovTGVuZ3RoIDQxCi9GaWx0ZXIgL0ZsYXRlRGVj b2RlCj4+CnN0cmVhbQp42g3BhwEAIAgDMDYKjv5/rSbEombiQeSemTxEZ1V3 r2+fCyAeDkIBFwplbmRzdHJlYW0KZW5kb2JqCgo3NzQgMCBvYmoKPDwKL1R5 cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTc3NAovV2lk dGggNTUKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDgKL0NvbG9yU3Bh Y2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMjUgPGZjZjdmN2ZmZTZlNGZmZDhk MWZmYThiMGZmYjliOGZkODc4YWZmNjY2NmVjNTM1MWZmNzc3OGZmYmNjYmI1 YTQ4ZTk5OTljYzg1ODdkNjdiNzljNWE4YTllMWI5YmRlOWNjY2NjY2YxOTMw NmMyNzcwNmZlYWEzM2ZmYmE1Y2ZjYzU3YWZmY2U4Y2ZmY2M5OWZkZTBiNWZm ZWRlZT5dCi9MZW5ndGggNTcKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3Ry ZWFtCnjaDcGHAcAgCAAwBcQ9ULT2/0fbxFgAQCJ07JksOQ4YfymXWkturfch c4rIWqq6z3MvvOYDLuYCZAplbmRzdHJlYW0KZW5kb2JqCgo3NzUgMCBvYmoK PDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTc3 NQovV2lkdGggNzUKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDgKL0Nv bG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMjUgPGZmZTZlNGZmZDhk MWZmY2M5OWI1YTQ4ZTk5OTk5OTg0ODg4YWE5YWRiMGJiYmRiZmNjY2NjY2Qy ZTlkNGE0ZDVhZmM0ZDJkOGU0ZjNlMjdjYzA4NDNmYTE0NDJhN2YyYTY1YjM2 Y2YwZjFmMmZkODc4YWZmNzc3OGZmOTk5OWZmYThiMGZmYjliOGZmYmNjYmZm ZWRlZWZjZjdmNz5dCi9MZW5ndGggNjYKL0ZpbHRlciAvRmxhdGVEZWNvZGUK Pj4Kc3RyZWFtCnjaJchJEoAwCADBYFAEVCJxIf//qFTZt5kCAFOtiHNCxIWI VhZR5d+WdD/MrPGZMvOKtOa9u1/380KJiDE+W7ADSQplbmRzdHJlYW0KZW5k b2JqCgo3NzYgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0lt YWdlCi9OYW1lIC9JbTc3NgovV2lkdGggNTQKL0hlaWdodCAxCi9CaXRzUGVy Q29tcG9uZW50IDgKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0Ig MjMgPGZjZjdmN2ZmZTZlNGZmZDhkMWZmYThiMGZkODc4YWZmYjliOGZmNzc3 OGVjNTM1MWZmNjY2NmZmYmNjYmZmOTk5OWI5YmRlOWE4YTllMTk5OTljYzg1 ODdkNmJiYmRiZmZlYWEzM2MyNzcwNmYxOTMwNmZmYmE1Y2ZjYzU3YWZmY2U4 Y2ZmY2M5OWZkZTBiNT5dCi9MZW5ndGggNTUKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjaDcEBAoAgCANA2xIl0Uis/v/TuksbwD2TlCJkLZIB VT3YrI/Rzdrp129O94hY9/MifSnAAiIKZW5kc3RyZWFtCmVuZG9iagoKNzc3 IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFt ZSAvSW03NzcKL1dpZHRoIDc0Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVu dCA4Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDI0IDxmZmVk ZWVmZmU2ZTRmZmQ4ZDFmZGUwYjVmZmNlOGNlMmRkZDRjY2NjY2NiYmJkYmZl NWU2ZTM3Y2MwODRhNGQ1YWZjNGQyZDhkMmU5ZDQzZmExNDQyYTdmMmFmMGYx ZjJlNGYzZTI2NWIzNmNmZjk5OTlmZjY2NjZmZjc3NzhmZmE4YjBmZmI5Yjhm ZmJjY2JmY2Y3Zjc+XQovTGVuZ3RoIDYxCi9GaWx0ZXIgL0ZsYXRlRGVjb2Rl Cj4+CnN0cmVhbQp42h3BCQKAIAgAMMQkQUCzy/+/NHODgBi3RLT/iFKmiWUq i6qwubux1qU11SJyWD+vfj8vYgCAMT5c1wL6CmVuZHN0cmVhbQplbmRvYmoK Cjc3OCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UK L05hbWUgL0ltNzc4Ci9XaWR0aCA1MwovSGVpZ2h0IDEKL0JpdHNQZXJDb21w b25lbnQgOAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyMSA8 ZmZlNmU0ZmZkOGQxZmY5OTk5ZmY3Nzc4ZmQ4NzhhZmZhOGIwZmY2NjY2ZmZi Y2NiZmZiOWI4ZTRlNGYyZDNkM2U5YjliZGU5Y2NjY2NjZmZiYTVjYzI3NzA2 OTI1OTA2ZjE5MzA2ZmVhYTMzZmNjNTdhZmZjZThjZmZjYzk5ZmNmN2Y3Pl0K L0xlbmd0aCA1MgovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNod wQcCwCAIBLBydVQtII7/f9WRPER4cTiPEBBpi59HSrlcP4uqSK1mxtz6oLkA Hy4BxwplbmRzdHJlYW0KZW5kb2JqCgo3NzkgMCBvYmoKPDwKL1R5cGUgL1hP YmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTc3OQovV2lkdGggNzIK L0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9J bmRleGVkIC9EZXZpY2VSR0IgMTUgPGZmZWRlZWZmZDhkMWZkZTBiNWZmZTZl NGU1ZTZlM2YwZjFmMmUyZGRkNGNjY2NjY2E0ZDVhZjdjYzA4NDY1YjM2YzNm YTE0NDJhN2YyYWU0ZjNlMmQyZTlkNGZjZjdmNz5dCi9MZW5ndGggNDEKL0Zp bHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYxBSdgEC17Dyzg4QmLXn zM7e0NDQ2HfvOmY1CgobM/D/BwAEnQ8xCmVuZHN0cmVhbQplbmRvYmoKCjc4 MCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05h bWUgL0ltNzgwCi9XaWR0aCAyNTYKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9u ZW50IDgKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMjggPGZl YmYwMGQ0MDAyOWNmNjc2ZmVjNTM1MWMyNzcwNjkyNTkwNmYxOTMwNmZlYWEz M2ZmYmE1Y2ZjYzU3YWZmY2M5OWZmZDhkMWZmZWRlZWZjZjdmN2ZkZTBiNWZm Y2U4Y2ZmZTZlNGZmNzc3OGMxNDA0MGNmMGI2ODdjYzA4NDNmYTE0NGE0ZDVh ZjY1YjM2YzJhN2YyYWQyZTlkNGU0ZjNlMjg0ODg4YWRlMTI2Nj5dCi9MZW5n dGggNzcKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjarcpJEkAw EADAyC4TgoyJwf/fqSzFxTF9biHqaGqQSmljjNbWOue8bwPELvYpwQAhjNO9 8kXijEiPspwK8fpiZiIs2/7JPw6cTAgnCmVuZHN0cmVhbQplbmRvYmoKCjc4 MSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05h bWUgL0ltNzgxCi9XaWR0aCAyNTYKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9u ZW50IDgKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMjcgPGZl YmYwMGZmY2MwMGQ0MDAyOWMxNDA0MGMyNzcwNjkyNTkwNmYxOTMwNmZlYWEz M2ZmYmE1Y2ZjYzU3YWZmY2M5OWZmZDhkMWZmZWRlZWZmZTZlNGZkZTBiNWZm OTk5OWVjNTM1MWNmMGI2OGNmNjc2ZjNmYTE0NDJhN2YyYTdjYzA4NGE0ZDVh ZjY1YjM2Y2QyZTlkNGU0ZjNlMmU0ZTRmMmRlMTI2Nj5dCi9MZW5ndGggNzgK L0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjarcpJFoAgDERBVCSC A2KIiXr/exqnnUtq9/u1MUVUdRmNbZW1zgFA50M/jB40whTi/H7SbcGMROuD ELNikk3tFxHRnfn4pF8nqKQH0AplbmRzdHJlYW0KZW5kb2JqCgo3ODIgMCBv YmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9J bTc4MgovV2lkdGggNQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgov Q29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxIDxmY2Y3ZjdmMGYx ZjI+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVh bQp42hNlAAAALAAWCmVuZHN0cmVhbQplbmRvYmoKCjc4MyAwIG9iago8PAov VHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltNzgzCi9X aWR0aCA0Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNw YWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEgPGZjZjdmN2YwZjFmMj5dCi9M ZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTBQAA FgAWCmVuZHN0cmVhbQplbmRvYmoKCjc4NCAwIG9iago8PAovVHlwZSAvWE9i amVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltNzg0Ci9XaWR0aCA2Ci9I ZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5k ZXhlZCAvRGV2aWNlUkdCIDMgPGZjZjdmN2U0ZjNlMmU1ZTZlM2YwZjFmMj5d Ci9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja Y90AAAC8ALYKZW5kc3RyZWFtCmVuZG9iagoKNzg1IDAgb2JqCjw8Ci9UeXBl IC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW03ODUKL1dpZHRo IDcKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2Ug Wy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8ZmNmN2Y3ZjBmMWYyZTVlNmUzZTJk ZGQ0Pl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl YW0KeNqT+gEAAS4BEwplbmRzdHJlYW0KZW5kb2JqCgo3ODYgMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTc4Ngov V2lkdGggMTEKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNCA8ZmNmN2Y3ZmZlZGVlZmZl NmU0ZmZkOGQxZmZiY2NiPl0KL0xlbmd0aCAxNAovRmlsdGVyIC9GbGF0ZURl Y29kZQo+PgpzdHJlYW0KeNpjVDJ2UWAAAAKOALsKZW5kc3RyZWFtCmVuZG9i agoKNzg3IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFn ZQovTmFtZSAvSW03ODcKL1dpZHRoIDExCi9IZWlnaHQgMQovQml0c1BlckNv bXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDYg PGZjZjdmN2YwZjFmMmU1ZTZlM2UyZGRkNGNjY2NjY2JiYmRiZmE5YWRiMD5d Ci9MZW5ndGggMTQKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja Y1Q2dk0TAAADMgETCmVuZHN0cmVhbQplbmRvYmoKCjc4OCAwIG9iago8PAov VHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltNzg4Ci9X aWR0aCAxMwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JT cGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxIDxmY2Y3ZjdmZmVkZWU+XQov TGVuZ3RoIDEyCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNg cGAAAACEAEEKZW5kc3RyZWFtCmVuZG9iagoKNzg5IDAgb2JqCjw8Ci9UeXBl IC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW03ODkKL1dpZHRo IDEzCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNl IFsvSW5kZXhlZCAvRGV2aWNlUkdCIDYgPGZmZWRlZWZmZTZlNGZmZDhkMWZm YmNjYmZmYjliOGZmYThiMGZjZjdmNz5dCi9MZW5ndGggMTUKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1QyCQ01TAAABPMBkwplbmRzdHJl YW0KZW5kb2JqCgo3OTAgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5 cGUgL0ltYWdlCi9OYW1lIC9JbTc5MAovV2lkdGggMTIKL0hlaWdodCAxCi9C aXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZp Y2VSR0IgNyA8ZjBmMWYyZTVlNmUzZTJkZGQ0Y2NjY2NjYmJiZGJmOTk5OTk5 YTlhZGIwZmNmN2Y3Pl0KL0xlbmd0aCAxNAovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNpjYBQydk0HAAHdAPMKZW5kc3RyZWFtCmVuZG9iagoK NzkxIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQov TmFtZSAvSW03OTEKL1dpZHRoIDE0Ci9IZWlnaHQgMQovQml0c1BlckNvbXBv bmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPGZj ZjdmN2ZmZWRlZWZmZTZlND5dCi9MZW5ndGggMTIKL0ZpbHRlciAvRmxhdGVE ZWNvZGUKPj4Kc3RyZWFtCnjaYwxdygAAAlEA/AplbmRzdHJlYW0KZW5kb2Jq Cgo3OTIgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdl Ci9OYW1lIC9JbTc5MgovV2lkdGggMjAKL0hlaWdodCAxCi9CaXRzUGVyQ29t cG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNyA8 ZmNmN2Y3ZmZlZGVlZmZlNmU0ZmZkOGQxZmZiY2NiZmZiOWI4ZmZhOGIwZmY5 OTk5Pl0KL0xlbmd0aCAxOAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl YW0KeNpjYBAUMnFNLy9VAAAHrAIQCmVuZHN0cmVhbQplbmRvYmoKCjc5MyAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltNzkzCi9XaWR0aCA5Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAy Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEgPGYwZjFmMmZj ZjdmNz5dCi9MZW5ndGggMTEKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3Ry ZWFtCnjaY2B1AAAATQBGCmVuZHN0cmVhbQplbmRvYmoKCjc5NCAwIG9iago8 PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltNzk0 Ci9XaWR0aCA0Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xv clNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPGU1ZTZlMzg0ODg4YWUy ZGRkND5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl YW0KeNoTAwAAFwAXCmVuZHN0cmVhbQplbmRvYmoKCjc5NSAwIG9iago8PAov VHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltNzk1Ci9X aWR0aCAxMwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JT cGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA2IDxlMmRkZDRhOWFkYjBiYmJk YmZlNWU2ZTNjY2NjY2M5OTk5OTk4NDg4OGE+XQovTGVuZ3RoIDE1Ci9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUMGZwClMAAANfAQ0KZW5k c3RyZWFtCmVuZG9iagoKNzk2IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9T dWJ0eXBlIC9JbWFnZQovTmFtZSAvSW03OTYKL1dpZHRoIDE0Ci9IZWlnaHQg MQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAv RGV2aWNlUkdCIDMgPGZjZjdmN2ZmZWRlZWZmZDhkMWZmZTZlND5dCi9MZW5n dGggMTIKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYw3bywAA ApQBGQplbmRzdHJlYW0KZW5kb2JqCgo3OTcgMCBvYmoKPDwKL1R5cGUgL1hP YmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTc5NwovV2lkdGggMjEK L0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9J bmRleGVkIC9EZXZpY2VSR0IgNiA8ZmNmN2Y3ZmZkOGQxZmY5OTk5ZmZhOGIw ZmZiY2NiZmQ4NzhhZmZlNmU0Pl0KL0xlbmd0aCAxOQovRmlsdGVyIC9GbGF0 ZURlY29kZQo+PgpzdHJlYW0KeNpjYFQyEXQxVgo1YwAAB+gBjQplbmRzdHJl YW0KZW5kb2JqCgo3OTggMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5 cGUgL0ltYWdlCi9OYW1lIC9JbTc5OAovV2lkdGggNQovSGVpZ2h0IDEKL0Jp dHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rldmlj ZVJHQiAxIDxmY2Y3ZjdmMGYxZjI+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0Zs YXRlRGVjb2RlCj4+CnN0cmVhbQp42mNhAAAACgAFCmVuZHN0cmVhbQplbmRv YmoKCjc5OSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1h Z2UKL05hbWUgL0ltNzk5Ci9XaWR0aCAxMAovSGVpZ2h0IDEKL0JpdHNQZXJD b21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAy IDxmMGYxZjJlNWU2ZTNmY2Y3Zjc+XQovTGVuZ3RoIDExCi9GaWx0ZXIgL0Zs YXRlRGVjb2RlCj4+CnN0cmVhbQp42mMMUAAAAMYAcgplbmRzdHJlYW0KZW5k b2JqCgo4MDAgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0lt YWdlCi9OYW1lIC9JbTgwMAovV2lkdGggMTUKL0hlaWdodCAxCi9CaXRzUGVy Q29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0Ig OCA8ZmNmN2Y3YTlhZGIwNWM1ZDVkODQ4ODhhY2NjY2NjZTVlNmUzZTJkZGQ0 YmJiZGJmNzM3NTc3Pl0KL0xlbmd0aCAxNgovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNpjVDJxTSluDgAAB84CRwplbmRzdHJlYW0KZW5kb2Jq Cgo4MDEgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdl Ci9OYW1lIC9JbTgwMQovV2lkdGggMzgKL0hlaWdodCAxCi9CaXRzUGVyQ29t cG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMTEg PGZjZjdmN2ZmZWRlZWZmZDhkMWZmZTZlNGZmNzc3OGVjNTM1MWZmNjY2NmZm OTk5OWZmYmNjYmZmYjliOGZmYThiMGZkODc4YT5dCi9MZW5ndGggMjcKL0Zp bHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYxQUFFJSNmBgYFAJK9Lo XLXaZSIAGmIEcgplbmRzdHJlYW0KZW5kb2JqCgo4MDIgMCBvYmoKPDwKL1R5 cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTgwMgovV2lk dGggMTUKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3Bh Y2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNSA8ZjBmMWYyZTVlNmUzY2NjY2Nj ZTJkZGQ0ODQ4ODhhNzM3NTc3Pl0KL0xlbmd0aCAxNgovRmlsdGVyIC9GbGF0 ZURlY29kZQo+PgpzdHJlYW0KeNpjFDIUFGB2VQAAAvwAzgplbmRzdHJlYW0K ZW5kb2JqCgo4MDMgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTgwMwovV2lkdGggMTQKL0hlaWdodCAxCi9CaXRz UGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VS R0IgOCA8YmJiZGJmNWM1ZDVkNDI0MjNmZTVlNmUzZTJkZGQ0Y2NjY2NjOTk5 OTk5NzM3NTc3YTlhZGIwPl0KL0xlbmd0aCAxNQovRmlsdGVyIC9GbGF0ZURl Y29kZQo+PgpzdHJlYW0KeNpjVGQwcU2XAAADWQEbCmVuZHN0cmVhbQplbmRv YmoKCjgwNCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1h Z2UKL05hbWUgL0ltODA0Ci9XaWR0aCAzOQovSGVpZ2h0IDEKL0JpdHNQZXJD b21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAx MSA8ZmNmN2Y3ZmZlZGVlZmZlNmU0ZmZkOGQxZmZiOWI4ZmZiY2NiZmY3Nzc4 YzE0MDQwZmY2NjY2ZmZhOGIwZmY5OTk5ZmQ4NzhhPl0KL0xlbmd0aCAyOAov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjFFIycTU2UmBgUKuY bBoyc1bGZgYAKLkFPAplbmRzdHJlYW0KZW5kb2JqCgo4MDUgMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTgwNQov V2lkdGggMTYKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNyA8ZmNmN2Y3ZjBmMWYyZTVl NmUzZTJkZGQ0Y2NjY2NjOTk5OTk5NWM1ZDVkNzM3NTc3Pl0KL0xlbmd0aCAx NgovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVHYxNlYKKwIA BewBuQplbmRzdHJlYW0KZW5kb2JqCgo4MDYgMCBvYmoKPDwKL1R5cGUgL1hP YmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTgwNgovV2lkdGggMTYK L0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9J bmRleGVkIC9EZXZpY2VSR0IgOSA8ZmNmN2Y3YmJiZGJmNWM1ZDVkMmUyYzJh NzM3NTc3Y2NjY2NjZTVlNmUzZTJkZGQ0ODQ4ODhhNzg2ZDVlPl0KL0xlbmd0 aCAxNgovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVHYNKw/s nAYACMgCpwplbmRzdHJlYW0KZW5kb2JqCgo4MDcgMCBvYmoKPDwKL1R5cGUg L1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTgwNwovV2lkdGgg MzkKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2Ug Wy9JbmRleGVkIC9EZXZpY2VSR0IgMTAgPGZjZjdmN2ZmZWRlZWZmZTZlNGZm YjliOGZmYThiMGZmYmNjYmZmZDhkMWVjNTM1MWZmNzc3OGZmOTk5OWZmNjY2 Nj5dCi9MZW5ndGggMjgKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFt CnjaY1RSMjE2TUsSFDSvCAsNNvGctUQBAC2XBVQKZW5kc3RyZWFtCmVuZG9i agoKODA4IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFn ZQovTmFtZSAvSW04MDgKL1dpZHRoIDcKL0hlaWdodCAxCi9CaXRzUGVyQ29t cG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8 ZDNkM2U5YThhOWUxYjliZGU5ZmNmN2Y3Pl0KL0xlbmd0aCAxMAovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpj6wEAAJoAkwplbmRzdHJlYW0K ZW5kb2JqCgo4MDkgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTgwOQovV2lkdGggOAovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiAzIDxmMGYxZjJlNGU0ZjJkM2QzZTlmY2Y3Zjc+XQovTGVuZ3RoIDEwCi9G aWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hObDgAAxQCuCmVuZHN0 cmVhbQplbmRvYmoKCjgxMCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3Vi dHlwZSAvSW1hZ2UKL05hbWUgL0ltODEwCi9XaWR0aCAzOAovSGVpZ2h0IDEK L0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rl dmljZVJHQiAxMiA8ZmNmN2Y3ZjBmMWYyZTVlNmUzYmJiZGJmY2NjY2NjZTJk ZGQ0NzM3NTc3NDI0MjNmODQ4ODhhOTk5OTk5MmUyYzJhYTlhZGIwNWM1ZDVk Pl0KL0xlbmd0aCAyNwovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0K eNpjYFQ2cXEJTm9iFNRcvklJ1cXiNAAp+gU/CmVuZHN0cmVhbQplbmRvYmoK CjgxMSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UK L05hbWUgL0ltODExCi9XaWR0aCA0MQovSGVpZ2h0IDEKL0JpdHNQZXJDb21w b25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxMiA8 ZmNmN2Y3ZmZlZGVlZmZlNmU0ZmZkOGQxZmY5OTk5ZmZhOGIwZmZiOWI4ZmY3 Nzc4YzE0MDQwZWM1MzUxZmZiY2NiZmQ4NzhhZmY2NjY2Pl0KL0xlbmd0aCAy OQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVFIyCQ1LSzM2 Nu90XrVqWWjIns0MAEMNB2wKZW5kc3RyZWFtCmVuZG9iagoKODEyIDAgb2Jq Cjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW04 MTIKL1dpZHRoIDgKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0Nv bG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNCA8ZmNmN2Y3ZDNkM2U5 ZjBmMWYyYjliZGU5YThhOWUxPl0KL0xlbmd0aCAxMgovRmlsdGVyIC9GbGF0 ZURlY29kZQo+PgpzdHJlYW0KeNpjFFR2AgAAwwB4CmVuZHN0cmVhbQplbmRv YmoKCjgxMyAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1h Z2UKL05hbWUgL0ltODEzCi9XaWR0aCAxMwovSGVpZ2h0IDEKL0JpdHNQZXJD b21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA0 IDxlNGU0ZjJiOWJkZTlkM2QzZTlmY2Y3ZjdmMGYxZjI+XQovTGVuZ3RoIDE1 Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMUMnZQVGIAAAMg AMoKZW5kc3RyZWFtCmVuZG9iagoKODE0IDAgb2JqCjw8Ci9UeXBlIC9YT2Jq ZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW04MTQKL1dpZHRoIDM4Ci9I ZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5k ZXhlZCAvRGV2aWNlUkdCIDEwIDxmY2Y3ZjdlNWU2ZTNiYmJkYmY4NDg4OGFj Y2NjY2M0MjQyM2ZhOWFkYjA1YzVkNWQyZTJjMmFlMmRkZDQ3Mzc1Nzc+XQov TGVuZ3RoIDI3Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMQ MlJScjINExQUqigRlJzpkrUAACGWBIcKZW5kc3RyZWFtCmVuZG9iagoKODE1 IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFt ZSAvSW04MTUKL1dpZHRoIDQxCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVu dCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEyIDxmY2Y3 ZjdmZmVkZWVmZmU2ZTRmZmE4YjBmZjk5OTlmZmI5YjhmZmQ4ZDFlYzUzNTFj MTQwNDBmZjY2NjZmZmJjY2JmZDg3OGFmZjc3Nzg+XQovTGVuZ3RoIDI5Ci9G aWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUUjJxMTY2Dg1z74xa tWqpscmeqQwAPWYG3QplbmRzdHJlYW0KZW5kb2JqCgo4MTYgMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTgxNgov V2lkdGggMTkKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNiA8ZjBmMWYyYjliZGU5YThh OWUxZTRlNGYyODU4N2Q2ZmNmN2Y3ZDNkM2U5Pl0KL0xlbmd0aCAxOAovRmls dGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVDBxcWRlE1JjAAAG6QEe CmVuZHN0cmVhbQplbmRvYmoKCjgxNyAwIG9iago8PAovVHlwZSAvWE9iamVj dAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltODE3Ci9XaWR0aCAzOAovSGVp Z2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4 ZWQgL0RldmljZVJHQiAxMiA8ZmNmN2Y3ZTVlNmUzOTk5OTk5NWM1ZDVkODQ4 ODhhYTlhZGIwYmJiZGJmNzM3NTc3MmUyYzJhY2NjY2NjZTJkZGQ0NDI0MjNm ZDNkM2U5Pl0KL0xlbmd0aCAyNwovRmlsdGVyIC9GbGF0ZURlY29kZQo+Pgpz dHJlYW0KeNpjEDIJS0utKJu1atEORUHBNTOTHAFBIQcfCmVuZHN0cmVhbQpl bmRvYmoKCjgxOCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAv SW1hZ2UKL05hbWUgL0ltODE4Ci9XaWR0aCA0MAovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiAxMCA8ZmZlZGVlZmZlNmU0ZmZkOGQxZmY5OTk5ZmZhOGIwZmZiOWI4ZmY2 NjY2YzE0MDQwZmQ4NzhhZmZiY2NiZmY3Nzc4Pl0KL0xlbmd0aCAyNgovRmls dGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVFI2BgHXsPLWmTNnTnGx WOYAADcLBp4KZW5kc3RyZWFtCmVuZG9iagoKODE5IDAgb2JqCjw8Ci9UeXBl IC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW04MTkKL1dpZHRo IDIyCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNl IFsvSW5kZXhlZCAvRGV2aWNlUkdCIDggPGYwZjFmMmQzZDNlOTk5OTljY2U0 ZTRmMjg1ODdkNjYxNjJiY2I5YmRlOWZjZjdmN2E4YTllMT5dCi9MZW5ndGgg MTkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYxBSNAkTciww 62gGAAuIAsIKZW5kc3RyZWFtCmVuZG9iagoKODIwIDAgb2JqCjw8Ci9UeXBl IC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW04MjAKL1dpZHRo IDM4Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNl IFsvSW5kZXhlZCAvRGV2aWNlUkdCIDE0IDxmY2Y3ZjdlNWU2ZTM5OTk5OTk0 MjQyM2Y1YzVkNWRhOWFkYjA4NDg4OGE3Mzc1NzdiYmJkYmZjY2NjY2NlMmRk ZDQyZTJjMmFlNGU0ZjJkM2QzZTljNGQyZDg+XQovTGVuZ3RoIDI4Ci9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMQMlFVCk3XmDmrZcucM2fW vmzVBAA/XwhVCmVuZHN0cmVhbQplbmRvYmoKCjgyMSAwIG9iago8PAovVHlw ZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltODIxCi9XaWR0 aCA0MAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFj ZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxMSA8ZmZlZGVlZmZlNmU0ZmZkOGQx ZmZiY2NiZmQ4NzhhZmY5OTk5ZmZhOGIwYzE0MDQwZWM1MzUxZmZiOWI4ZmY3 Nzc4ZmY2NjY2Pl0KL0xlbmd0aCAyOAovRmlsdGVyIC9GbGF0ZURlY29kZQo+ PgpzdHJlYW0KeNpjVDJxcXFxDQ1zr4g0Np45LS1ktSMAN78GZwplbmRzdHJl YW0KZW5kb2JqCgo4MjIgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5 cGUgL0ltYWdlCi9OYW1lIC9JbTgyMgovV2lkdGggMTYKL0hlaWdodCAxCi9C aXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZp Y2VSR0IgNiA8ZjBmMWYyZTRlNGYyZDNkM2U5YjliZGU5ODU4N2Q2N2I3OWM1 OTk5OWNjPl0KL0xlbmd0aCAxNgovRmlsdGVyIC9GbGF0ZURlY29kZQo+Pgpz dHJlYW0KeNpjEBQSFDRxTQIAAwwBIQplbmRzdHJlYW0KZW5kb2JqCgo4MjMg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTgyMwovV2lkdGggMTEKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50 IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNSA8YjliZGU5 N2I3OWM1YThhOWUxZjBmMWYyZTVlNmUzYmJiYmRiPl0KL0xlbmd0aCAxNAov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVDZxDTUAAAM0ASMK ZW5kc3RyZWFtCmVuZG9iagoKODI0IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0 Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW04MjQKL1dpZHRoIDM2Ci9IZWln aHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhl ZCAvRGV2aWNlUkdCIDExIDxlNWU2ZTM4NDg4OGE1YzVkNWQ5OTk5OTlhOWFk YjBiYmJkYmZjY2NjY2M0MjQyM2YyZTJjMmFlNGU0ZjJkM2QzZTljNGQyZDg+ XQovTGVuZ3RoIDI2Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4 2mNUEjY2dnENSxNv5Jw5c9W2EFMAKQsFngplbmRzdHJlYW0KZW5kb2JqCgo4 MjUgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9O YW1lIC9JbTgyNQovV2lkdGggNDAKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9u ZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMTAgPGZm ZWRlZWZmZTZlNGZmZDhkMWZmYThiMGZkODc4YWZmOTk5OWVjNTM1MWMxNDA0 MGZmNjY2NmZmYjliOGZmNzc3OD5dCi9MZW5ndGggMjQKL0ZpbHRlciAvRmxh dGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1QycQEC1+D0ipkgMNlkxSIAQRUH7Qpl bmRzdHJlYW0KZW5kb2JqCgo4MjYgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QK L1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTgyNgovV2lkdGggMTYKL0hlaWdo dCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVk IC9EZXZpY2VSR0IgNyA8ZjBmMWYyZTRlNGYyYThhOWUxYjliZGU5ODU4N2Q2 NjE2MmJjZDNkM2U5ZmNmN2Y3Pl0KL0xlbmd0aCAxNgovRmlsdGVyIC9GbGF0 ZURlY29kZQo+PgpzdHJlYW0KeNpjFFQWNAkNSQcABIwBiwplbmRzdHJlYW0K ZW5kb2JqCgo4MjcgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTgyNwovV2lkdGggMTUKL0hlaWdodCAxCi9CaXRz UGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VS R0IgOCA8ZTRlNGYyN2I3OWM1NjE2MmJjYmJiYmRiZDNkM2U5OTk5OWNjYThh OWUxZjBmMWYyZTVlNmUzPl0KL0xlbmd0aCAxNgovRmlsdGVyIC9GbGF0ZURl Y29kZQo+PgpzdHJlYW0KeNpjVHYVK+/oKAAACAUCdwplbmRzdHJlYW0KZW5k b2JqCgo4MjggMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0lt YWdlCi9OYW1lIC9JbTgyOAovV2lkdGggMzYKL0hlaWdodCAxCi9CaXRzUGVy Q29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0Ig MTAgPGNjY2NjYzczNzU3Nzg0ODg4YTk5OTk5OWE5YWRiMGJiYmRiZjVjNWQ1 ZDJlMmMyYTQyNDIzZmU0ZTRmMmQzZDNlOT5dCi9MZW5ndGggMjYKL0ZpbHRl ciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYxRSUlIycQllTW+ZOXPmqgWh rgAo9QXmCmVuZHN0cmVhbQplbmRvYmoKCjgyOSAwIG9iago8PAovVHlwZSAv WE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltODI5Ci9XaWR0aCA1 MAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiAxMyA8ZmNmN2Y3ZjBmMWYyZmZlNmU0ZmZk OGQxZmY5OTk5Y2Y2NzZmZmY3Nzc4ZmQ4NzhhZWM1MzUxYzE0MDQwZmZiOWI4 ZmZhOGIwZmY2NjY2ZmZiY2NiPl0KL0xlbmd0aCAzMQovRmlsdGVyIC9GbGF0 ZURlY29kZQo+PgpzdHJlYW0KeNpjYBQUYFA2CStLS0sr8ZhZtQoEdruduQAA W38KNgplbmRzdHJlYW0KZW5kb2JqCgo4MzAgMCBvYmoKPDwKL1R5cGUgL1hP YmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTgzMAovV2lkdGggMzEK L0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9J bmRleGVkIC9EZXZpY2VSR0IgMTAgPGYwZjFmMmU0ZTRmMmI5YmRlOTdiNzlj NWE4YTllMWQzZDNlOTg1ODdkNjYxNjJiYzRjNGNhNWZjZjdmN2ZmZWRlZT5d Ci9MZW5ndGggMjQKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja YxQyCVWraHec4GxsFsCwcgIAIo0EyAplbmRzdHJlYW0KZW5kb2JqCgo4MzEg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTgzMQovV2lkdGggMzYKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50 IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgOCA8Y2NjY2Nj NzM3NTc3ODQ4ODhhOTk5OTk5YTlhZGIwYmJiZGJmNDI0MjNmZTRlNGYyZDNk M2U5Pl0KL0xlbmd0aCAyNgovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl YW0KeNpjFBRSUjJ2CQ1VEygvL69oCA0FACGSBMcKZW5kc3RyZWFtCmVuZG9i agoKODMyIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFn ZQovTmFtZSAvSW04MzIKL1dpZHRoIDUwCi9IZWlnaHQgMQovQml0c1BlckNv bXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEx IDxmY2Y3ZjdmMGYxZjJmZmU2ZTRmZmQ4ZDFmZDg3OGFjZjY3NmZmZjY2NjZm Zjc3NzhmZjk5OTlmZmE4YjBmZmI5YjhmZmJjY2I+XQovTGVuZ3RoIDMyCi9G aWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNgFBRkUDIJdQ1LL3dp T+tcvRsIZrSULwAAWCsJzAplbmRzdHJlYW0KZW5kb2JqCgo4MzMgMCBvYmoK PDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTgz MwovV2lkdGggMjkKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0Nv bG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMTAgPGZjZjdmN2U0ZTRm MmI5YmRlOTYxNjJiYzg1ODdkNmE4YTllMTdiNzljNWYwZjFmMmM0ZDJkOGU1 ZTZlM2ZmZWRlZT5dCi9MZW5ndGggMjMKL0ZpbHRlciAvRmxhdGVEZWNvZGUK Pj4Kc3RyZWFtCnjaYxQyUVIKcU4qVzP2mMXAAAAXkQM3CmVuZHN0cmVhbQpl bmRvYmoKCjgzNCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAv SW1hZ2UKL05hbWUgL0ltODM0Ci9XaWR0aCAzNgovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiA5IDxlMmRkZDQ4NDg4OGE1YzVkNWQ3Mzc1Nzc5OTk5OTlhOWFkYjBiYmJk YmZkM2QzZTllNGU0ZjJjY2NjY2M+XQovTGVuZ3RoIDI2Ci9GaWx0ZXIgL0Zs YXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUMjY2FHENS0tN7+joKJ85MwEALL0G PQplbmRzdHJlYW0KZW5kb2JqCgo4MzUgMCBvYmoKPDwKL1R5cGUgL1hPYmpl Y3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTgzNQovV2lkdGggNDkKL0hl aWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRl eGVkIC9EZXZpY2VSR0IgMTIgPGZjZjdmN2YwZjFmMmU1ZTZlM2ZmZWRlZWUy ZGRkNGZmOTk5OWZkODc4YWNmNjc2ZmZmNjY2NmZmNzc3OGZmYThiMGZmYjli OGZmYmNjYj5dCi9MZW5ndGggMzQKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4K c3RyZWFtCnjaY2AUUmRWCUsr7+icmRYatXrPmTNnTi3NnMMAAGoVCo0KZW5k c3RyZWFtCmVuZG9iagoKODM2IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9T dWJ0eXBlIC9JbWFnZQovTmFtZSAvSW04MzYKL1dpZHRoIDI1Ci9IZWlnaHQg MQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAv RGV2aWNlUkdCIDkgPGU0ZTRmMmQzZDNlOWE4YTllMTg1ODdkNmI5YmRlOTYx NjJiYzdiNzljNTk5OTljY2YwZjFmMmZjZjdmNz5dCi9MZW5ndGggMjEKL0Zp bHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1Q2cnFxcRJwDivsmAAA EtgDlwplbmRzdHJlYW0KZW5kb2JqCgo4MzcgMCBvYmoKPDwKL1R5cGUgL1hP YmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTgzNwovV2lkdGggMzcK L0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9J bmRleGVkIC9EZXZpY2VSR0IgMTIgPGZmZWRlZWUyZGRkNDg0ODg4YTVjNWQ1 ZDczNzU3Nzk5OTk5OWE5YWRiMGJiYmRiZmNjY2NjY2M0ZDJkOGQzZDNlOWU0 ZTRmMmU1ZTZlMz5dCi9MZW5ndGggMjgKL0ZpbHRlciAvRmxhdGVEZWNvZGUK Pj4Kc3RyZWFtCnjaY1Q2NjZxUg1LL+9cvXv3rpUzZxwAADx8CFgKZW5kc3Ry ZWFtCmVuZG9iagoKODM4IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0 eXBlIC9JbWFnZQovTmFtZSAvSW04MzgKL1dpZHRoIDM2Ci9IZWlnaHQgMQov Qml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2 aWNlUkdCIDExIDxmY2Y3ZjdmZmU2ZTRmZmQ4ZDFmZmE4YjBjZjY3NmZmZjY2 NjZmZjc3NzhmZDg3OGFmZjk5OTlmZmI5YjhmZmJjY2JmZmVkZWU+XQovTGVu Z3RoIDI0Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUdgkN TSvvaLZcBQTGHeWrAT1SB7kKZW5kc3RyZWFtCmVuZG9iagoKODM5IDAgb2Jq Cjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW04 MzkKL1dpZHRoIDI0Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9D b2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDkgPGU0ZTRmMmI5YmRl OTg1ODdkNmE4YTllMWQzZDNlOTdiNzljNWJiYmJkYmU1ZTZlM2ZmZTZlNGZm ZWRlZT5dCi9MZW5ndGggMjAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3Ry ZWFtCnjaY1RSNjYWdHExDauYCQANEQLiCmVuZHN0cmVhbQplbmRvYmoKCjg0 MCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05h bWUgL0ltODQwCi9XaWR0aCAzNgovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25l bnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxMiA8ZTVl NmUzOTk5OTk5NWM1ZDVkNDI0MjNmNzM3NTc3ODQ4ODhhYTlhZGIwYmJiZGJm Y2NjY2NjYzRkMmQ4ZDNkM2U5ZTRlNGYyZjBmMWYyPl0KL0xlbmd0aCAyNwov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVFZWUnENFEuvmLXn zOldq1b1AAAykwegCmVuZHN0cmVhbQplbmRvYmoKCjg0MSAwIG9iago8PAov VHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltODQxCi9X aWR0aCAzMwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JT cGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxMSA8ZmZlZGVlZTJkZGQ0YjVh NDhlY2Y2NzZmZmY2NjY2ZmY3Nzc4ZmQ4NzhhZmY5OTk5ZmZhOGIwZmZiY2Ni ZmZlNmU0ZmZkOGQxPl0KL0xlbmd0aCAyNQovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNpjVHZxCU0rr5g5a9XMGR1t1QwANvkG7gplbmRzdHJl YW0KZW5kb2JqCgo4NDIgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5 cGUgL0ltYWdlCi9OYW1lIC9JbTg0MgovV2lkdGggMjYKL0hlaWdodCAxCi9C aXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZp Y2VSR0IgNyA8ZDNkM2U5OTk5OWNjODU4N2Q2YThhOWUxYjliZGU5ZTJkZGQ0 ZmZlNmU0ZmNmN2Y3Pl0KL0xlbmd0aCAyMQovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNpjVFJSNDZxYQgNTUtLBwAPGwLvCmVuZHN0cmVhbQpl bmRvYmoKCjg0MyAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAv SW1hZ2UKL05hbWUgL0ltODQzCi9XaWR0aCA3Ci9IZWlnaHQgMQovQml0c1Bl ckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdC IDQgPGZmZWRlZWZmY2U4Y2ZlYWEzM2ZmYmE1Y2ZmZTZlND5dCi9MZW5ndGgg MTIKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYxBSdgAAAMAA dgplbmRzdHJlYW0KZW5kb2JqCgo4NDQgMCBvYmoKPDwKL1R5cGUgL1hPYmpl Y3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTg0NAovV2lkdGggMzUKL0hl aWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRl eGVkIC9EZXZpY2VSR0IgMTQgPGZmZWRlZWNjY2NjYzc4NmQ1ZTJlMmMyYTQy NDIzZjVjNWQ1ZDczNzU3Nzg0ODg4YTk5OTk5OWE5YWRiMGJiYmRiZmM0ZDJk OGU0ZTRmMmYwZjFmMmQzZDNlOT5dCi9MZW5ndGggMjcKL0ZpbHRlciAvRmxh dGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1Q2dnENS6/onLXn7N27Z849vAAAQ60J xwplbmRzdHJlYW0KZW5kb2JqCgo4NDUgMCBvYmoKPDwKL1R5cGUgL1hPYmpl Y3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTg0NQovV2lkdGggMzUKL0hl aWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRl eGVkIC9EZXZpY2VSR0IgMTQgPGZjZjdmN2YwZjFmMmU0ZjNlMmQyZTlkNGUy ZGRkNGZmYThiMGZmNjY2NmZmNzc3OGZkODc4YWZmOTk5OWZmYjliOGZmYmNj YmZmZTZlNGZmZWRlZWZmZDhkMT5dCi9MZW5ndGggMjcKL0ZpbHRlciAvRmxh dGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1Q2CU1Lr+iM2nP33u7dS2efZQAARiYI 0AplbmRzdHJlYW0KZW5kb2JqCgo4NDYgMCBvYmoKPDwKL1R5cGUgL1hPYmpl Y3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTg0NgovV2lkdGggMzUKL0hl aWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRl eGVkIC9EZXZpY2VSR0IgMTQgPGU0ZTRmMmE4YTllMTdiNzljNTg1ODdkNmI5 YmRlOWQzZDNlOWUyZGRkNGZmZDhkMWZkZTBiNWZmZWRlZWZmYmE1Y2YxOTMw NmZlYWEzM2ZmY2U4Y2ZjZjdmNz5dCi9MZW5ndGggMjYKL0ZpbHRlciAvRmxh dGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1RSMhYUdHENS6tor5y1es/ZBwArCgcG CmVuZHN0cmVhbQplbmRvYmoKCjg0NyAwIG9iago8PAovVHlwZSAvWE9iamVj dAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltODQ3Ci9XaWR0aCAzNQovSGVp Z2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4 ZWQgL0RldmljZVJHQiAxMiA8ZmZlZGVlZTJkZGQ0ODQ4ODhhNDI0MjNmMmUy YzJhNWM1ZDVkNzM3NTc3OTk5OTk5YTlhZGIwYmJiZGJmYzRkMmQ4ZTRlNGYy Y2NjY2NjPl0KL0xlbmd0aCAyNwovRmlsdGVyIC9GbGF0ZURlY29kZQo+Pgpz dHJlYW0KeNpjEDJxcTYNS1KvmLV715ozq9YIAAA1EgdHCmVuZHN0cmVhbQpl bmRvYmoKCjg0OCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAv SW1hZ2UKL05hbWUgL0ltODQ4Ci9XaWR0aCAzNQovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiAxNCA8ZmNmN2Y3ZjBmMWYyZTRmM2UyZDJlOWQ0YTRkNWFmZmZhOGIwZmY2 NjY2ZmY3Nzc4ZmQ4NzhhZmY5OTk5ZmZiOWI4ZmZiY2NiZmZlNmU0ZmZlZGVl ZmZkOGQxPl0KL0xlbmd0aCAyNwovRmlsdGVyIC9GbGF0ZURlY29kZQo+Pgpz dHJlYW0KeNpjVDJ2cU1Lr+hcffbu7d27Q99eAABDsAlmCmVuZHN0cmVhbQpl bmRvYmoKCjg0OSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAv SW1hZ2UKL05hbWUgL0ltODQ5Ci9XaWR0aCA0MAovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiAxNSA8ZmNmN2Y3YjliZGU5N2I3OWM1NjE2MmJjODU4N2Q2OTk5OWNjYThh OWUxY2NjY2NjZTJkZGQ0ZmZkOGQxZmRlMGI1ZmZlNmU0ZmZiYTVjYzI3NzA2 ZjE5MzA2ZmZjYzk5Pl0KL0xlbmd0aCAyOQovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNpjYGAQMjZyCU0TFK+YtWrVnruv/r0HADRJCHUKZW5k c3RyZWFtCmVuZG9iagoKODUwIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9T dWJ0eXBlIC9JbWFnZQovTmFtZSAvSW04NTAKL1dpZHRoIDM2Ci9IZWlnaHQg MQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAv RGV2aWNlUkdCIDE0IDxmZmVkZWVmZmU2ZTRhOWFkYjA1YzVkNWQyZTJjMmE0 MjQyM2Y3Mzc1Nzc4NDg4OGE5OTk5OTliYmJkYmZjNGQyZDhkM2QzZTllNGU0 ZjJjY2NjY2NmY2Y3Zjc+XQovTGVuZ3RoIDI2Ci9GaWx0ZXIgL0ZsYXRlRGVj b2RlCj4+CnN0cmVhbQp42mMUVHZxcTU2S6/QXH2qI71C6R4ALR0GUAplbmRz dHJlYW0KZW5kb2JqCgo4NTEgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1 YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTg1MQovV2lkdGggMzUKL0hlaWdodCAx Ci9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9E ZXZpY2VSR0IgMTIgPGZjZjdmN2U0ZjNlMmQyZTlkNGE0ZDVhZmZmYThiMGZm NjY2NmZmNzc3OGZkODc4YWZmOTk5OWZmYjliOGZmYmNjYmZmZTZlNGZmZWRl ZT5dCi9MZW5ndGggMjcKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFt CnjaYxRUMjZ2DU2rmLXnzK5Vq7z2MAAAN0UHSQplbmRzdHJlYW0KZW5kb2Jq Cgo4NTIgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdl Ci9OYW1lIC9JbTg1MgovV2lkdGggNzQKL0hlaWdodCAxCi9CaXRzUGVyQ29t cG9uZW50IDgKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMjkg PGZjZjdmN2ZmZWRlZWU0ZTRmMjg1ODdkNjYxNjJiYzdiNzljNWE4YTllMWI5 YmRlOWNjY2NjY2UyZGRkNGZkZTBiNWZmY2I4MmZmY2M5OWYxOTMwNjkyNTkw NmZmYmE1Y2MyNzcwNmZjYzU3YWZmZTZlNDg0ODg4YTQyNDIzZjJlMmMyYTVj NWQ1ZDczNzU3Nzk5OTk5OWE5YWRiMGJiYmRiZmM0ZDJkOGQzZDNlOWYwZjFm Mj5dCi9MZW5ndGggNjkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFt CnjaFcGLAoAQDABAa+WxhkJo6v9/M90pAFhwnTZE1FobY62jnZmJfAgRyB+n Uikll8s1lVJrazn3W8Z4hkj/yfsBZ74EGwplbmRzdHJlYW0KZW5kb2JqCgo4 NTMgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9O YW1lIC9JbTg1MwovV2lkdGggMzUKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9u ZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMTMgPGZj ZjdmN2U0ZjNlMmQyZTlkNGE0ZDVhZjdjYzA4NGZmOTk5OWZmNjY2NmZkODc4 YWZmYThiMGZmYmNjYmZmZTZlNGZmYjliOGZmZDhkMWZmZWRlZT5dCi9MZW5n dGggMjcKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYxRUUjYx TUsv7Vy1auXM2XvWMgAANHYHJgplbmRzdHJlYW0KZW5kb2JqCgo4NTQgMCBv YmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9J bTg1NAovV2lkdGggOQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgov Q29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDxmY2Y3ZjdmZmVk ZWVmZmU2ZTQ+XQovTGVuZ3RoIDExCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+ CnN0cmVhbQp42mOMdAAAAPgAmwplbmRzdHJlYW0KZW5kb2JqCgo4NTUgMCBv YmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9J bTg1NQovV2lkdGggNzMKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDgK L0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMzIgPGZjZjdmN2Zm ZWRlZWZmZTZlNGZmZDhkMWE4YTllMTYxNjJiYzRjNGNhNTdiNzljNTg1ODdk Njk5OTljY2I5YmRlOWJiYmJkYmJiYmRiZmUyZGRkNGZmY2U4Y2ZmYmE1Y2Zm Y2I4MmZmY2M5OWZlYWEzMzkyNTkwNmYxOTMwNmZjYzU3YWMyNzcwNjczNzU3 NzQyNDIzZjJlMmMyYTVjNWQ1ZDg0ODg4YTk5OTk5OWE5YWRiMGM0ZDJkOGNj Y2NjY2U1ZTZlMz5dCi9MZW5ndGggNjkKL0ZpbHRlciAvRmxhdGVEZWNvZGUK Pj4Kc3RyZWFtCnjaNcpJAkAwDABAqiGItmnQ1fL/V+rFnKfrlRo0wAgwIeKs 9bLSZqxzhtmL7IeXk1tqKMSUUow5h1JqvYju3/N+eRIEmwplbmRzdHJlYW0K ZW5kb2JqCgo4NTYgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTg1NgovV2lkdGggMzQKL0hlaWdodCAxCi9CaXRz UGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VS R0IgMTUgPGYwZjFmMmU0ZjNlMmQyZTlkNGE0ZDVhZjdjYzA4NDNmYTE0NGZk ODc4YWZmNjY2NmZmNzc3OGZmOTk5OWZmYThiMGZmYmNjYmZmZDhkMWZmZTZl NGZmZWRlZWZjZjdmNz5dCi9MZW5ndGggMjYKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjaYxRUMnZ1q2ibtefMmTO7Vt97DwA4XQjdCmVuZHN0 cmVhbQplbmRvYmoKCjg1NyAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3Vi dHlwZSAvSW1hZ2UKL05hbWUgL0ltODU3Ci9XaWR0aCAxMAovSGVpZ2h0IDEK L0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rl dmljZVJHQiAzIDxmY2Y3ZjdmZmVkZWVmZmQ4ZDFmZmU2ZTQ+XQovTGVuZ3Ro IDExCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mONZgAAAMgA YQplbmRzdHJlYW0KZW5kb2JqCgo4NTggMCBvYmoKPDwKL1R5cGUgL1hPYmpl Y3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTg1OAovV2lkdGggNzcKL0hl aWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDgKL0NvbG9yU3BhY2UgWy9JbmRl eGVkIC9EZXZpY2VSR0IgMzEgPGZjZjdmN2ZmZTZlNGZmZDhkMWNjY2NjYzdi NzljNTYxNjJiYzRjNGNhNTg1ODdkNjk5OTljY2E4YTllMWJiYmJkYmJiYmRi ZmZmYmE1Y2ZlYWEzM2ZjYzU3YWZmY2I4MmMyNzcwNjkyNTkwNmYxOTMwNmZk ZTBiNWUyZGRkNGI1YTQ4ZTVjNWQ1ZDJlMmMyYTQyNDIzZjczNzU3Nzg0ODg4 YTk5OTk5OWE5YWRiMGM0ZDJkOGQzZDNlOWU1ZTZlMz5dCi9MZW5ndGggNzMK L0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaHczbFoAQEEDRcU8j dBui9P9/Se11ng8AAONcSKW1UlIaM1k7o3CL894HF+M62sLOPsdJKaWcia5S ar0Rn19r4h2jDnUFBBYKZW5kc3RyZWFtCmVuZG9iagoKODU5IDAgb2JqCjw8 Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW04NTkK L1dpZHRoIDQzCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA4Ci9Db2xv clNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDE2IDxmMGYxZjJhNGQ1YWY3 Y2MwODQ2NWIzNmMzZmExNDRkMmU5ZDRmY2Y3ZjdlNGYzZTIyYTdmMmFiNWE0 OGVmZDg3OGFmZjc3NzhmZjk5OTlmZmE4YjBmZmI5YjhmZmQ4ZDFmZmVkZWU+ XQovTGVuZ3RoIDQ1Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4 2g3EARIAIAQFUX2RULn/abPzZmkA4MmiSrSkg9n2CM9zWi/d76vSDxUWAVgK ZW5kc3RyZWFtCmVuZG9iagoKODYwIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0 Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW04NjAKL1dpZHRoIDkyCi9IZWln aHQgMQovQml0c1BlckNvbXBvbmVudCA4Ci9Db2xvclNwYWNlIFsvSW5kZXhl ZCAvRGV2aWNlUkdCIDI4IDxmY2Y3ZjdmZmVkZWVmZmU2ZTRmZmQ4ZDFmZmI5 YjhhOGE5ZTE2MTYyYmM3Yjc5YzU4NTg3ZDY5OTk5Y2NiOWJkZTljY2NjY2Nm MTkzMDZjMjc3MDZmZWFhMzNmZmJhNWNmY2M1N2FmZGUwYjViNWE0OGU1YzVk NWQyZTJjMmE0MjQyM2Y3Mzc1Nzc4NDg4OGE5OTk5OTlhOWFkYjBiYmJkYmZm MGYxZjJlNGYzZTI+XQovTGVuZ3RoIDcxCi9GaWx0ZXIgL0ZsYXRlRGVjb2Rl Cj4+CnN0cmVhbQp42h3BiQJAIAwA0LUkOgxLuv7/O03vAYBC1AhCL6hQC7P+ rN12Y5zzPsSDxEkURIyE03Uzp/Qw5/yWUpuoU+tj9A4fgaIEaAplbmRzdHJl YW0KZW5kb2JqCgo4NjEgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5 cGUgL0ltYWdlCi9OYW1lIC9JbTg2MQovV2lkdGggMzIKL0hlaWdodCAxCi9C aXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZp Y2VSR0IgMTUgPGYwZjFmMmU0ZjNlMmQyZTlkNGE0ZDVhZjY1YjM2YzJhN2Yy YTNmYTE0NGZmOTk5OWZmNzc3OGZkODc4YWVjNTM1MWZmNjY2NmZmYmNjYmZm ZTZlNGZmZWRlZWZjZjdmNz5dCi9MZW5ndGggMjUKL0ZpbHRlciAvRmxhdGVE ZWNvZGUKPj4Kc3RyZWFtCnjaYxRUUnZN75hesWr17h019/4DAC4oB7wKZW5k c3RyZWFtCmVuZG9iagoKODYyIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9T dWJ0eXBlIC9JbWFnZQovTmFtZSAvSW04NjIKL1dpZHRoIDkzCi9IZWlnaHQg MQovQml0c1BlckNvbXBvbmVudCA4Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAv RGV2aWNlUkdCIDM0IDxmZmVkZWVmZmQ4ZDFmZmU2ZTRmZmE4YjBmZDg3OGFm Zjk5OTlmZmI5Yjg5OTk5Y2M2MTYyYmM3Yjc5YzU4NTg3ZDZhOGE5ZTFiOWJk ZTljY2NjY2NmZmNjOTljMjc3MDZmZWFhMzNmZmJhNWNmZmNiODJmY2M1N2Fm ZmNlOGM5MjU5MDZlMmRkZDRiNWE0OGU1YzVkNWQ0MjQyM2Y3Mzc1Nzc4NDg4 OGE5OTk5OTlhOWFkYjBlNWU2ZTNkMmU5ZDRlNGYzZTJmMGYxZjJmY2Y3Zjc+ XQovTGVuZ3RoIDgwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4 2h3GixJAIBBA0TaSFKXQS4n//0jLmbkzlxAEQLGuZxQYGwCAj0iIiUup1Lxo bdaPtdZtTu8G6O/wPsQYQ0g5n6WUnBBurVdr7X5enycFXQplbmRzdHJlYW0K ZW5kb2JqCgo4NjMgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTg2MwovV2lkdGggMzEKL0hlaWdodCAxCi9CaXRz UGVyQ29tcG9uZW50IDgKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VS R0IgMTYgPGYwZjFmMmU0ZjNlMmQyZTlkNGM0ZDJkOGE0ZDVhZjdjYzA4NDNm YTE0NDhjYTk5M2ZkODc4YWZmOTk5OWZmNzc3OGZmNjY2NmZmYThiMGZmYmNj YmZmZTZlNGZmZWRlZWZjZjdmNz5dCi9MZW5ndGggMzkKL0ZpbHRlciAvRmxh dGVEZWNvZGUKPj4Kc3RyZWFtCnjaY2BkZGRiYmJmYWVj5+Dg4OTk4ubm5uLi 5OTh5eMXEAAACnAA9AplbmRzdHJlYW0KZW5kb2JqCgo4NjQgMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTg2NAov V2lkdGggOTUKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDgKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMzYgPGZmZWRlZWZmZTZlNGZm YmNjYmZmZDhkMWZmYThiMGZkODc4YWZmOTk5OWZmYjliOGZjZjdmN2ZmNzc3 OGNjY2NjYzdiNzljNTYxNjJiYzg1ODdkNmE4YTllMWI5YmRlOWQzZDNlOWZm Y2M5OWMyNzcwNmYxOTMwNmZlYWEzM2ZmYmE1Y2ZjYzU3YWZmY2I4MmZkZTBi NWZmY2U4Y2I1YTQ4ZTc4NmQ1ZTQyNDIzZjVjNWQ1ZDczNzU3Nzg0ODg4YTk5 OTk5OWE5YWRiMGU0ZjNlMmQyZTlkNGYwZjFmMj5dCi9MZW5ndGggODYKL0Zp bHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaFcvZAkAgEADAzZaiyFJu Xfz/N2LeBwCAVYhciFpIxXjTCImtNsZo3XV9b+1A4zi5j5/nhVbybkP2NUAk 2o/zvK4QYko5pxhiTLkt96+UR73RYQZOCmVuZHN0cmVhbQplbmRvYmoKCjg2 NSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05h bWUgL0ltODY1Ci9XaWR0aCAzOAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25l bnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxNSA8ZjBm MWYyYTRkNWFmMmE3ZjJhNjViMzZjZDJlOWQ0ZmNmN2Y3ZTRmM2UyM2ZhMTQ0 ZmY5OTk5ZmY3Nzc4ZmQ4NzhhZmZhOGIwZmZiOWI4ZmZkOGQxZmZlNmU0ZmZl ZGVlPl0KL0xlbmd0aCAyNwovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl YW0KeNpjVDIJSEtxcRSumNXRvXv3mXtfQwE/+giZCmVuZHN0cmVhbQplbmRv YmoKCjg2NiAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1h Z2UKL05hbWUgL0ltODY2Ci9XaWR0aCA5OQovSGVpZ2h0IDEKL0JpdHNQZXJD b21wb25lbnQgOAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAz NCA8ZmNmN2Y3ZmZlNmU0ZmZiY2NiZmY5OTk5ZWM1MzUxZmY2NjY2ZmQ4Nzhh ZmZkOGQxZmZlZGVlYTlhZGIwN2I3OWM1NjE2MmJjODU4N2Q2YThhOWUxYjli ZGU5ZDNkM2U5ZmZjYzk5YzI3NzA2ZjE5MzA2ZmVhYTMzZmZiYTVjZmNjNTdh ZmZjZThjZmRlMGI1YjVhNDhlNzg2ZDVlNWM1ZDVkNzM3NTc3ODQ4ODhhOTk5 OTk5YmJiZGJmZTVlNmUzZDJlOWQ0ZTRmM2UyZjBmMWYyPl0KL0xlbmd0aCA4 NAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNotwQcSgCAMADAs QmtdLEVx4v8fKXeaiKoAAFkrpTUSoa6VBGiYW+au6/thGI21zjnvfQhhmk0s KhKCEGM0y7qmlLZtP47mc173L+f8iBfUNwXrCmVuZHN0cmVhbQplbmRvYmoK Cjg2NyAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UK L05hbWUgL0ltODY3Ci9XaWR0aCAzOQovSGVpZ2h0IDEKL0JpdHNQZXJDb21w b25lbnQgOAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxNiA8 ZjBmMWYyYzRkMmQ4N2NjMDg0M2ZhMTQ0MmE3ZjJhZTRmM2UyZmNmN2Y3ZDJl OWQ0YTRkNWFmYjVhNDhlZmQ4NzhhZmY5OTk5ZmZhOGIwZmZiY2NiZmZkOGQx ZmZlNmU0ZmZlZGVlPl0KL0xlbmd0aCA0MQovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNoNwQkCACAEADB3ReH/r80GSCxCagCqa+AmPu4RccfL rO62DxBEASwKZW5kc3RyZWFtCmVuZG9iagoKODY4IDAgb2JqCjw8Ci9UeXBl IC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW04NjgKL1dpZHRo IDU4Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA4Ci9Db2xvclNwYWNl IFsvSW5kZXhlZCAvRGV2aWNlUkdCIDI1IDxmY2Y3ZjdmZmU2ZTRmZmQ4ZDFm ZmE4YjBmZmI5YjhmZDg3OGFmZjY2NjZlYzUzNTFmZjc3NzhmZmJjY2JiNWE0 OGU5OTk5Y2M4NTg3ZDY3Yjc5YzVhOGE5ZTFiOWJkZTljY2NjY2NmMTkzMDZj Mjc3MDZmZWFhMzNmZmJhNWNmY2M1N2FmZmNlOGNmZmNjOTlmZGUwYjVmZmVk ZWU+XQovTGVuZ3RoIDU3Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVh bQp42g3BiwLAEAgAQCphhLxm//+jc2csACAROmbPZMlxwHg9KYtITqXU2rR3 VR1jXmu/58BnfjTEAosKZW5kc3RyZWFtCmVuZG9iagoKODY5IDAgb2JqCjw8 Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW04NjkK L1dpZHRoIDgxCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA4Ci9Db2xv clNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDI1IDxmZmU2ZTRmZmQ4ZDFm ZmNjOTliNWE0OGU5OTk5OTk4NDg4OGFhOWFkYjBiYmJkYmZjY2NjY2NkMmU5 ZDRhNGQ1YWZjNGQyZDhlNGYzZTI3Y2MwODQzZmExNDQyYTdmMmE2NWIzNmNm MGYxZjJmZDg3OGFmZjc3NzhmZjk5OTlmZmE4YjBmZmI5YjhmZmJjY2JmZmVk ZWVmY2Y3Zjc+XQovTGVuZ3RoIDY2Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+ CnN0cmVhbQp42iXIWxaAIAgAUU3KgArCHrj/jYan+zeTcphKAZgDACx1WJGI GX/bwPshIopniByfSNVaM7vu580puXvvH2hCA20KZW5kc3RyZWFtCmVuZG9i agoKODcwIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFn ZQovTmFtZSAvSW04NzAKL1dpZHRoIDU3Ci9IZWlnaHQgMQovQml0c1BlckNv bXBvbmVudCA4Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIz IDxmY2Y3ZjdmZmU2ZTRmZmQ4ZDFmZmE4YjBmZDg3OGFmZmI5YjhmZjc3Nzhl YzUzNTFmZjY2NjZmZmJjY2JmZjk5OTliOWJkZTlhOGE5ZTE5OTk5Y2M4NTg3 ZDZiYmJkYmZmZWFhMzNjMjc3MDZmMTkzMDZmZmJhNWNmY2M1N2FmZmNlOGNm ZmNjOTlmZGUwYjU+XQovTGVuZ3RoIDU3Ci9GaWx0ZXIgL0ZsYXRlRGVjb2Rl Cj4+CnN0cmVhbQp42g3BAQKAIAgDQNsSJdFIrP7/07pLG8A9kxQpQtYiGVDV g82sj9HN2unXb053j4h1Py/SBy8HAkQKZW5kc3RyZWFtCmVuZG9iagoKODcx IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFt ZSAvSW04NzEKL1dpZHRoIDgwCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVu dCA4Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDI0IDxmZmVk ZWVmZmU2ZTRmZmQ4ZDFmZGUwYjVmZmNlOGNlMmRkZDRjY2NjY2NiYmJkYmZl NWU2ZTM3Y2MwODRhNGQ1YWZjNGQyZDhkMmU5ZDQzZmExNDQyYTdmMmFmMGYx ZjJlNGYzZTI2NWIzNmNmZjk5OTlmZjY2NjZmZjc3NzhmZmE4YjBmZmI5Yjhm ZmJjY2JmY2Y3Zjc+XQovTGVuZ3RoIDYzCi9GaWx0ZXIgL0ZsYXRlRGVjb2Rl Cj4+CnN0cmVhbQp42h3BCQKAIAgEQKWkwEXNLv//0oyZEIloWRPz9mNOOzvR KTtAVayUYoLqWgOQVQ/r59Xv5yWKYRrjA2ltAx4KZW5kc3RyZWFtCmVuZG9i agoKODcyIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFn ZQovTmFtZSAvSW04NzIKL1dpZHRoIDU2Ci9IZWlnaHQgMQovQml0c1BlckNv bXBvbmVudCA4Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIx IDxmZmU2ZTRmZmQ4ZDFmZjk5OTlmZjc3NzhmZDg3OGFmZmE4YjBmZjY2NjZm ZmJjY2JmZmI5YjhlNGU0ZjJkM2QzZTliOWJkZTljY2NjY2NmZmJhNWNjMjc3 MDY5MjU5MDZmMTkzMDZmZWFhMzNmY2M1N2FmZmNlOGNmZmNjOTlmY2Y3Zjc+ XQovTGVuZ3RoIDUwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4 2h3BCRIAEAwEMF1n0br//1VGYohg8TmPEBDpicmDmXP5qmhrqr2PR2SuTecC ItwB4wplbmRzdHJlYW0KZW5kb2JqCgo4NzMgMCBvYmoKPDwKL1R5cGUgL1hP YmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTg3MwovV2lkdGggNzgK L0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9J bmRleGVkIC9EZXZpY2VSR0IgMTUgPGZmZWRlZWZmZDhkMWZkZTBiNWZmZTZl NGU1ZTZlM2YwZjFmMmUyZGRkNGNjY2NjY2E0ZDVhZjdjYzA4NDY1YjM2YzNm YTE0NDJhN2YyYWU0ZjNlMmQyZTlkNGZjZjdmNz5dCi9MZW5ndGggNDUKL0Zp bHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY2BUMnEBgtD08ooZHUDQ uXrPmZ29oaGhse/evehcIShobMDA/x8AMyQQsQplbmRzdHJlYW0KZW5kb2Jq Cgo4NzQgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdl Ci9OYW1lIC9JbTg3NAovV2lkdGggMjc0Ci9IZWlnaHQgMQovQml0c1BlckNv bXBvbmVudCA4Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDI4 IDxmZWJmMDBkNDAwMjljZjY3NmZlYzUzNTFjMjc3MDY5MjU5MDZmMTkzMDZm ZWFhMzNmZmJhNWNmY2M1N2FmZmNjOTlmZmQ4ZDFmZmVkZWVmY2Y3ZjdmZGUw YjVmZmNlOGNmZmU2ZTRmZjc3NzhjMTQwNDBjZjBiNjg3Y2MwODQzZmExNDRh NGQ1YWY2NWIzNmMyYTdmMmFkMmU5ZDRlNGYzZTI4NDg4OGFkZTEyNjY+XQov TGVuZ3RoIDc5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42q3K 2xJAIBAA0HTZUlG0NuH/v5OhMR48dp4PYy11rXAhpFJKSgDQWhvTW+cHP4bg YnTWTvPzUsVxQaQqr7dMZXuVCxHm/fhIf07bcQjHCmVuZHN0cmVhbQplbmRv YmoKCjg3NSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1h Z2UKL05hbWUgL0ltODc1Ci9XaWR0aCAyNzQKL0hlaWdodCAxCi9CaXRzUGVy Q29tcG9uZW50IDgKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0Ig MjcgPGZlYmYwMGZmY2MwMGQ0MDAyOWMxNDA0MGMyNzcwNjkyNTkwNmYxOTMw NmZlYWEzM2ZmYmE1Y2ZjYzU3YWZmY2M5OWZmZDhkMWZmZWRlZWZmZTZlNGZk ZTBiNWZmOTk5OWVjNTM1MWNmMGI2OGNmNjc2ZjNmYTE0NDJhN2YyYTdjYzA4 NGE0ZDVhZjY1YjM2Y2QyZTlkNGU0ZjNlMmU0ZTRmMmRlMTI2Nj5dCi9MZW5n dGggODAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjarcpJEoAg DERRVEwkDoghgnr/expLXLrj7X51G1NR09bT2V5ZCwCIODgap9mhBtFCfi2v UGwcWWR/CTNHlSQf6nxkpUtK1yf8uAHlHghXCmVuZHN0cmVhbQplbmRvYmoK Cjg3NiAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UK L05hbWUgL0ltODc2Ci9XaWR0aCAyMAovSGVpZ2h0IDEKL0JpdHNQZXJDb21w b25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA3IDxm Y2Y3ZjdmZmVkZWVmZmU2ZTRmZmQ4ZDFmZmJjY2JmZmI5YjhmZmE4YjBmZjk5 OTk+XQovTGVuZ3RoIDE4Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVh bQp42mNgEBQycU0vD2IAAAdGAc0KZW5kc3RyZWFtCmVuZG9iagoKODc3IDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW04NzcKL1dpZHRoIDgKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIK L0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8ZjBmMWYyZmNm N2Y3Pl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl YW0KeNpjYAUAAAcABgplbmRzdHJlYW0KZW5kb2JqCgo4NzggMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTg3OAov V2lkdGggMTIKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNiA8ZTJkZGQ0YTlhZGIwYmJi ZGJmZTVlNmUzY2NjY2NjOTk5OTk5ODQ4ODhhPl0KL0xlbmd0aCAxNAovRmls dGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVDBgUU0CAAIkAN0KZW5k c3RyZWFtCmVuZG9iagoKODc5IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9T dWJ0eXBlIC9JbWFnZQovTmFtZSAvSW04NzkKL1dpZHRoIDIxCi9IZWlnaHQg MQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAv RGV2aWNlUkdCIDYgPGZjZjdmN2ZmZDhkMWZmOTk5OWZmYThiMGZmYmNjYmZk ODc4YWZmZTZlND5dCi9MZW5ndGggMTkKL0ZpbHRlciAvRmxhdGVEZWNvZGUK Pj4Kc3RyZWFtCnjaY2BUMhF0MVYNTmMAAAhOAb4KZW5kc3RyZWFtCmVuZG9i agoKODgwIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFn ZQovTmFtZSAvSW04ODAKL1dpZHRoIDUKL0hlaWdodCAxCi9CaXRzUGVyQ29t cG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8 ZmNmN2Y3ZjBmMWYyPl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNpjZQAAAAwABgplbmRzdHJlYW0KZW5kb2JqCgo4ODEg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTg4MQovV2lkdGggMzgKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50 IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMTEgPGZjZjdm N2ZmZWRlZWZmZDhkMWZmZTZlNGZmNzc3OGVjNTM1MWZmNjY2NmZmOTk5OWZm YmNjYmZmYjliOGZmYThiMGZkODc4YT5dCi9MZW5ndGggMjcKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYxQUFFJSNmBgYFAJK9LoXLXFcyIA GocEgAplbmRzdHJlYW0KZW5kb2JqCgo4ODIgMCBvYmoKPDwKL1R5cGUgL1hP YmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTg4MgovV2lkdGggMzkK L0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9J bmRleGVkIC9EZXZpY2VSR0IgMTEgPGZjZjdmN2ZmZWRlZWZmZTZlNGZmZDhk MWZmYjliOGZmYmNjYmZmNzc3OGMxNDA0MGZmNjY2NmZmYThiMGZmOTk5OWZk ODc4YT5dCi9MZW5ndGggMjgKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3Ry ZWFtCnjaYxRSMnE1NlJgYFCrmGwaMnNZ92YGAClSBWsKZW5kc3RyZWFtCmVu ZG9iagoKODgzIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9J bWFnZQovTmFtZSAvSW04ODMKL1dpZHRoIDE1Ci9IZWlnaHQgMQovQml0c1Bl ckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdC IDkgPGZjZjdmN2JiYmRiZjVjNWQ1ZDJlMmMyYTczNzU3N2NjY2NjY2U1ZTZl M2UyZGRkNDg0ODg4YTc4NmQ1ZT5dCi9MZW5ndGggMTYKL0ZpbHRlciAvRmxh dGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1R2TS+VmJkAAAhUAlcKZW5kc3RyZWFt CmVuZG9iagoKODg0IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBl IC9JbWFnZQovTmFtZSAvSW04ODQKL1dpZHRoIDM5Ci9IZWlnaHQgMQovQml0 c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNl UkdCIDEwIDxmY2Y3ZjdmZmVkZWVmZmU2ZTRmZmI5YjhmZmE4YjBmZmJjY2Jm ZmQ4ZDFlYzUzNTFmZjc3NzhmZjk5OTlmZjY2NjY+XQovTGVuZ3RoIDI4Ci9G aWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUUjIxNk1LEhQ0rwgL DTaZuWqJAgAvBwW0CmVuZHN0cmVhbQplbmRvYmoKCjg4NSAwIG9iago8PAov VHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltODg1Ci9X aWR0aCAzNwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JT cGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxMiA8ZmNmN2Y3ZjBmMWYyZTVl NmUzYmJiZGJmY2NjY2NjZTJkZGQ0NzM3NTc3NDI0MjNmODQ4ODhhOTk5OTk5 MmUyYzJhYTlhZGIwNWM1ZDVkPl0KL0xlbmd0aCAyNwovRmlsdGVyIC9GbGF0 ZURlY29kZQo+PgpzdHJlYW0KeNpjYFQ2cXE1q1AQFNRcvkkpxLlnAwAnCwVJ CmVuZHN0cmVhbQplbmRvYmoKCjg4NiAwIG9iago8PAovVHlwZSAvWE9iamVj dAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltODg2Ci9XaWR0aCA0MQovSGVp Z2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4 ZWQgL0RldmljZVJHQiAxMiA8ZmNmN2Y3ZmZlZGVlZmZlNmU0ZmZkOGQxZmY5 OTk5ZmZhOGIwZmZiOWI4ZmY3Nzc4YzE0MDQwZWM1MzUxZmZiY2NiZmQ4Nzhh ZmY2NjY2Pl0KL0xlbmd0aCAyOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+Pgpz dHJlYW0KeNpjVFIyCQ1LSzM2Nu90XrVqWaj3mc0MAEMZB3MKZW5kc3RyZWFt CmVuZG9iagoKODg3IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBl IC9JbWFnZQovTmFtZSAvSW04ODcKL1dpZHRoIDgKL0hlaWdodCAxCi9CaXRz UGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VS R0IgNCA8ZmNmN2Y3ZDNkM2U5ZjBmMWYyYjliZGU5YThhOWUxPl0KL0xlbmd0 aCAxMgovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjEFR2AgAA vwB3CmVuZHN0cmVhbQplbmRvYmoKCjg4OCAwIG9iago8PAovVHlwZSAvWE9i amVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltODg4Ci9XaWR0aCAzNwov SGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0lu ZGV4ZWQgL0RldmljZVJHQiAxMCA8ZmNmN2Y3ZTVlNmUzYmJiZGJmODQ4ODhh Y2NjY2NjNDI0MjNmYTlhZGIwNWM1ZDVkMmUyYzJhZTJkZGQ0NzM3NTc3Pl0K L0xlbmd0aCAyNwovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpj EDJSUlEOTRQUFKooEZw5xW0VAwAkeASyCmVuZHN0cmVhbQplbmRvYmoKCjg4 OSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05h bWUgL0ltODg5Ci9XaWR0aCA0MQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25l bnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxMiA8ZmNm N2Y3ZmZlZGVlZmZlNmU0ZmZhOGIwZmY5OTk5ZmZiOWI4ZmZkOGQxZWM1MzUx YzE0MDQwZmY2NjY2ZmZiY2NiZmQ4NzhhZmY3Nzc4Pl0KL0xlbmd0aCAyOQov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVFIycTE2Ng4Nc++M WrVqqbH3makMAD3yBwQKZW5kc3RyZWFtCmVuZG9iagoKODkwIDAgb2JqCjw8 Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW04OTAK L1dpZHRoIDM3Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xv clNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEyIDxmY2Y3ZjdlNWU2ZTM5 OTk5OTk1YzVkNWQ4NDg4OGFhOWFkYjBiYmJkYmY3Mzc1NzcyZTJjMmFjY2Nj Y2NlMmRkZDQ0MjQyM2ZkM2QzZTk+XQovTGVuZ3RoIDI3Ci9GaWx0ZXIgL0Zs YXRlRGVjb2RlCj4+CnN0cmVhbQp42mMQMglLC2/PXLVq0Q5FQamT01QEAEEf BtcKZW5kc3RyZWFtCmVuZG9iagoKODkxIDAgb2JqCjw8Ci9UeXBlIC9YT2Jq ZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW04OTEKL1dpZHRoIDQwCi9I ZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5k ZXhlZCAvRGV2aWNlUkdCIDEwIDxmZmVkZWVmZmU2ZTRmZmQ4ZDFmZjk5OTlm ZmE4YjBmZmI5YjhmZjY2NjZjMTQwNDBmZDg3OGFmZmJjY2JmZjc3Nzg+XQov TGVuZ3RoIDI2Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNU UjYGAdew8taZM2dOce5a5gAAN/0G7wplbmRzdHJlYW0KZW5kb2JqCgo4OTIg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTg5MgovV2lkdGggMzcKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50 IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMTQgPGZjZjdm N2U1ZTZlMzk5OTk5OTQyNDIzZjVjNWQ1ZGE5YWRiMDg0ODg4YTczNzU3N2Ji YmRiZmNjY2NjY2UyZGRkNDJlMmMyYWU0ZTRmMmQzZDNlOWM0ZDJkOD5dCi9M ZW5ndGggMjgKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYxAy UVUNK+qcOatly5wzp+7NCJoAAER9CNcKZW5kc3RyZWFtCmVuZG9iagoKODkz IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFt ZSAvSW04OTMKL1dpZHRoIDQwCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVu dCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDExIDxmZmVk ZWVmZmU2ZTRmZmQ4ZDFmZmJjY2JmZDg3OGFmZjk5OTlmZmE4YjBjMTQwNDBl YzUzNTFmZmI5YjhmZjc3NzhmZjY2NjY+XQovTGVuZ3RoIDI4Ci9GaWx0ZXIg L0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUMnFxcXENDXOviDQ2njkt1Wu1 IwA3nQZcCmVuZHN0cmVhbQplbmRvYmoKCjg5NCAwIG9iago8PAovVHlwZSAv WE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltODk0Ci9XaWR0aCAx NgovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiA2IDxmMGYxZjJlNGU0ZjJkM2QzZTliOWJk ZTk4NTg3ZDY3Yjc5YzU5OTk5Y2M+XQovTGVuZ3RoIDE2Ci9GaWx0ZXIgL0Zs YXRlRGVjb2RlCj4+CnN0cmVhbQp42mMQFBIUNHZNAgADCQEgCmVuZHN0cmVh bQplbmRvYmoKCjg5NSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlw ZSAvSW1hZ2UKL05hbWUgL0ltODk1Ci9XaWR0aCAzNQovSGVpZ2h0IDEKL0Jp dHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rldmlj ZVJHQiAxMSA8ZTVlNmUzODQ4ODhhNWM1ZDVkOTk5OTk5YTlhZGIwYmJiZGJm Y2NjY2NjNDI0MjNmMmUyYzJhZTRlNGYyZDNkM2U5YzRkMmQ4Pl0KL0xlbmd0 aCAyNgovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVBI2NnEJ TUsTb+ScOWt1qnMAACmYBXoKZW5kc3RyZWFtCmVuZG9iagoKODk2IDAgb2Jq Cjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW04 OTYKL1dpZHRoIDQwCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9D b2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEwIDxmZmVkZWVmZmU2 ZTRmZmQ4ZDFmZmE4YjBmZDg3OGFmZjk5OTllYzUzNTFjMTQwNDBmZjY2NjZm ZmI5YjhmZjc3Nzg+XQovTGVuZ3RoIDI0Ci9GaWx0ZXIgL0ZsYXRlRGVjb2Rl Cj4+CnN0cmVhbQp42mNUMnEBAtfg9IqZIGDstWIRAD/XB6MKZW5kc3RyZWFt CmVuZG9iagoKODk3IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBl IC9JbWFnZQovTmFtZSAvSW04OTcKL1dpZHRoIDM1Ci9IZWlnaHQgMQovQml0 c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNl UkdCIDEwIDxjY2NjY2M3Mzc1Nzc4NDg4OGE5OTk5OTlhOWFkYjBiYmJkYmY1 YzVkNWQyZTJjMmE0MjQyM2ZlNGU0ZjJkM2QzZTk+XQovTGVuZ3RoIDI2Ci9G aWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMUUlJSdnENYE1vmTlz 1irWkAAAJ+UFYwplbmRzdHJlYW0KZW5kb2JqCgo4OTggMCBvYmoKPDwKL1R5 cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTg5OAovV2lk dGggNTAKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3Bh Y2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMTMgPGZjZjdmN2YwZjFmMmZmZTZl NGZmZDhkMWZmOTk5OWNmNjc2ZmZmNzc3OGZkODc4YWVjNTM1MWMxNDA0MGZm YjliOGZmYThiMGZmNjY2NmZmYmNjYj5dCi9MZW5ndGggMzIKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY2AQFGBQNgkrS0tLK/GYWbUKCFZv STtzAQBbsApPCmVuZHN0cmVhbQplbmRvYmoKCjg5OSAwIG9iago8PAovVHlw ZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltODk5Ci9XaWR0 aCAzMAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFj ZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxMCA8ZjBmMWYyZTRlNGYyYjliZGU5 N2I3OWM1YThhOWUxZDNkM2U5ODU4N2Q2NjE2MmJjNGM0Y2E1ZmNmN2Y3ZmZl ZGVlPl0KL0xlbmd0aCAyMwovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl YW0KeNpjFDIJVStvd5zgbGwWwLASAB27BDcKZW5kc3RyZWFtCmVuZG9iagoK OTAwIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQov TmFtZSAvSW05MDAKL1dpZHRoIDM1Ci9IZWlnaHQgMQovQml0c1BlckNvbXBv bmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDggPGNj Y2NjYzczNzU3Nzg0ODg4YTk5OTk5OWE5YWRiMGJiYmRiZjQyNDIzZmU0ZTRm MmQzZDNlOT5dCi9MZW5ndGggMjYKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4K c3RyZWFtCnjaYxQUUlI2cQ0NVRMoLy/vYA0NAAAggwRaCmVuZHN0cmVhbQpl bmRvYmoKCjkwMSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAv SW1hZ2UKL05hbWUgL0ltOTAxCi9XaWR0aCA1MAovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiAxMSA8ZmNmN2Y3ZjBmMWYyZmZlNmU0ZmZkOGQxZmQ4NzhhY2Y2NzZmZmY2 NjY2ZmY3Nzc4ZmY5OTk5ZmZhOGIwZmZiOWI4ZmZiY2NiPl0KL0xlbmd0aCAz MwovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjYBAUZFAyCXUN Sy93aU/rXL179+6dHS7lCwBXCQl5CmVuZHN0cmVhbQplbmRvYmoKCjkwMiAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltOTAyCi9XaWR0aCAyOQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg NAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxMCA8ZmNmN2Y3 ZTRlNGYyYjliZGU5NjE2MmJjODU4N2Q2YThhOWUxN2I3OWM1ZjBmMWYyYzRk MmQ4ZTVlNmUzZmZlZGVlPl0KL0xlbmd0aCAyMwovRmlsdGVyIC9GbGF0ZURl Y29kZQo+PgpzdHJlYW0KeNpjFDJRUgp1TipXM/aYxcAAABebAzgKZW5kc3Ry ZWFtCmVuZG9iagoKOTAzIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0 eXBlIC9JbWFnZQovTmFtZSAvSW05MDMKL1dpZHRoIDM1Ci9IZWlnaHQgMQov Qml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2 aWNlUkdCIDkgPGUyZGRkNDg0ODg4YTVjNWQ1ZDczNzU3Nzk5OTk5OWE5YWRi MGJiYmRiZmQzZDNlOWU0ZTRmMmNjY2NjYz5dCi9MZW5ndGggMjYKL0ZpbHRl ciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1QyNhZ0CU1LS03v6GivnDmN AQAuegYLCmVuZHN0cmVhbQplbmRvYmoKCjkwNCAwIG9iago8PAovVHlwZSAv WE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltOTA0Ci9XaWR0aCA0 OAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiAxMiA8ZmNmN2Y3ZjBmMWYyZTVlNmUzZmZl ZGVlZTJkZGQ0ZmY5OTk5ZmQ4NzhhY2Y2NzZmZmY2NjY2ZmY3Nzc4ZmZhOGIw ZmZiOWI4ZmZiY2NiPl0KL0xlbmd0aCAzMwovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNpjYFQSMHJNS6/omDktNXTV7jNnzpxamjbzAABq6QtY CmVuZHN0cmVhbQplbmRvYmoKCjkwNSAwIG9iago8PAovVHlwZSAvWE9iamVj dAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltOTA1Ci9XaWR0aCAzNgovSGVp Z2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4 ZWQgL0RldmljZVJHQiAxMiA8ZmZlZGVlZTJkZGQ0ODQ4ODhhNWM1ZDVkNzM3 NTc3OTk5OTk5YTlhZGIwYmJiZGJmY2NjY2NjYzRkMmQ4ZDNkM2U5ZTRlNGYy ZTVlNmUzPl0KL0xlbmd0aCAyNgovRmlsdGVyIC9GbGF0ZURlY29kZQo+Pgpz dHJlYW0KeNpjVDY2dlEKTSsv71y9e/eqmTN7ADZ4B6wKZW5kc3RyZWFtCmVu ZG9iagoKOTA2IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9J bWFnZQovTmFtZSAvSW05MDYKL1dpZHRoIDM2Ci9IZWlnaHQgMQovQml0c1Bl ckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdC IDExIDxmY2Y3ZjdmZmU2ZTRmZmQ4ZDFmZmE4YjBjZjY3NmZmZjY2NjZmZjc3 NzhmZDg3OGFmZjk5OTlmZmI5YjhmZmJjY2JmZmVkZWU+XQovTGVuZ3RoIDI2 Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUdgkNTSvvaLZc tWrVYouO8tUAPUMHtwplbmRzdHJlYW0KZW5kb2JqCgo5MDcgMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTkwNwov V2lkdGggMjQKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgOSA8ZTRlNGYyYjliZGU5ODU4 N2Q2YThhOWUxZDNkM2U5N2I3OWM1YmJiYmRiZTVlNmUzZmZlNmU0ZmZlZGVl Pl0KL0xlbmd0aCAyMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0K eNpjVFI2NjZ0cTENq5gJAA3xAwIKZW5kc3RyZWFtCmVuZG9iagoKOTA4IDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW05MDgKL1dpZHRoIDM1Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0 Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEyIDxlNWU2ZTM5 OTk5OTk1YzVkNWQ0MjQyM2Y3Mzc1Nzc4NDg4OGFhOWFkYjBiYmJkYmZjY2Nj Y2NjNGQyZDhkM2QzZTllNGU0ZjJmMGYxZjI+XQovTGVuZ3RoIDI3Ci9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUVlZyCRVMS6+YtefM7lWr VhwAADUzB/IKZW5kc3RyZWFtCmVuZG9iagoKOTA5IDAgb2JqCjw8Ci9UeXBl IC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW05MDkKL1dpZHRo IDMzCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNl IFsvSW5kZXhlZCAvRGV2aWNlUkdCIDExIDxmZmVkZWVlMmRkZDRiNWE0OGVj ZjY3NmZmZjY2NjZmZjc3NzhmZDg3OGFmZjk5OTlmZmE4YjBmZmJjY2JmZmU2 ZTRmZmQ4ZDE+XQovTGVuZ3RoIDI1Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+ CnN0cmVhbQp42mNUdnEJTSuvmDlr1cyOjrZqBgA2qQbeCmVuZHN0cmVhbQpl bmRvYmoKCjkxMCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAv SW1hZ2UKL05hbWUgL0ltOTEwCi9XaWR0aCAyNgovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiA5IDxmMGYxZjJiOWJkZTk4NTg3ZDY5OTk5Y2NhOGE5ZTFkM2QzZTljY2Nj Y2NlNWU2ZTNmZmVkZWVmY2Y3Zjc+XQovTGVuZ3RoIDIxCi9GaWx0ZXIgL0Zs YXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUUjZ2cRQNDUkv7+gEABJsA6wKZW5k c3RyZWFtCmVuZG9iagoKOTExIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9T dWJ0eXBlIC9JbWFnZQovTmFtZSAvSW05MTEKL1dpZHRoIDYKL0hlaWdodCAx Ci9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9E ZXZpY2VSR0IgMyA8ZmZlNmU0ZmZjZThjZmZiYTVjZmZlZGVlPl0KL0xlbmd0 aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTKwAAAJ4A hwplbmRzdHJlYW0KZW5kb2JqCgo5MTIgMCBvYmoKPDwKL1R5cGUgL1hPYmpl Y3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTkxMgovV2lkdGggMzUKL0hl aWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRl eGVkIC9EZXZpY2VSR0IgMTMgPGZmZTZlNGE5YWRiMDVjNWQ1ZDQyNDIzZjcz NzU3Nzg0ODg4YTk5OTk5OWJiYmRiZmM0ZDJkOGU0ZTRmMmYwZjFmMmQzZDNl OWNjY2NjY2ZjZjdmNz5dCi9MZW5ndGggMjcKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjaY1Q2NlIJDUsULO+ctWrl7N17LgAAMpYHmgplbmRz dHJlYW0KZW5kb2JqCgo5MTMgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1 YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTkxMwovV2lkdGggMzMKL0hlaWdodCAx Ci9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9E ZXZpY2VSR0IgMTEgPGYwZjFmMmU0ZjNlMmUyZGRkNGZmOTk5OWZmNjY2NmZm Nzc3OGZkODc4YWZmYThiMGZmYmNjYmZmZTZlNGZmYjliOGZmZWRlZT5dCi9M ZW5ndGggMjUKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYxAy cXENSzbvmDmzo6O8bOUGAC68BtAKZW5kc3RyZWFtCmVuZG9iagoKOTE0IDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW05MTQKL1dpZHRoIDcKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQK L0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNCA8ZmZlZGVlZmZj ZThjZmVhYTMzZmZiYTVjZmZlNmU0Pl0KL0xlbmd0aCAxMgovRmlsdGVyIC9G bGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVFJ2AAAA9ACHCmVuZHN0cmVhbQpl bmRvYmoKCjkxNSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAv SW1hZ2UKL05hbWUgL0ltOTE1Ci9XaWR0aCAzNAovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiAxNCA8ZmZlZGVlY2NjY2NjNzg2ZDVlMmUyYzJhNDI0MjNmNWM1ZDVkNzM3 NTc3ODQ4ODhhOTk5OTk5YTlhZGIwYmJiZGJmYzRkMmQ4ZTRlNGYyZjBmMWYy ZDNkM2U5Pl0KL0xlbmd0aCAyNgovRmlsdGVyIC9GbGF0ZURlY29kZQo+Pgpz dHJlYW0KeNpjVDZ2CU0r7+ictefs3Ttn3skCADw+CJIKZW5kc3RyZWFtCmVu ZG9iagoKOTE2IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9J bWFnZQovTmFtZSAvSW05MTYKL1dpZHRoIDM1Ci9IZWlnaHQgMQovQml0c1Bl ckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdC IDE0IDxmY2Y3ZjdmMGYxZjJlNGYzZTJkMmU5ZDRlMmRkZDRmZmE4YjBmZjY2 NjZmZjc3NzhmZDg3OGFmZjk5OTlmZmI5YjhmZmJjY2JmZmU2ZTRmZmVkZWVm ZmQ4ZDE+XQovTGVuZ3RoIDI3Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0 cmVhbQp42mNUNglNS6/ojNpz997uXaGzzzIAAEThCH8KZW5kc3RyZWFtCmVu ZG9iagoKOTE3IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9J bWFnZQovTmFtZSAvSW05MTcKL1dpZHRoIDM1Ci9IZWlnaHQgMQovQml0c1Bl ckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdC IDE0IDxlNGU0ZjJhOGE5ZTE3Yjc5YzU4NTg3ZDZiOWJkZTlkM2QzZTllMmRk ZDRmZmQ4ZDFmZGUwYjVmZmVkZWVmZmJhNWNmMTkzMDZmZWFhMzNmZmNlOGNm Y2Y3Zjc+XQovTGVuZ3RoIDI2Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0 cmVhbQp42mNUUjIWFHRxDUuraK+ctfvM2QcAK3oHJgplbmRzdHJlYW0KZW5k b2JqCgo5MTggMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0lt YWdlCi9OYW1lIC9JbTkxOAovV2lkdGggMzQKL0hlaWdodCAxCi9CaXRzUGVy Q29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0Ig MTIgPGZmZWRlZWUyZGRkNDg0ODg4YTQyNDIzZjJlMmMyYTVjNWQ1ZDczNzU3 Nzk5OTk5OWE5YWRiMGJiYmRiZmM0ZDJkOGU0ZTRmMmNjY2NjYz5dCi9MZW5n dGggMjYKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYxAycTEO TVMqr5i1e9eZU6sOAgAwCgeaCmVuZHN0cmVhbQplbmRvYmoKCjkxOSAwIG9i ago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0lt OTE5Ci9XaWR0aCAzNQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAov Q29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxNCA8ZmNmN2Y3ZjBm MWYyZTRmM2UyZDJlOWQ0YTRkNWFmZmZhOGIwZmY2NjY2ZmY3Nzc4ZmQ4Nzhh ZmY5OTk5ZmZiOWI4ZmZiY2NiZmZlNmU0ZmZlZGVlZmZkOGQxPl0KL0xlbmd0 aCAyNwovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVDJ2cU1L r+hcffbu7d1bQ99eAABDmAlgCmVuZHN0cmVhbQplbmRvYmoKCjkyMCAwIG9i ago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0lt OTIwCi9XaWR0aCA0MAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAov Q29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxNSA8ZmNmN2Y3Yjli ZGU5N2I3OWM1NjE2MmJjODU4N2Q2OTk5OWNjYThhOWUxY2NjY2NjZTJkZGQ0 ZmZkOGQxZmRlMGI1ZmZlNmU0ZmZiYTVjYzI3NzA2ZjE5MzA2ZmZjYzk5Pl0K L0xlbmd0aCAyOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpj YGAQMjZycU0TFK+YtWrVnnvr/70HADLMCCsKZW5kc3RyZWFtCmVuZG9iagoK OTIxIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQov TmFtZSAvSW05MjEKL1dpZHRoIDM1Ci9IZWlnaHQgMQovQml0c1BlckNvbXBv bmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDE0IDxm ZmVkZWVmZmU2ZTRhOWFkYjA1YzVkNWQyZTJjMmE0MjQyM2Y3Mzc1Nzc4NDg4 OGE5OTk5OTliYmJkYmZjNGQyZDhkM2QzZTllNGU0ZjJjY2NjY2NmY2Y3Zjc+ XQovTGVuZ3RoIDI2Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4 2mMUVHZxCTZOK6/QXH2qrbxJ9wEAMO8GwwplbmRzdHJlYW0KZW5kb2JqCgo5 MjIgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9O YW1lIC9JbTkyMgovV2lkdGggMzUKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9u ZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMTIgPGZj ZjdmN2U0ZjNlMmQyZTlkNGE0ZDVhZmZmYThiMGZmNjY2NmZmNzc3OGZkODc4 YWZmOTk5OWZmYjliOGZmYmNjYmZmZTZlNGZmZWRlZT5dCi9MZW5ndGggMjcK L0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYxRUMjZ2DU2rmLXn zK5VS7z2MAAANy0HQwplbmRzdHJlYW0KZW5kb2JqCgo5MjMgMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTkyMwov V2lkdGggNzMKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDgKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMjkgPGZjZjdmN2ZmZWRlZWU0 ZTRmMjg1ODdkNjYxNjJiYzdiNzljNWE4YTllMWI5YmRlOWNjY2NjY2UyZGRk NGZkZTBiNWZmY2I4MmZmY2M5OWYxOTMwNjkyNTkwNmZmYmE1Y2MyNzcwNmZj YzU3YWZmZTZlNDg0ODg4YTQyNDIzZjJlMmMyYTVjNWQ1ZDczNzU3Nzk5OTk5 OWE5YWRiMGJiYmRiZmM0ZDJkOGQzZDNlOWYwZjFmMj5dCi9MZW5ndGggNjkK L0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaFcRJAoAgCABAiXIh 2wSXpP7/zWwOYwBgwnlYENFa65z3gdYYI9G2HzA+L2NSSoEl5yxSSq3M3O6u +mhvv/5+YtAD+wplbmRzdHJlYW0KZW5kb2JqCgo5MjQgMCBvYmoKPDwKL1R5 cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTkyNAovV2lk dGggMzUKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3Bh Y2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMTMgPGZjZjdmN2U0ZjNlMmQyZTlk NGE0ZDVhZjdjYzA4NGZmOTk5OWZmNjY2NmZkODc4YWZmYThiMGZmYmNjYmZm ZTZlNGZmYjliOGZmZDhkMWZmZWRlZT5dCi9MZW5ndGggMjcKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYxRUUjYxTUsv7Vy1auXM3XvWMgAA NPYHRgplbmRzdHJlYW0KZW5kb2JqCgo5MjUgMCBvYmoKPDwKL1R5cGUgL1hP YmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTkyNQovV2lkdGggOQov SGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0lu ZGV4ZWQgL0RldmljZVJHQiAyIDxmY2Y3ZjdmZmVkZWVmZmU2ZTQ+XQovTGVu Z3RoIDExCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMIcwAA AO8AlwplbmRzdHJlYW0KZW5kb2JqCgo5MjYgMCBvYmoKPDwKL1R5cGUgL1hP YmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTkyNgovV2lkdGggNzIK L0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDgKL0NvbG9yU3BhY2UgWy9J bmRleGVkIC9EZXZpY2VSR0IgMzIgPGZjZjdmN2ZmZWRlZWZmZTZlNGZmZDhk MWE4YTllMTYxNjJiYzRjNGNhNTdiNzljNTg1ODdkNjk5OTljY2I5YmRlOWJi YmJkYmJiYmRiZmUyZGRkNGZmY2U4Y2ZmYmE1Y2ZmY2I4MmZmY2M5OWZlYWEz MzkyNTkwNmYxOTMwNmZjYzU3YWMyNzcwNjczNzU3NzQyNDIzZjJlMmMyYTVj NWQ1ZDg0ODg4YTk5OTk5OWE5YWRiMGM0ZDJkOGNjY2NjY2U1ZTZlMz5dCi9M ZW5ndGggNjkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaLcpJ AkAwDABAKtEiqknR1fL/V+rBnKfrlRoAcUTU2pgJYF5otZtzlln8foj4k1tq KMSUYsw5lFJrvYju3/N+dEwEfgplbmRzdHJlYW0KZW5kb2JqCgo5MjcgMCBv YmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9J bTkyNwovV2lkdGggMzQKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQK L0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMTUgPGYwZjFmMmU0 ZjNlMmQyZTlkNGE0ZDVhZjdjYzA4NDNmYTE0NGZkODc4YWZmNjY2NmZmNzc3 OGZmOTk5OWZmYThiMGZmYmNjYmZmZDhkMWZmZTZlNGZmZWRlZWZjZjdmNz5d Ci9MZW5ndGggMjYKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja YxRUMnZ1q2ibtefMmdOrdt97DwA4SAjcCmVuZHN0cmVhbQplbmRvYmoKCjky OCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05h bWUgL0ltOTI4Ci9XaWR0aCAxMAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25l bnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAzIDxmY2Y3 ZjdmZmVkZWVmZmQ4ZDFmZmU2ZTQ+XQovTGVuZ3RoIDExCi9GaWx0ZXIgL0Zs YXRlRGVjb2RlCj4+CnN0cmVhbQp42mMNOwAAAX4BHAplbmRzdHJlYW0KZW5k b2JqCgo5MjkgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0lt YWdlCi9OYW1lIC9JbTkyOQovV2lkdGggNzYKL0hlaWdodCAxCi9CaXRzUGVy Q29tcG9uZW50IDgKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0Ig MzEgPGZjZjdmN2ZmZTZlNGZmZDhkMWNjY2NjYzdiNzljNTYxNjJiYzRjNGNh NTg1ODdkNjk5OTljY2E4YTllMWJiYmJkYmJiYmRiZmZmYmE1Y2ZlYWEzM2Zj YzU3YWZmY2I4MmMyNzcwNjkyNTkwNmYxOTMwNmZkZTBiNWUyZGRkNGI1YTQ4 ZTVjNWQ1ZDJlMmMyYTQyNDIzZjczNzU3Nzg0ODg4YTk5OTk5OWE5YWRiMGM0 ZDJkOGQzZDNlOWU1ZTZlMz5dCi9MZW5ndGggNzIKL0ZpbHRlciAvRmxhdGVE ZWNvZGUKPj4Kc3RyZWFtCnjaFcwJAoAQEADAdSyJWB2I0v9/KfOAAQBgnAuJ SiGi1HoxZrXCbc57HxxFIop7ONh0XinnUlK6a22tPda+U+/i+58BcRED/gpl bmRzdHJlYW0KZW5kb2JqCgo5MzAgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QK L1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTkzMAovV2lkdGggNDMKL0hlaWdo dCAxCi9CaXRzUGVyQ29tcG9uZW50IDgKL0NvbG9yU3BhY2UgWy9JbmRleGVk IC9EZXZpY2VSR0IgMTYgPGYwZjFmMmE0ZDVhZjdjYzA4NDY1YjM2YzNmYTE0 NGQyZTlkNGZjZjdmN2U0ZjNlMjJhN2YyYWI1YTQ4ZWZkODc4YWZmNzc3OGZm OTk5OWZmYThiMGZmYjliOGZmZDhkMWZmZWRlZT5dCi9MZW5ndGggNDUKL0Zp bHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaDcQBEgAgBAVREelLuf9p s/NmaTCzTFEzoqUdu29E4GS2HnDfq7IPFSMBWwplbmRzdHJlYW0KZW5kb2Jq Cgo5MzEgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdl Ci9OYW1lIC9JbTkzMQovV2lkdGggOTEKL0hlaWdodCAxCi9CaXRzUGVyQ29t cG9uZW50IDgKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMjgg PGZjZjdmN2ZmZWRlZWZmZTZlNGZmZDhkMWZmYjliOGE4YTllMTYxNjJiYzdi NzljNTg1ODdkNjk5OTljY2I5YmRlOWNjY2NjY2YxOTMwNmMyNzcwNmZlYWEz M2ZmYmE1Y2ZjYzU3YWZkZTBiNWI1YTQ4ZTVjNWQ1ZDJlMmMyYTQyNDIzZjcz NzU3Nzg0ODg4YTk5OTk5OWE5YWRiMGJiYmRiZmYwZjFmMmU0ZjNlMj5dCi9M ZW5ndGggNzEKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaHcGJ AoAQEAXAZ6UDm4rk+v/vDDMABBFJAiAXEiQ7tU7bfiiltTGWT9ddzg7Mjqb7 8SG83sf4pZRy6fJQamu14gd9fgRSCmVuZHN0cmVhbQplbmRvYmoKCjkzMiAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltOTMyCi9XaWR0aCAzMgovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg NAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxNSA8ZjBmMWYy ZTRmM2UyZDJlOWQ0YTRkNWFmNjViMzZjMmE3ZjJhM2ZhMTQ0ZmY5OTk5ZmY3 Nzc4ZmQ4NzhhZWM1MzUxZmY2NjY2ZmZiY2NiZmZlNmU0ZmZlZGVlZmNmN2Y3 Pl0KL0xlbmd0aCAyNQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0K eNpjFFRSdk3vmF6xavXu9rP3/gMALlcH3AplbmRzdHJlYW0KZW5kb2JqCgo5 MzMgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9O YW1lIC9JbTkzMwovV2lkdGggOTIKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9u ZW50IDgKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMzQgPGZm ZWRlZWZmZDhkMWZmZTZlNGZmYThiMGZkODc4YWZmOTk5OWZmYjliODk5OTlj YzYxNjJiYzdiNzljNTg1ODdkNmE4YTllMWI5YmRlOWNjY2NjY2ZmY2M5OWMy NzcwNmZlYWEzM2ZmYmE1Y2ZmY2I4MmZjYzU3YWZmY2U4YzkyNTkwNmUyZGRk NGI1YTQ4ZTVjNWQ1ZDQyNDIzZjczNzU3Nzg0ODg4YTk5OTk5OWE5YWRiMGU1 ZTZlM2QyZTlkNGU0ZjNlMmYwZjFmMmZjZjdmNz5dCi9MZW5ndGggNzgKL0Zp bHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaHcZBAoAQEABAq6SiCBUW qf8/sjSnIaQBoAS6nlFgbAAAPjbTzIWQclmV0ltjjHXOql0D/R2nDyF4HxEx 5Zwxxq+plKvWej8vmiEFRwplbmRzdHJlYW0KZW5kb2JqCgo5MzQgMCBvYmoK PDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTkz NAovV2lkdGggMzEKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDgKL0Nv bG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMTYgPGYwZjFmMmU0ZjNl MmQyZTlkNGM0ZDJkOGE0ZDVhZjdjYzA4NDNmYTE0NDhjYTk5M2ZkODc4YWZm OTk5OWZmNzc3OGZmNjY2NmZmYThiMGZmYmNjYmZmZTZlNGZmZWRlZWZjZjdm Nz5dCi9MZW5ndGggMzkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFt CnjaY2BkZGRiYmJmYWVj5+Dg4OTk4ubm5uLi5OHl4+cXEAAACpQA+gplbmRz dHJlYW0KZW5kb2JqCgo5MzUgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1 YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTkzNQovV2lkdGggOTUKL0hlaWdodCAx Ci9CaXRzUGVyQ29tcG9uZW50IDgKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9E ZXZpY2VSR0IgMzYgPGZmZWRlZWZmZTZlNGZmYmNjYmZmZDhkMWZmYThiMGZk ODc4YWZmOTk5OWZmYjliOGZjZjdmN2ZmNzc3OGNjY2NjYzdiNzljNTYxNjJi Yzg1ODdkNmE4YTllMWI5YmRlOWQzZDNlOWZmY2M5OWMyNzcwNmYxOTMwNmZl YWEzM2ZmYmE1Y2ZjYzU3YWZmY2I4MmZkZTBiNWZmY2U4Y2I1YTQ4ZTc4NmQ1 ZTQyNDIzZjVjNWQ1ZDczNzU3Nzg0ODg4YTk5OTk5OWE5YWRiMGU0ZjNlMmQy ZTlkNGYwZjFmMj5dCi9MZW5ndGggODYKL0ZpbHRlciAvRmxhdGVEZWNvZGUK Pj4Kc3RyZWFtCnjaFcvZAkAgEADAzRYdQrlCuvj/b5R5HwAAQhpEylrWcUKF YB1K1VdK62EYx8lYOy/Vuu3GObMuB5LaANGcl/f3HUKMKeWcYogpy/L8Snk5 /wDSLAZECmVuZHN0cmVhbQplbmRvYmoKCjkzNiAwIG9iago8PAovVHlwZSAv WE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltOTM2Ci9XaWR0aCAz OAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiAxNSA8ZjBmMWYyYTRkNWFmMmE3ZjJhNjVi MzZjZDJlOWQ0ZmNmN2Y3ZTRmM2UyM2ZhMTQ0ZmY5OTk5ZmY3Nzc4ZmQ4Nzhh ZmZhOGIwZmZiOWI4ZmZkOGQxZmZlNmU0ZmZlZGVlPl0KL0xlbmd0aCAyNwov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVDIJSEtxcRSumNXR vXv32fehoQA+8QgLCmVuZHN0cmVhbQplbmRvYmoKCjkzNyAwIG9iago8PAov VHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltOTM3Ci9X aWR0aCA5OQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgOAovQ29sb3JT cGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAzNCA8ZmNmN2Y3ZmZlNmU0ZmZi Y2NiZmY5OTk5ZWM1MzUxZmY2NjY2ZmQ4NzhhZmZkOGQxZmZlZGVlYTlhZGIw N2I3OWM1NjE2MmJjODU4N2Q2YThhOWUxYjliZGU5ZDNkM2U5ZmZjYzk5YzI3 NzA2ZjE5MzA2ZmVhYTMzZmZiYTVjZmNjNTdhZmZjZThjZmRlMGI1YjVhNDhl Nzg2ZDVlNWM1ZDVkNzM3NTc3ODQ4ODhhOTk5OTk5YmJiZGJmZTVlNmUzZDJl OWQ0ZTRmM2UyZjBmMWYyPl0KL0xlbmd0aCA4MgovRmlsdGVyIC9GbGF0ZURl Y29kZQo+PgpzdHJlYW0KeNotwYcNgCAQAMCnPiIozQLY9x9SYrwD0tCGcSEl KoWSC0Zpp3Xfa2OsHYbReR9CiDGmNM2zWxqiABTi4tacSym11m3fu89xXr+7 eeAF1b8GBwplbmRzdHJlYW0KZW5kb2JqCgo5MzggMCBvYmoKPDwKL1R5cGUg L1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTkzOAovV2lkdGgg MzkKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDgKL0NvbG9yU3BhY2Ug Wy9JbmRleGVkIC9EZXZpY2VSR0IgMTYgPGYwZjFmMmM0ZDJkODdjYzA4NDNm YTE0NDJhN2YyYWU0ZjNlMmZjZjdmN2QyZTlkNGE0ZDVhZmI1YTQ4ZWZkODc4 YWZmOTk5OWZmYThiMGZmYmNjYmZmZDhkMWZmZTZlNGZmZWRlZT5dCi9MZW5n dGggNDAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaDcGJAQAQ DASw/uih9p9WE2JRM/Egch+Np+jKBLDbufVafBBPAS4KZW5kc3RyZWFtCmVu ZG9iagoKOTM5IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9J bWFnZQovTmFtZSAvSW05MzkKL1dpZHRoIDU4Ci9IZWlnaHQgMQovQml0c1Bl ckNvbXBvbmVudCA4Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdC IDI1IDxmY2Y3ZjdmZmU2ZTRmZmQ4ZDFmZmE4YjBmZmI5YjhmZDg3OGFmZjY2 NjZlYzUzNTFmZjc3NzhmZmJjY2JiNWE0OGU5OTk5Y2M4NTg3ZDY3Yjc5YzVh OGE5ZTFiOWJkZTljY2NjY2NmMTkzMDZjMjc3MDZmZWFhMzNmZmJhNWNmY2M1 N2FmZmNlOGNmZmNjOTlmZGUwYjVmZmVkZWU+XQovTGVuZ3RoIDU5Ci9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42g3BgQGAIAgAMAXEShRRLPv/ 0dpCBABEIkycmSIlPvD8XUWkVimtqXYbw8zmdPe17mdveMMHNBsCiAplbmRz dHJlYW0KZW5kb2JqCgo5NDAgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1 YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTk0MAovV2lkdGggODAKL0hlaWdodCAx Ci9CaXRzUGVyQ29tcG9uZW50IDgKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9E ZXZpY2VSR0IgMjUgPGZmZTZlNGZmZDhkMWZmY2M5OWI1YTQ4ZTk5OTk5OTg0 ODg4YWE5YWRiMGJiYmRiZmNjY2NjY2QyZTlkNGE0ZDVhZmM0ZDJkOGU0ZjNl MjdjYzA4NDNmYTE0NDJhN2YyYTY1YjM2Y2YwZjFmMmZkODc4YWZmNzc3OGZm OTk5OWZmYThiMGZmYjliOGZmYmNjYmZmZWRlZWZjZjdmNz5dCi9MZW5ndGgg NjcKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaLchbFoAgCABR ScrACsIesv+Nhud0/2YSAEw5I84DIi4lrMRcK/22UPdDRJTOEDk2s6q1Znbd zwup9+7uH2eBA4AKZW5kc3RyZWFtCmVuZG9iagoKOTQxIDAgb2JqCjw8Ci9U eXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW05NDEKL1dp ZHRoIDU3Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA4Ci9Db2xvclNw YWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIzIDxmY2Y3ZjdmZmU2ZTRmZmQ4 ZDFmZmE4YjBmZDg3OGFmZmI5YjhmZjc3NzhlYzUzNTFmZjY2NjZmZmJjY2Jm Zjk5OTliOWJkZTlhOGE5ZTE5OTk5Y2M4NTg3ZDZiYmJkYmZmZWFhMzNjMjc3 MDZmMTkzMDZmZmJhNWNmY2M1N2FmZmNlOGNmZmNjOTlmZGUwYjU+XQovTGVu Z3RoIDU2Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42g3BCQKA IAgEQNtVjEAlu/7/05xJG8CcC0mpQu5VCqCqB8289d7cbcS5zBlxLffzfkg/ LqwCRAplbmRzdHJlYW0KZW5kb2JqCgo5NDIgMCBvYmoKPDwKL1R5cGUgL1hP YmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTk0MgovV2lkdGggNzkK L0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDgKL0NvbG9yU3BhY2UgWy9J bmRleGVkIC9EZXZpY2VSR0IgMjQgPGZmZWRlZWZmZTZlNGZmZDhkMWZkZTBi NWZmY2U4Y2UyZGRkNGNjY2NjY2JiYmRiZmU1ZTZlMzdjYzA4NGE0ZDVhZmM0 ZDJkOGQyZTlkNDNmYTE0NDJhN2YyYWYwZjFmMmU0ZjNlMjY1YjM2Y2ZmOTk5 OWZmNjY2NmZmNzc3OGZmYThiMGZmYjliOGZmYmNjYmZjZjdmNz5dCi9MZW5n dGggNjMKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaJcEJAoAg CAAwpKRAQLOL/7+0sg0S4jRnomUgyit9WF7lpyps7m6sdWhNVYvIZn0/+nnd iAkAIuIBaX8DNgplbmRzdHJlYW0KZW5kb2JqCgo5NDMgMCBvYmoKPDwKL1R5 cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTk0MwovV2lk dGggNTYKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDgKL0NvbG9yU3Bh Y2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMjEgPGZmZTZlNGZmZDhkMWZmOTk5 OWZmNzc3OGZkODc4YWZmYThiMGZmNjY2NmZmYmNjYmZmYjliOGU0ZTRmMmQz ZDNlOWI5YmRlOWNjY2NjY2ZmYmE1Y2MyNzcwNjkyNTkwNmYxOTMwNmZlYWEz M2ZjYzU3YWZmY2U4Y2ZmY2M5OWZjZjdmNz5dCi9MZW5ndGggNTMKL0ZpbHRl ciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaHcEBAoAgCAQwOVKiBCX1/1+1 2hIRmPE5MkqB0EvODFW97l81b82994gws2dMWhsi7wHgCmVuZHN0cmVhbQpl bmRvYmoKCjk0NCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAv SW1hZ2UKL05hbWUgL0ltOTQ0Ci9XaWR0aCA3NgovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiAxNSA8ZmZlZGVlZmZkOGQxZmRlMGI1ZmZlNmU0ZTVlNmUzZjBmMWYyZTJk ZGQ0Y2NjY2NjYTRkNWFmN2NjMDg0NjViMzZjM2ZhMTQ0MmE3ZjJhZTRmM2Uy ZDJlOWQ0ZmNmN2Y3Pl0KL0xlbmd0aCA0MgovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNpjEFJ2AYHQ9PLODhDoXH3m9IyroaGh996965jVKChs zMD/HwAtfxDnCmVuZHN0cmVhbQplbmRvYmoKCjk0NSAwIG9iago8PAovVHlw ZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltOTQ1Ci9XaWR0 aCAyNzAKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDgKL0NvbG9yU3Bh Y2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMjggPGZlYmYwMGQ0MDAyOWNmNjc2 ZmVjNTM1MWMyNzcwNjkyNTkwNmYxOTMwNmZlYWEzM2ZmYmE1Y2ZjYzU3YWZm Y2M5OWZmZDhkMWZmZWRlZWZjZjdmN2ZkZTBiNWZmY2U4Y2ZmZTZlNGZmNzc3 OGMxNDA0MGNmMGI2ODdjYzA4NDNmYTE0NGE0ZDVhZjY1YjM2YzJhN2YyYWQy ZTlkNGU0ZjNlMjg0ODg4YWRlMTI2Nj5dCi9MZW5ndGggNzcKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjarcrLFkAgEADQ9JKK0JgR/v875eSx seyuL2MVNZVwIaRSSkqt28yYzjrf+yEENzprp/l+seCwAOCD1gth2l4pQwTa j0/8cwLETAiHCmVuZHN0cmVhbQplbmRvYmoKCjk0NiAwIG9iago8PAovVHlw ZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltOTQ2Ci9XaWR0 aCAyNzAKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDgKL0NvbG9yU3Bh Y2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMjcgPGZlYmYwMGZmY2MwMGQ0MDAy OWMxNDA0MGMyNzcwNjkyNTkwNmYxOTMwNmZlYWEzM2ZmYmE1Y2ZjYzU3YWZm Y2M5OWZmZDhkMWZmZWRlZWZmZTZlNGZkZTBiNWZmOTk5OWVjNTM1MWNmMGI2 OGNmNjc2ZjNmYTE0NDJhN2YyYTdjYzA4NGE0ZDVhZjY1YjM2Y2QyZTlkNGU0 ZjNlMmU0ZTRmMmRlMTI2Nj5dCi9MZW5ndGggNzcKL0ZpbHRlciAvRmxhdGVE ZWNvZGUKPj4Kc3RyZWFtCnjarcrbFkAgEIXhkNI4JNMovP972hbduey7+9fe StXTtNV0ugetjbEwOBqn2VkULeTX8gqvjSOL7B9hjpAkH3A+MmBI6SrCvxvS mggvCmVuZHN0cmVhbQplbmRvYmoKCjk0NyAwIG9iago8PAovVHlwZSAvWE9i amVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltOTQ3Ci9XaWR0aCA5Ci9I ZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5k ZXhlZCAvRGV2aWNlUkdCIDMgPGZjZmJmN2Y4ZWVkYWU1YTc5OWU5YzZiYz5d Ci9MZW5ndGggMTEKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja Y9zCAAABbgC2CmVuZHN0cmVhbQplbmRvYmoKCjk0OCAwIG9iago8PAovVHlw ZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltOTQ4Ci9XaWR0 aCAxMQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFj ZSBbL0luZGV4ZWQgL0RldmljZVJHQiAzIDxmY2ZiZjdlYmRlZDdlNWE3OTll MTg4N2E+XQovTGVuZ3RoIDExCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0 cmVhbQp42mOQngAAAMkArAplbmRzdHJlYW0KZW5kb2JqCgo5NDkgMCBvYmoK PDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTk0 OQovV2lkdGggMTMKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0Nv bG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNCA8ZmNmYmY3ZWJkZWQ3 ZTljNmJjZTVhNzk5ZjhlZWRhPl0KL0xlbmd0aCAxNQovRmlsdGVyIC9GbGF0 ZURlY29kZQo+PgpzdHJlYW0KeNpjYGBgEDJyAAAA4QCFCmVuZHN0cmVhbQpl bmRvYmoKCjk1MCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAv SW1hZ2UKL05hbWUgL0ltOTUwCi9XaWR0aCAxNQovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiAzIDxmY2ZiZjdlYmRlZDdlOWM2YmNmOGVlZGE+XQovTGVuZ3RoIDEyCi9G aWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hNgYFwDAADyAL4KZW5k c3RyZWFtCmVuZG9iagoKOTUxIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9T dWJ0eXBlIC9JbWFnZQovTmFtZSAvSW05NTEKL1dpZHRoIDIzCi9IZWlnaHQg MQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAv RGV2aWNlUkdCIDUgPGZjZmJmNzk4OGZhYWJiYjRjNmViZGVkN2Y4ZWVkYWU5 YzZiYz5dCi9MZW5ndGggMTgKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3Ry ZWFtCnjaY2BgYBAyABIMzgEAAsIA1gplbmRzdHJlYW0KZW5kb2JqCgo5NTIg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTk1MgovV2lkdGggMzEKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50 IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgOCA8ZmNmYmY3 ZjhlZWRhZjJlMGI3ZWJjZDk3MjcyODY1NDY0Mzc5Nzc2YzhlZWJkZWQ3ZTlj NmJjPl0KL0xlbmd0aCAyMgovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl YW0KeNpjYBRUNjY2VgkrYAACCQYAEJsB0QplbmRzdHJlYW0KZW5kb2JqCgo5 NTMgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9O YW1lIC9JbTk1MwovV2lkdGggMQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25l bnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAwIDxmY2Zi Zjc+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFt CnjaYwAAAAEAAQplbmRzdHJlYW0KZW5kb2JqCgo5NTQgMCBvYmoKPDwKL1R5 cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTk1NAovV2lk dGggMzUKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3Bh Y2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMTEgPGZjZmJmN2Y4ZWVkYWYyZTBi N2ViY2Q5N2ViYzE3N2UzYWU1YWUxYTkzYmNkYTE0YTQ2NDM3OTI3Mjg2NWJi YjRjNmU5YzZiYz5dCi9MZW5ndGggMjIKL0ZpbHRlciAvRmxhdGVEZWNvZGUK Pj4Kc3RyZWFtCnjaYxAyCU0DgYqZXQxAIC0AAC5zBGAKZW5kc3RyZWFtCmVu ZG9iagoKOTU1IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9J bWFnZQovTmFtZSAvSW05NTUKL1dpZHRoIDgKL0hlaWdodCAxCi9CaXRzUGVy Q29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0Ig NSA8ZmNmYmY3ZTljNmJjZTVhNzk5ZTE4ODdhZWJkZWQ3ZjhlZWRhPl0KL0xl bmd0aCAxMgovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVFZ0 BQAA+ACLCmVuZHN0cmVhbQplbmRvYmoKCjk1NiAwIG9iago8PAovVHlwZSAv WE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltOTU2Ci9XaWR0aCA0 MQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiAxMCA8ZmNmYmY3ZjhlZWRhZjJlMGI3ZWJj ZDk3ZWJjMTc3ZTNhZTVhYjk5ODVjNDY0Mzc5MjcyODY1OTg4ZmFhZTljNmJj Pl0KL0xlbmd0aCAyNwovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0K eNpjFDIJDXFxNjY2MXEr76hkAIJVDAAzBASuCmVuZHN0cmVhbQplbmRvYmoK Cjk1NyAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UK L05hbWUgL0ltOTU3Ci9XaWR0aCA4Ci9IZWlnaHQgMQovQml0c1BlckNvbXBv bmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDYgPGU1 YTc5OWNmMmMzMmQxM2MzZGQ0NTM0Y2Q4NmE2MmU5YzZiY2ViZGVkNz5dCi9M ZW5ndGggMTIKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1R2 CAMAAUcAuwplbmRzdHJlYW0KZW5kb2JqCgo5NTggMCBvYmoKPDwKL1R5cGUg L1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTk1OAovV2lkdGgg NDUKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2Ug Wy9JbmRleGVkIC9EZXZpY2VSR0IgMTEgPGZjZmJmN2Y4ZWVkYWYyZTBiN2Vi Y2Q5N2UzYWU1YWViYzE3Nzc3NmM4ZTI3Mjg2NTQ2NDM3OWJiYjRjNmViZGVk N2U1YTc5OT5dCi9MZW5ndGggMzAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4K c3RyZWFtCnjaYxAycXE1UmRgYGBkEFSrKK+YAGSuZgAAKD0D/QplbmRzdHJl YW0KZW5kb2JqCgo5NTkgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5 cGUgL0ltYWdlCi9OYW1lIC9JbTk1OQovV2lkdGggMjQKL0hlaWdodCAxCi9C aXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZp Y2VSR0IgMTIgPGZjZmJmN2Y4ZDIyN2Q0NTM0Y2QxM2MzZGQ4NmE2MmU1YTc5 OWViZGVkN2YyZTBiN2ViY2Q5N2UzYWU1YWUxYTkzYmViYzE3N2Y4ZWVkYT5d Ci9MZW5ndGggMjAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja Y1RWCWOrmLlyRw0DAwAUtgOTCmVuZHN0cmVhbQplbmRvYmoKCjk2MCAwIG9i ago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0lt OTYwCi9XaWR0aCAxOQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAov Q29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA1IDxlYmRlZDc0NjQz NzkyNzI4NjVmY2ZiZjdmOGVlZGFlMTg4N2E+XQovTGVuZ3RoIDE4Ci9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUUhIUNjY2dnUAAAZtAYgK ZW5kc3RyZWFtCmVuZG9iagoKOTYxIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0 Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW05NjEKL1dpZHRoIDIwCi9IZWln aHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhl ZCAvRGV2aWNlUkdCIDEzIDxmOGVlZGFlMWE5M2JmOGQyMjdkMTNjM2RjZjJj MzJkODZhNjJlNWE3OTllYmRlZDdmY2ZiZjdlOWM2YmNlM2FlNWFlYmMxNzdl YmNkOTdmMmUwYjc+XQovTGVuZ3RoIDE4Ci9GaWx0ZXIgL0ZsYXRlRGVjb2Rl Cj4+CnN0cmVhbQp42mNUdk3vXLj6bEcHABNOBIMKZW5kc3RyZWFtCmVuZG9i agoKOTYyIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFn ZQovTmFtZSAvSW05NjIKL1dpZHRoIDIwCi9IZWlnaHQgMQovQml0c1BlckNv bXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDUg PGViZGVkNzQ2NDM3OTI3Mjg2NWZjZmJmN2Y4ZWVkYWUxODg3YT5dCi9MZW5n dGggMTgKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1RSUhIw NjZxZQYABpgBWgplbmRzdHJlYW0KZW5kb2JqCgo5NjMgMCBvYmoKPDwKL1R5 cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTk2MwovV2lk dGggMTcKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3Bh Y2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgOSA8ZmNmYmY3ZWJjZDk3ZTFhOTNi ZjhkMjI3ZDQ1MzRjZTE4ODdhZTljNmJjZjhlZWRhZWJjMTc3ZjJlMGI3Pl0K L0xlbmd0aCAxNwovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpj VDZxTc+QLGAAAAkCAfYKZW5kc3RyZWFtCmVuZG9iagoKOTY0IDAgb2JqCjw8 Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW05NjQK L1dpZHRoIDIxCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xv clNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDcgPGY4ZWVkYTQ2NDM3OTI3 Mjg2NTk4OGZhYWZjZmJmN2YyZTBiN2Q4NmE2MmUzYWU1YT5dCi9MZW5ndGgg MTkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1RSUhJ2cWEI K3AAAAk/AgkKZW5kc3RyZWFtCmVuZG9iagoKOTY1IDAgb2JqCjw8Ci9UeXBl IC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW05NjUKL1dpZHRo IDE0Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNl IFsvSW5kZXhlZCAvRGV2aWNlUkdCIDcgPGZjZmJmN2I5OTg1Y2UxYTkzYmY4 ZDIyN2UzYWU1YWUxODg3YWU1YTc5OWU5YzZiYz5dCi9MZW5ndGggMTUKL0Zp bHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1Q2dk1PZwAABPYBawpl bmRzdHJlYW0KZW5kb2JqCgo5NjYgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QK L1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTk2NgovV2lkdGggMjIKL0hlaWdo dCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVk IC9EZXZpY2VSR0IgOSA8ZmNmYmY3Nzc2YzhlMjcyODY1NDY0Mzc5YmJiNGM2 ZjhlZWRhZjJlMGI3Y2U3ZjRhZTFhOTNiZWJjMTc3Pl0KL0xlbmd0aCAxOQov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVFJSMnZgCEvvTAAA CpACgQplbmRzdHJlYW0KZW5kb2JqCgo5NjcgMCBvYmoKPDwKL1R5cGUgL1hP YmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTk2NwovV2lkdGggMTIK L0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9J bmRleGVkIC9EZXZpY2VSR0IgOCA8ZmNmYmY3YTg2YTVkZTFhOTNiZjhkMjI3 ZmFlNjZiZWJjZDk3ZTVhNzk5ZTE4ODdhZTljNmJjPl0KL0xlbmd0aCAxNAov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVDZ2CasAAAN3AWoK ZW5kc3RyZWFtCmVuZG9iagoKOTY4IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0 Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW05NjgKL1dpZHRoIDI2Ci9IZWln aHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhl ZCAvRGV2aWNlUkdCIDggPGZjZmJmN2JiYjRjNjI3Mjg2NTc3NmM4ZWYyZTBi N2UxODg3YWUxYTkzYmViYzE3N2Y4ZWVkYT5dCi9MZW5ndGggMjEKL0ZpbHRl ciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY2AQUlJSUmZgcAlLbwAACL4C HQplbmRzdHJlYW0KZW5kb2JqCgo5NjkgMCBvYmoKPDwKL1R5cGUgL1hPYmpl Y3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTk2OQovV2lkdGggMTMKL0hl aWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRl eGVkIC9EZXZpY2VSR0IgOCA8ZmNmYmY3ZjJlMGI3YTg2YTVkY2RhMTRhZjhk MjI3ZTNhZTVhYjk5ODVjZWJjMTc3ZjhlZWRhPl0KL0xlbmd0aCAxNQovRmls dGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVHZxCStvAAAFtAH6CmVu ZHN0cmVhbQplbmRvYmoKCjk3MCAwIG9iago8PAovVHlwZSAvWE9iamVjdAov U3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltOTcwCi9XaWR0aCAyOAovSGVpZ2h0 IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQg L0RldmljZVJHQiAxMiA8ZmNmYmY3ZTljNmJjY2I4ZDc5YTg2YTVkOTg4ZmFh MjcyODY1NDY0Mzc5ZWJkZWQ3ZjhlZWRhZjJlMGI3ZTNhZTVhZTFhOTNiZWJj ZDk3Pl0KL0xlbmd0aCAyMgovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl YW0KeNpjVDZ2DQ0NTStg6Fy16wAAG/UFHwplbmRzdHJlYW0KZW5kb2JqCgo5 NzEgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9O YW1lIC9JbTk3MQovV2lkdGggMTkKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9u ZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgOSA8ZmNm YmY3ZjhlZWRhZWJjZDk3ZTNhZTVhY2U3ZjRhYWI4NDM0Y2RhMTRhZTFhOTNi YTg2YTVkZmFlNjZiPl0KL0xlbmd0aCAxOAovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNpjYBBUdk0v6bBkAAAJAgIWCmVuZHN0cmVhbQplbmRv YmoKCjk3MiAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1h Z2UKL05hbWUgL0ltOTcyCi9XaWR0aCA5Ci9IZWlnaHQgMQovQml0c1BlckNv bXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEg PGZjZmJmN2Y4ZWVkYT5dCi9MZW5ndGggMTEKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjaYwxlAAAAsABXCmVuZHN0cmVhbQplbmRvYmoKCjk3 MyAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05h bWUgL0ltOTczCi9XaWR0aCAyOQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25l bnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxMSA8ZTlj NmJjZDg2YTYyYTMyYzJkNDY0Mzc5MjcyODY1YmJiNGM2ZmNmYmY3ZjhlZWRh ZjJlMGI3ZTNhZTVhZTFhOTNiZWJjMTc3Pl0KL0xlbmd0aCAyMwovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVFJSMnFxcXFNS++cuboAABqz BLcKZW5kc3RyZWFtCmVuZG9iagoKOTc0IDAgb2JqCjw8Ci9UeXBlIC9YT2Jq ZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW05NzQKL1dpZHRoIDQ0Ci9I ZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA4Ci9Db2xvclNwYWNlIFsvSW5k ZXhlZCAvRGV2aWNlUkdCIDE2IDxmY2ZiZjdmOGVlZGFlYmRlZDdlOWM2YmNl NWE3OTllMTg4N2FkODZhNjJlYmMxNzdkMGFjN2RlYmNkOTc5ZDRlM2VhYjg0 MzRhODZhNWRmMmUwYjdjZTdmNGFkNDUzNGNkMTNjM2Q+XQovTGVuZ3RoIDQ2 Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42gXBhwEAIAgDsCJD hgr/X2sCAESLWUTNtkdEVlUej0ugy6LPumdG8AEUtAEuCmVuZHN0cmVhbQpl bmRvYmoKCjk3NSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAv SW1hZ2UKL05hbWUgL0ltOTc1Ci9XaWR0aCAzMQovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiA5IDxmOGVlZGFjZjJjMzJhMzJjMmQ5ODhmYWEyNzI4NjU3NzZjOGVlYmRl ZDdlM2FlNWFmMmUwYjdmY2ZiZjc+XQovTGVuZ3RoIDIyCi9GaWx0ZXIgL0Zs YXRlRGVjb2RlCj4+CnN0cmVhbQp42mMUVFJSdgGCsLS08vKKCQAb7gSiCmVu ZHN0cmVhbQplbmRvYmoKCjk3NiAwIG9iago8PAovVHlwZSAvWE9iamVjdAov U3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltOTc2Ci9XaWR0aCA0NQovSGVpZ2h0 IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQg L0RldmljZVJHQiAxNSA8ZmNmYmY3ZWJjMTc3ZDg2YTYyZDQ1MzRjZDEzYzNk Y2YyYzMyZTVhNzk5Yjk5ODVjZDBhYzdkZWJjZDk3ZTljNmJjZTE4ODdhY2U3 ZjRhOWQ0ZTNlZjJlMGI3Y2RhMTRhPl0KL0xlbmd0aCAyOQovRmlsdGVyIC9G bGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVHYJDQ0Nq5i5uudutbFevWkoiMsA AGGmCB0KZW5kc3RyZWFtCmVuZG9iagoKOTc3IDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW05NzcKL1dpZHRoIDMy Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA4Ci9Db2xvclNwYWNlIFsv SW5kZXhlZCAvRGV2aWNlUkdCIDE3IDxlOWM2YmNkMTNjM2RjZjJjMzJkODZh NjJjYjhkNzk5ZDRlM2VhMzJjMmRhODZhNWQ5ODhmYWE0NjQzNzkyNzI4NjVi YmI0YzZlYmRlZDdmMmUwYjdlM2FlNWFlYmMxNzdlYmNkOTdmY2ZiZjc+XQov TGVuZ3RoIDM2Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNg ZGRiZmFlY2Nj5+DkAgNObgZuHl4+Pn4+PgFBAA0sARcKZW5kc3RyZWFtCmVu ZG9iagoKOTc4IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9J bWFnZQovTmFtZSAvSW05NzgKL1dpZHRoIDc5Ci9IZWlnaHQgMQovQml0c1Bl ckNvbXBvbmVudCA4Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdC IDIxIDxmY2ZiZjdmMmUwYjdkNDUzNGNjZjJjMzJkMTNjM2RlOWM2YmNlYmNk OTdkMGFjN2RlMTg4N2E5ZDRlM2VhMzJjMmRjYjhkNzllM2FlNWFkODZhNjJl YmRlZDdiOTk4NWNiYmI0YzY3NzZjOGU0NjQzNzkyNzI4NjVmOGVlZGFlYmMx Nzc+XQovTGVuZ3RoIDY0Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVh bQp42iWKRxKAMBDDsi09sKT8/6t4QKOT5UAsP6oWU2QVyVZqw6xGfaBw/j5M 4ULldI8Kmj9zgenum04/cL9DeAKFCmVuZHN0cmVhbQplbmRvYmoKCjk3OSAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltOTc5Ci9XaWR0aCA2OQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg OAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyMiA8ZmNmYmY3 Y2U3ZjRhY2YyYzMyZDEzYzNkZTE4ODdhY2I4ZDc5ZDBhYzdkZTVhNzk5ZjJl MGI3ZDQ1MzRjZWJkZWQ3ZTljNmJjZDg2YTYyZWJjZDk3Yjk5ODVjZjhlZWRh OWQ0ZTNlYTMyYzJkYTg2YTVkOTg4ZmFhNzc2YzhlNDY0Mzc5YmJiNGM2Pl0K L0xlbmd0aCA2MwovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNol iVsSgCAMxGrBUhfkocX7H9Uy7E+SWTqYOcQzSlIlvbwSkOFSQLcjSK2FV7b9 Sh++J+M1m9M+0A872AJPCmVuZHN0cmVhbQplbmRvYmoKCjk4MCAwIG9iago8 PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltOTgw Ci9XaWR0aCA4Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xv clNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPGY4ZWVkYWUzYWU1YWVi YzE3Nz5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3Ry ZWFtCnjak5oBAADOALMKZW5kc3RyZWFtCmVuZG9iagoKOTgxIDAgb2JqCjw8 Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW05ODEK L1dpZHRoIDEzCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xv clNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDggPGZjZmJmN2Q4NmE2MmNm MmMzMmQxM2MzZGViY2Q5N2NkYTE0YWI5OTg1Y2FiODQzNGU5YzZiYz5dCi9M ZW5ndGggMTUKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1RW dE2vYAAABL4BagplbmRzdHJlYW0KZW5kb2JqCgo5ODIgMCBvYmoKPDwKL1R5 cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTk4MgovV2lk dGggNwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFj ZSBbL0luZGV4ZWQgL0RldmljZVJHQiA1IDxmOGVlZGFkNDUzNGNjZjJjMzJk MTNjM2RlYmNkOTdmY2ZiZjc+XQovTGVuZ3RoIDEyCi9GaWx0ZXIgL0ZsYXRl RGVjb2RlCj4+CnN0cmVhbQp42mNUNgkAAAEpAKkKZW5kc3RyZWFtCmVuZG9i agoKOTgzIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFn ZQovTmFtZSAvSW05ODMKL1dpZHRoIDYKL0hlaWdodCAxCi9CaXRzUGVyQ29t cG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8 ZjJlMGI3ZDEzYzNkZTVhNzk5ZjhlZWRhPl0KL0xlbmd0aCAxMAovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoT3QAAANwAxgplbmRzdHJlYW0K ZW5kb2JqCgo5ODQgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTk4NAovV2lkdGggMjkKL0hlaWdodCAxCi9CaXRz UGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VS R0IgMTUgPGViY2Q5N2QxM2MzZGNmMmMzMmQ4NmE2MmQwYWM3ZGFiODQzNGI5 OTg1Y2Q0NTM0Y2U1YTc5OWY4ZWVkYWU5YzZiY2ZjZmJmNzlkNGUzZWEzMmMy ZGE4NmE1ZGViZGVkNz5dCi9MZW5ndGggMjMKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjaY1QyCSsS6mwSlNpy6O69DwAkAwaJCmVuZHN0cmVh bQplbmRvYmoKCjk4NSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlw ZSAvSW1hZ2UKL05hbWUgL0ltOTg1Ci9XaWR0aCA4Ci9IZWlnaHQgMQovQml0 c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNl UkdCIDQgPGY4ZWVkYWJiYjRjNjk4OGZhYWU5YzZiY2ZjZmJmNz5dCi9MZW5n dGggMTIKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYxQSZgEA AGgAKwplbmRzdHJlYW0KZW5kb2JqCgo5ODYgMCBvYmoKPDwKL1R5cGUgL1hP YmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTk4NgovV2lkdGggOQov SGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0lu ZGV4ZWQgL0RldmljZVJHQiAzIDxmY2ZiZjdmOGVlZGFlYmMxNzdlYmNkOTc+ XQovTGVuZ3RoIDExCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4 2pNa7QAAAecBBgplbmRzdHJlYW0KZW5kb2JqCgo5ODcgMCBvYmoKPDwKL1R5 cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTk4NwovV2lk dGggMTIKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3Bh Y2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgOCA8ZjhlZWRhZDEzYzNkY2YyYzMy ZTE4ODdhZjJlMGI3ZDBhYzdkZWJjZDk3ZTljNmJjZmNmYmY3Pl0KL0xlbmd0 aCAxNAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVFJ2DasA AAM1AVoKZW5kc3RyZWFtCmVuZG9iagoKOTg4IDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW05ODgKL1dpZHRoIDcK L0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9J bmRleGVkIC9EZXZpY2VSR0IgNSA8ZTljNmJjZDEzYzNkY2YyYzMyZDg2YTYy ZWJjZDk3ZmNmYmY3Pl0KL0xlbmd0aCAxMgovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNpjVDIJAAABJgCoCmVuZHN0cmVhbQplbmRvYmoKCjk4 OSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05h bWUgL0ltOTg5Ci9XaWR0aCAyOAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25l bnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA5IDxmY2Zi ZjdlMTg4N2FjZjJjMzJkMTNjM2RkMGFjN2RjYjhkNzlmMmUwYjdmOGVlZGFk ODZhNjJlYmRlZDc+XQovTGVuZ3RoIDIyCi9GaWx0ZXIgL0ZsYXRlRGVjb2Rl Cj4+CnN0cmVhbQp42mNUNmEIUhIrVNaoNFJqAwARXgLyCmVuZHN0cmVhbQpl bmRvYmoKCjk5MCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAv SW1hZ2UKL05hbWUgL0ltOTkwCi9XaWR0aCA4Ci9IZWlnaHQgMQovQml0c1Bl ckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdC IDUgPGQwYWM3ZDlkNGUzZWNmMmMzMmEzMmMyZGNiOGQ3OWY4ZWVkYT5dCi9M ZW5ndGggMTIKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1Q2 dgUAARwAnQplbmRzdHJlYW0KZW5kb2JqCgo5OTEgMCBvYmoKPDwKL1R5cGUg L1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTk5MQovV2lkdGgg OQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiAzIDxmY2ZiZjdmOGVlZGFlYmMxNzdlYmNk OTc+XQovTGVuZ3RoIDExCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVh bQp42pPa7QAAAgcBFgplbmRzdHJlYW0KZW5kb2JqCgo5OTIgMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTk5Mgov V2lkdGggMTIKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNCA8ZmNmYmY3ZTVhNzk5Y2Yy YzMyZDEzYzNkZWJjZDk3Pl0KL0xlbmd0aCAxNAovRmlsdGVyIC9GbGF0ZURl Y29kZQo+PgpzdHJlYW0KeNpjVFJ2YGAAAAICAIcKZW5kc3RyZWFtCmVuZG9i agoKOTkzIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFn ZQovTmFtZSAvSW05OTMKL1dpZHRoIDgKL0hlaWdodCAxCi9CaXRzUGVyQ29t cG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNSA8 ZmNmYmY3ZTE4ODdhY2YyYzMyZDEzYzNkY2I4ZDc5ZjJlMGI3Pl0KL0xlbmd0 aCAxMgovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVFYJAAAB CQCZCmVuZHN0cmVhbQplbmRvYmoKCjk5NCAwIG9iago8PAovVHlwZSAvWE9i amVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltOTk0Ci9XaWR0aCAyOAov SGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0lu ZGV4ZWQgL0RldmljZVJHQiAxMCA8ZmNmYmY3ZDQ1MzRjY2YyYzMyZDEzYzNk ZDg2YTYyZTljNmJjZjhlZWRhY2I4ZDc5ZWJkZWQ3Yjk5ODVjZTE4ODdhPl0K L0xlbmd0aCAyMgovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpj VHZlczISd1bS4FRWXgYAD1ECfQplbmRzdHJlYW0KZW5kb2JqCgo5OTUgMCBv YmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9J bTk5NQovV2lkdGggOAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAov Q29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA1IDxkMGFjN2Q5ZDRl M2VkMTNjM2RjZjJjMzJlYmNkOTdmY2ZiZjc+XQovTGVuZ3RoIDEyCi9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUNnIFAAEaAJwKZW5kc3Ry ZWFtCmVuZG9iagoKOTk2IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0 eXBlIC9JbWFnZQovTmFtZSAvSW05OTYKL1dpZHRoIDkKL0hlaWdodCAxCi9C aXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZp Y2VSR0IgNCA8ZmNmYmY3ZjhlZWRhZWJjMTc3ZWJjZDk3ZjJlMGI3Pl0KL0xl bmd0aCAxMwovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVDI2 YQAAAZMAiwplbmRzdHJlYW0KZW5kb2JqCgo5OTcgMCBvYmoKPDwKL1R5cGUg L1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTk5NwovV2lkdGgg MTIKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2Ug Wy9JbmRleGVkIC9EZXZpY2VSR0IgNyA8ZmNmYmY3ZDQ1MzRjY2YyYzMyZDEz YzNkZTE4ODdhZTVhNzk5ZDg2YTYyZWJjZDk3Pl0KL0xlbmd0aCAxNAovRmls dGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVFZ0dUsHAAMBATgKZW5k c3RyZWFtCmVuZG9iagoKOTk4IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9T dWJ0eXBlIC9JbWFnZQovTmFtZSAvSW05OTgKL1dpZHRoIDcKL0hlaWdodCAx Ci9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9E ZXZpY2VSR0IgNSA8ZmNmYmY3ZDQ1MzRjY2YyYzMyZDEzYzNkZDBhYzdkZjhl ZWRhPl0KL0xlbmd0aCAxMgovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl YW0KeNpjVFYJAAABCQCZCmVuZHN0cmVhbQplbmRvYmoKCjk5OSAwIG9iago8 PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltOTk5 Ci9XaWR0aCA2Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xv clNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMgPGYyZTBiN2QxM2MzZGU1 YTc5OWViZGVkNz5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUK Pj4Kc3RyZWFtCnjaE90AAADcAMYKZW5kc3RyZWFtCmVuZG9iagoKMTAwMCAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltMTAwMAovV2lkdGggMjkKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50 IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgOSA8ZjhlZWRh ZDEzYzNkY2YyYzMyZTE4ODdhZjJlMGI3ZDQ1MzRjZTVhNzk5ZmNmYmY3Y2Rh MTRhZDg2YTYyPl0KL0xlbmd0aCAyMwovRmlsdGVyIC9GbGF0ZURlY29kZQo+ PgpzdHJlYW0KeNpjVFJSUhRmCVQUY29UkmQAAA5LAesKZW5kc3RyZWFtCmVu ZG9iagoKMTAwMSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAv SW1hZ2UKL05hbWUgL0ltMTAwMQovV2lkdGggOQovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiA0IDxmY2ZiZjdmOGVlZGFlYmMxNzdlYmNkOTdmMmUwYjc+XQovTGVuZ3Ro IDEzCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUdnFhAAAB 6gCtCmVuZHN0cmVhbQplbmRvYmoKCjEwMDIgMCBvYmoKPDwKL1R5cGUgL1hP YmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTEwMDIKL1dpZHRoIDEy Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsv SW5kZXhlZCAvRGV2aWNlUkdCIDQgPGViZGVkN2QxM2MzZGNmMmMzMmQ4NmE2 MmYyZTBiNz5dCi9MZW5ndGggMTIKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4K c3RyZWFtCnjaY1QCAhMAAhwAvgplbmRzdHJlYW0KZW5kb2JqCgoxMDAzIDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW0xMDAzCi9XaWR0aCA3Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0 Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDQgPGY4ZWVkYWQx M2MzZGNmMmMzMmViY2Q5N2ZjZmJmNz5dCi9MZW5ndGggMTIKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1RSdgAAAPQAhwplbmRzdHJlYW0K ZW5kb2JqCgoxMDA0IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBl IC9JbWFnZQovTmFtZSAvSW0xMDA0Ci9XaWR0aCA3Ci9IZWlnaHQgMQovQml0 c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNl UkdCIDUgPGZjZmJmN2U1YTc5OWNmMmMzMmQxM2MzZGQwYWM3ZGY4ZWVkYT5d Ci9MZW5ndGggMTIKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja Y1QyCQAAASYAqAplbmRzdHJlYW0KZW5kb2JqCgoxMDA1IDAgb2JqCjw8Ci9U eXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xMDA1Ci9X aWR0aCAyOQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JT cGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA3IDxlOWM2YmNkMTNjM2RjZjJj MzJkNDUzNGNmY2ZiZjdkMGFjN2RlNWE3OTljZTdmNGE+XQovTGVuZ3RoIDIz Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUVFJSMnA1UlJz KRJScAAAEjUCoAplbmRzdHJlYW0KZW5kb2JqCgoxMDA2IDAgb2JqCjw8Ci9U eXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xMDA2Ci9X aWR0aCA4Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNw YWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMgPGZjZmJmN2Y4ZWVkYWViY2Q5 N2YyZTBiNz5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4K c3RyZWFtCnjak/4LAAE1ARkKZW5kc3RyZWFtCmVuZG9iagoKMTAwNyAwIG9i ago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0lt MTAwNwovV2lkdGggMTMKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQK L0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNCA8ZmNmYmY3ZTVh Nzk5Y2YyYzMyZTE4ODdhZjJlMGI3Pl0KL0xlbmd0aCAxMwovRmlsdGVyIC9G bGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVAICZQcAAvgA7QplbmRzdHJlYW0K ZW5kb2JqCgoxMDA4IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBl IC9JbWFnZQovTmFtZSAvSW0xMDA4Ci9XaWR0aCA4Ci9IZWlnaHQgMQovQml0 c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNl UkdCIDMgPGZjZmJmN2U1YTc5OWNmMmMzMmYyZTBiNz5dCi9MZW5ndGggMTAK L0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjak1oDAADiAMcKZW5k c3RyZWFtCmVuZG9iagoKMTAwOSAwIG9iago8PAovVHlwZSAvWE9iamVjdAov U3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTAwOQovV2lkdGggMjgKL0hlaWdo dCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVk IC9EZXZpY2VSR0IgMTAgPGZjZmJmN2Q4NmE2MmNmMmMzMmViY2Q5N2NiOGQ3 OWQ0NTM0Y2QxM2MzZGU5YzZiY2QwYWM3ZGNlN2Y0YWU1YTc5OT5dCi9MZW5n dGggMjIKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1RSZnBS ElVSSueYpKQFAA3pAlEKZW5kc3RyZWFtCmVuZG9iagoKMTAxMCAwIG9iago8 PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTAx MAovV2lkdGggNwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29s b3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA0IDxmOGVlZGFkNDUzNGNj ZjJjMzJkMTNjM2RmY2ZiZjc+XQovTGVuZ3RoIDEyCi9GaWx0ZXIgL0ZsYXRl RGVjb2RlCj4+CnN0cmVhbQp42mNUVnIAAAD1AIcKZW5kc3RyZWFtCmVuZG9i agoKMTAxMSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1h Z2UKL05hbWUgL0ltMTAxMQovV2lkdGggOAovSGVpZ2h0IDEKL0JpdHNQZXJD b21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAz IDxmY2ZiZjdmOGVlZGFlYmNkOTdmMmUwYjc+XQovTGVuZ3RoIDEwCi9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42pO+AgABDADwCmVuZHN0cmVh bQplbmRvYmoKCjEwMTIgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5 cGUgL0ltYWdlCi9OYW1lIC9JbTEwMTIKL1dpZHRoIDE1Ci9IZWlnaHQgMQov Qml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2 aWNlUkdCIDggPGZjZmJmN2Y4ZWVkYWYyZTBiN2Q4NmE2MmNmMmMzMmQxM2Mz ZGUxODg3YWNiOGQ3OWQwYWM3ZD5dCi9MZW5ndGggMTYKL0ZpbHRlciAvRmxh dGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1R2cU0rrxAAAAfzAhMKZW5kc3RyZWFt CmVuZG9iagoKMTAxMyAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlw ZSAvSW1hZ2UKL05hbWUgL0ltMTAxMwovV2lkdGggNwovSGVpZ2h0IDEKL0Jp dHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rldmlj ZVJHQiAzIDxmY2ZiZjdkODZhNjJjZjJjMzJmOGVlZGE+XQovTGVuZ3RoIDEw Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42pNaAwAA4gDHCmVu ZHN0cmVhbQplbmRvYmoKCjEwMTQgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QK L1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTEwMTQKL1dpZHRoIDYKL0hlaWdo dCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVk IC9EZXZpY2VSR0IgMyA8ZjhlZWRhZDEzYzNkY2YyYzMyZWJkZWQ3Pl0KL0xl bmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqT2gAA AOYAywplbmRzdHJlYW0KZW5kb2JqCgoxMDE1IDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xMDE1Ci9XaWR0aCAy OAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiA3IDxmOGVlZGFkNDUzNGNjZjJjMzJlNWE3 OTljZTdmNGFlMTg4N2FmY2ZiZjdlYmNkOTc+XQovTGVuZ3RoIDIyCi9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUUnZSUgorVVIyM1JSBQAS BgKLCmVuZHN0cmVhbQplbmRvYmoKCjEwMTYgMCBvYmoKPDwKL1R5cGUgL1hP YmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTEwMTYKL1dpZHRoIDcK L0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9J bmRleGVkIC9EZXZpY2VSR0IgMiA8ZmNmYmY3ZjhlZWRhZjJlMGI3Pl0KL0xl bmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTdAAA AHQAWgplbmRzdHJlYW0KZW5kb2JqCgoxMDE3IDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xMDE3Ci9XaWR0aCAx NQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiA4IDxmOGVlZGFlYmNkOTdlOWM2YmNkMTNj M2RjZjJjMzJkODZhNjJjZGExNGFlM2FlNWFmY2ZiZjc+XQovTGVuZ3RoIDE2 Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUdnEVS0tvAAAG zgIRCmVuZHN0cmVhbQplbmRvYmoKCjEwMTggMCBvYmoKPDwKL1R5cGUgL1hP YmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTEwMTgKL1dpZHRoIDcK L0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9J bmRleGVkIC9EZXZpY2VSR0IgMiA8ZjhlZWRhZDEzYzNkY2YyYzMyPl0KL0xl bmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTmgAA AMYAqwplbmRzdHJlYW0KZW5kb2JqCgoxMDE5IDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xMDE5Ci9XaWR0aCA2 Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsv SW5kZXhlZCAvRGV2aWNlUkdCIDMgPGU5YzZiY2NmMmMzMmQxM2MzZGY4ZWVk YT5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFt CnjaE90AAADcAMYKZW5kc3RyZWFtCmVuZG9iagoKMTAyMCAwIG9iago8PAov VHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTAyMAov V2lkdGggMjgKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgOSA8ZWJkZWQ3ZDEzYzNkY2Yy YzMyZDBhYzdkZTljNmJjZDQ1MzRjZmNmYmY3ZjJlMGI3ZDg2YTYyZTE4ODdh Pl0KL0xlbmd0aCAyMgovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0K eNpjVFJ2UlIKKw9SkhBSnAAAEsUC6QplbmRzdHJlYW0KZW5kb2JqCgoxMDIx IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFt ZSAvSW0xMDIxCi9XaWR0aCA0Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVu dCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEgPGZjZmJm N2Y4ZWVkYT5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+Pgpz dHJlYW0KeNoTAQAAFQAVCmVuZHN0cmVhbQplbmRvYmoKCjEwMjIgMCBvYmoK PDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTEw MjIKL1dpZHRoIDE2Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9D b2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDYgPGZjZmJmN2ViYzE3 N2YyZTBiN2U1YTc5OWNmMmMzMmViZGVkN2Y4ZWVkYT5dCi9MZW5ndGggMTYK L0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1R2cTFVCksAAAY3 AboKZW5kc3RyZWFtCmVuZG9iagoKMTAyMyAwIG9iago8PAovVHlwZSAvWE9i amVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTAyMwovV2lkdGggNwov SGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0lu ZGV4ZWQgL0RldmljZVJHQiAzIDxlOWM2YmNjZjJjMzJkNDUzNGNmY2ZiZjc+ XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4 2hPNAQAAmACCCmVuZHN0cmVhbQplbmRvYmoKCjEwMjQgMCBvYmoKPDwKL1R5 cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTEwMjQKL1dp ZHRoIDcKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3Bh Y2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8ZmNmYmY3ZDg2YTYyY2YyYzMy Pl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0K eNqTmgAAAMYAqwplbmRzdHJlYW0KZW5kb2JqCgoxMDI1IDAgb2JqCjw8Ci9U eXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xMDI1Ci9X aWR0aCAyOAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JT cGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxMSA8ZDBhYzdkY2YyYzMyZWJk ZWQ3ZDEzYzNkZmNmYmY3ZjhlZWRhZWJjMTc3ZTNhZTVhZDQ1MzRjZDg2YTYy ZTVhNzk5ZWJjZDk3Pl0KL0xlbmd0aCAyMgovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNpjFBRSFhQ0CasQFBSctQUADhMC7QplbmRzdHJlYW0K ZW5kb2JqCgoxMDI2IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBl IC9JbWFnZQovTmFtZSAvSW0xMDI2Ci9XaWR0aCAxMQovSGVpZ2h0IDEKL0Jp dHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rldmlj ZVJHQiA2IDxmY2ZiZjdlYmNkOTdlYmMxNzdmOGVlZGFkODZhNjJjZjJjMzJm MmUwYjc+XQovTGVuZ3RoIDE0Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0 cmVhbQp42mNUdg0NYwAAA3oBFQplbmRzdHJlYW0KZW5kb2JqCgoxMDI3IDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW0xMDI3Ci9XaWR0aCA0NgovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg NAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxNSA8ZmNmYmY3 ZjhlZWRhZTljNmJjY2YyYzMyZWJjZDk3ZDg2YTYyZDEzYzNkZTVhNzk5ZWJk ZWQ3ZTE4ODdhZTNhZTVhY2RhMTRhY2I4ZDc5ZDQ1MzRjZDBhYzdkZWJjMTc3 Pl0KL0xlbmd0aCAzMQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0K eNpjZDI2NlE1NitgNTZumGxszLD66LXUug8APn4HmQplbmRzdHJlYW0KZW5k b2JqCgoxMDI4IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9J bWFnZQovTmFtZSAvSW0xMDI4Ci9XaWR0aCA1Ci9IZWlnaHQgMQovQml0c1Bl ckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdC IDIgPGZjZmJmN2JiYjRjNmViZGVkNz5dCi9MZW5ndGggMTAKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjak2AAAAAyABkKZW5kc3RyZWFtCmVu ZG9iagoKMTAyOSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAv SW1hZ2UKL05hbWUgL0ltMTAyOQovV2lkdGggMzMKL0hlaWdodCAxCi9CaXRz UGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VS R0IgMTIgPGY4ZWVkYWViY2Q5N2UzYWU1YWYyZTBiN2ViZGVkN2QxM2MzZGNm MmMzMmViYzE3N2U5YzZiY2U1YTc5OWUxODg3YWQ4NmE2MmZjZmJmNz5dCi9M ZW5ndGggMjMKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1R2 TUur6Fy98EQaCEQyAAA54QaiCmVuZHN0cmVhbQplbmRvYmoKCjEwMzAgMCBv YmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9J bTEwMzAKL1dpZHRoIDI3Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0 Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDExIDxlYmRlZDdk MTNjM2RjZjJjMzJmOGVlZGFmY2ZiZjdkMGFjN2RkODZhNjJkNDUzNGNmMmUw YjdhYjg0MzRiOTk4NWNlYmMxNzc+XQovTGVuZ3RoIDIyCi9GaWx0ZXIgL0Zs YXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUUjIJK0sz6Zy1NHSHAwAdQwT1CmVu ZHN0cmVhbQplbmRvYmoKCjEwMzEgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QK L1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTEwMzEKL1dpZHRoIDU4Ci9IZWln aHQgMQovQml0c1BlckNvbXBvbmVudCA4Ci9Db2xvclNwYWNlIFsvSW5kZXhl ZCAvRGV2aWNlUkdCIDE3IDxmY2ZiZjdlYmRlZDc0NjQzNzllYmMxNzdlMWE5 M2JlNWE3OTljZjJjMzJlMTg4N2FjZGExNGFlYmNkOTdkMTNjM2RkODZhNjJl OWM2YmNmOGVlZGFjYjhkNzlhYjg0MzRkMGFjN2RlM2FlNWE+XQovTGVuZ3Ro IDQ4Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42kXGyREAIAgE sEU81hv7b1YezphXIEHgNCpS/gpR23vro06kvhxkk7RjuCBUAXoKZW5kc3Ry ZWFtCmVuZG9iagoKMTAzMiAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3Vi dHlwZSAvSW1hZ2UKL05hbWUgL0ltMTAzMgovV2lkdGggOAovSGVpZ2h0IDEK L0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rl dmljZVJHQiA2IDxmOGVlZGFkMGFjN2RjZGExNGFlM2FlNWFlYmNkOTdmMmUw YjdmY2ZiZjc+XQovTGVuZ3RoIDEyCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+ CnN0cmVhbQp42mNUMgkDAAEsAK4KZW5kc3RyZWFtCmVuZG9iagoKMTAzMyAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltMTAzMwovV2lkdGggMjYKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50 IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMTAgPGViZGVk NzI3Mjg2NTc3NmM4ZWZjZmJmN2ViYzE3N2YyZTBiN2QxM2MzZGNmMmMzMmU1 YTc5OWViY2Q5N2QwYWM3ZD5dCi9MZW5ndGggMTkKL0ZpbHRlciAvRmxhdGVE ZWNvZGUKPj4Kc3RyZWFtCnjaY1Q2NnYJTi8HgoxZABeCBGcKZW5kc3RyZWFt CmVuZG9iagoKMTAzNCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlw ZSAvSW1hZ2UKL05hbWUgL0ltMTAzNAovV2lkdGggMTMKL0hlaWdodCAxCi9C aXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZp Y2VSR0IgOCA8ZWJjZDk3Yjk5ODVjZDg2YTYyZDQ1MzRjZTE4ODdhY2I4ZDc5 ZDBhYzdkYWI4NDM0ZWJkZWQ3Pl0KL0xlbmd0aCAxNQovRmlsdGVyIC9GbGF0 ZURlY29kZQo+PgpzdHJlYW0KeNpjVDY2CRNvAAAEXwF5CmVuZHN0cmVhbQpl bmRvYmoKCjEwMzUgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTEwMzUKL1dpZHRoIDE2Ci9IZWlnaHQgMQovQml0 c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNl UkdCIDYgPGZjZmJmN2QwYWM3ZGNkYTE0YWUzYWU1YWViY2Q5N2ViYzE3N2Yy ZTBiNz5dCi9MZW5ndGggMTYKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3Ry ZWFtCnjaY1Q2NmAJcUsAAAUfAYYKZW5kc3RyZWFtCmVuZG9iagoKMTAzNiAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltMTAzNgovV2lkdGggNwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg MgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxIDxmY2ZiZjdm OGVlZGE+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0 cmVhbQp42mMNAAAAXABWCmVuZHN0cmVhbQplbmRvYmoKCjEwMzcgMCBvYmoK PDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTEw MzcKL1dpZHRoIDI3Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9D b2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDE1IDxmY2ZiZjc0NjQz NzkyNzI4NjViYmI0YzZlYmRlZDdlNWE3OTlmOGVlZGFlOWM2YmNjZjJjMzJk MTNjM2RkNDUzNGNkODZhNjJlMTg4N2FkMGFjN2RlYmNkOTdmMmUwYjc+XQov TGVuZ3RoIDIyCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNU ZmBwTajonLlq9dn3DAAdTQV1CmVuZHN0cmVhbQplbmRvYmoKCjEwMzggMCBv YmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9J bTEwMzgKL1dpZHRoIDEyCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0 Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDUgPGY4ZWVkYWUz YWU1YWQwYWM3ZGI5OTg1Y2NkYTE0YWViZGVkNz5dCi9MZW5ndGggMTQKL0Zp bHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1QyUnFRBQAClwDjCmVu ZHN0cmVhbQplbmRvYmoKCjEwMzkgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QK L1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTEwMzkKL1dpZHRoIDcKL0hlaWdo dCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVk IC9EZXZpY2VSR0IgMiA8ZjhlZWRhZWJjZDk3ZjJlMGI3Pl0KL0xlbmd0aCAx MAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTYgAAADYAGwpl bmRzdHJlYW0KZW5kb2JqCgoxMDQwIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0 Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xMDQwCi9XaWR0aCA4Ci9IZWln aHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhl ZCAvRGV2aWNlUkdCIDUgPGViZGVkN2U1YTc5OWQ4NmE2MmQ0NTM0Y2QxM2Mz ZGY4ZWVkYT5dCi9MZW5ndGggMTIKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4K c3RyZWFtCnjaY1R2MQUAAS4AngplbmRzdHJlYW0KZW5kb2JqCgoxMDQxIDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW0xMDQxCi9XaWR0aCAxMQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg NAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA1IDxlYmRlZDcy NzI4NjU5ODhmYWFmY2ZiZjdlNWE3OTllMTg4N2E+XQovTGVuZ3RoIDE0Ci9G aWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUNmZxZQAAAh0AoQpl bmRzdHJlYW0KZW5kb2JqCgoxMDQyIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0 Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xMDQyCi9XaWR0aCAxNAovSGVp Z2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4 ZWQgL0RldmljZVJHQiA2IDxlNWE3OTljYjhkNzlkMGFjN2RiOTk4NWNjZGEx NGFhYjg0MzRmY2ZiZjc+XQovTGVuZ3RoIDE1Ci9GaWx0ZXIgL0ZsYXRlRGVj b2RlCj4+CnN0cmVhbQp42mMUUlJWcVUDAALMAOgKZW5kc3RyZWFtCmVuZG9i agoKMTA0MyAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1h Z2UKL05hbWUgL0ltMTA0MwovV2lkdGggOQovSGVpZ2h0IDEKL0JpdHNQZXJD b21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAz IDxmY2ZiZjdmMmUwYjdlYmNkOTdlYmMxNzc+XQovTGVuZ3RoIDExCi9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42pN6yQAAAiMBBAplbmRzdHJl YW0KZW5kb2JqCgoxMDQ0IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0 eXBlIC9JbWFnZQovTmFtZSAvSW0xMDQ0Ci9XaWR0aCAxNAovSGVpZ2h0IDEK L0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rl dmljZVJHQiA2IDxmY2ZiZjdmOGVlZGFlYmRlZDdlYmNkOTdlNWE3OTljZTdm NGFkODZhNjI+XQovTGVuZ3RoIDE1Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+ CnN0cmVhbQp42mNgFFR2CXMEAAKnAREKZW5kc3RyZWFtCmVuZG9iagoKMTA0 NSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05h bWUgL0ltMTA0NQovV2lkdGggOQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25l bnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDxmY2Zi ZjdkMTNjM2RjZjJjMzI+XQovTGVuZ3RoIDExCi9GaWx0ZXIgL0ZsYXRlRGVj b2RlCj4+CnN0cmVhbQp42pNaxQAAAaUAxQplbmRzdHJlYW0KZW5kb2JqCgox MDQ2IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQov TmFtZSAvSW0xMDQ2Ci9XaWR0aCAxMQovSGVpZ2h0IDEKL0JpdHNQZXJDb21w b25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA1IDxi YmI0YzY0NjQzNzlmY2ZiZjdlOWM2YmNkODZhNjJkNDUzNGM+XQovTGVuZ3Ro IDE0Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNkUnZ1MQAA AikA4AplbmRzdHJlYW0KZW5kb2JqCgoxMDQ3IDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xMDQ3Ci9XaWR0aCAx MwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiA1IDxlM2FlNWFjZGExNGFlYmMxNzdlYmNk OTdmMmUwYjdmY2ZiZjc+XQovTGVuZ3RoIDE1Ci9GaWx0ZXIgL0ZsYXRlRGVj b2RlCj4+CnN0cmVhbQp42mNkYGBSNgkAAAE3AKsKZW5kc3RyZWFtCmVuZG9i agoKMTA0OCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1h Z2UKL05hbWUgL0ltMTA0OAovV2lkdGggMTkKL0hlaWdodCAxCi9CaXRzUGVy Q29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0Ig OCA8ZTljNmJjZTVhNzk5ZmNmYmY3ZjJlMGI3ZDBhYzdkZDg2YTYyZDEzYzNk Y2YyYzMyZjhlZWRhPl0KL0xlbmd0aCAxOAovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNpjFFB2TSsvL49QAAAMZwK9CmVuZHN0cmVhbQplbmRv YmoKCjEwNDkgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0lt YWdlCi9OYW1lIC9JbTEwNDkKL1dpZHRoIDkKL0hlaWdodCAxCi9CaXRzUGVy Q29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0Ig NSA8ZjhlZWRhZDg2YTYyY2YyYzMyZDQ1MzRjZTE4ODdhZTVhNzk5Pl0KL0xl bmd0aCAxMwovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVDIR DAAAAaAAuQplbmRzdHJlYW0KZW5kb2JqCgoxMDUwIDAgb2JqCjw8Ci9UeXBl IC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xMDUwCi9XaWR0 aCAxMQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFj ZSBbL0luZGV4ZWQgL0RldmljZVJHQiA3IDxlYmRlZDc0NjQzNzliYmI0YzZm OGVlZGFkODZhNjJjZjJjMzJkMTNjM2RlOWM2YmM+XQovTGVuZ3RoIDE0Ci9G aWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUZgkNKwAAAuYBRApl bmRzdHJlYW0KZW5kb2JqCgoxMDUxIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0 Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xMDUxCi9XaWR0aCAxMQovSGVp Z2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4 ZWQgL0RldmljZVJHQiAxIDxmOGVlZGFmY2ZiZjc+XQovTGVuZ3RoIDExCi9G aWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMQDQEAAIEAagplbmRz dHJlYW0KZW5kb2JqCgoxMDUyIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9T dWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xMDUyCi9XaWR0aCA1Ci9IZWlnaHQg MQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAv RGV2aWNlUkdCIDEgPGZjZmJmN2Y4ZWVkYT5dCi9MZW5ndGggMTAKL0ZpbHRl ciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY2UAAAAMAAYKZW5kc3RyZWFt CmVuZG9iagoKMTA1MyAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlw ZSAvSW1hZ2UKL05hbWUgL0ltMTA1MwovV2lkdGggOQovSGVpZ2h0IDEKL0Jp dHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rldmlj ZVJHQiA2IDxmY2ZiZjdlYmRlZDdmMmUwYjdlNWE3OTllMTg4N2FkODZhNjJm OGVlZGE+XQovTGVuZ3RoIDEzCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0 cmVhbQp42mNUdnVjAAAB8QCwCmVuZHN0cmVhbQplbmRvYmoKCjEwNTQgMCBv YmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9J bTEwNTQKL1dpZHRoIDE5Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0 Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEwIDxmY2ZiZjdk NDUzNGNjZjJjMzJkODZhNjJmMmUwYjdlYmMxNzdkMGFjN2Q5ZDRlM2VkMTNj M2RlMTg4N2FlYmRlZDc+XQovTGVuZ3RoIDE4Ci9GaWx0ZXIgL0ZsYXRlRGVj b2RlCj4+CnN0cmVhbQp42mNUMgkrUlLSmMUAAArKAiYKZW5kc3RyZWFtCmVu ZG9iagoKMTA1NSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAv SW1hZ2UKL05hbWUgL0ltMTA1NQovV2lkdGggMTAKL0hlaWdodCAxCi9CaXRz UGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VS R0IgNyA8ZjhlZWRhZDg2YTYyY2YyYzMyZTE4ODdhZWJjZDk3Y2RhMTRhYjk5 ODVjZWJjMTc3Pl0KL0xlbmd0aCAxMwovRmlsdGVyIC9GbGF0ZURlY29kZQo+ PgpzdHJlYW0KeNpjVDIJCwcAAjEBBQplbmRzdHJlYW0KZW5kb2JqCgoxMDU2 IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFt ZSAvSW0xMDU2Ci9XaWR0aCAxMQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25l bnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA4IDxmY2Zi Zjc3NzZjOGViYmI0YzZlOWM2YmNlNWE3OTljZjJjMzJhMzJjMmRkMTNjM2Rm OGVlZGE+XQovTGVuZ3RoIDE0Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0 cmVhbQp42mNUdk1NbwAABEwBtgplbmRzdHJlYW0KZW5kb2JqCgoxMDU3IDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW0xMDU3Ci9XaWR0aCA5Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0 Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDYgPGZjZmJmN2Y4 ZWVkYWU5YzZiY2UxODg3YWQ0NTM0Y2QxM2MzZGU1YTc5OT5dCi9MZW5ndGgg MTMKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1R2dWMAAAHx ALAKZW5kc3RyZWFtCmVuZG9iagoKMTA1OCAwIG9iago8PAovVHlwZSAvWE9i amVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTA1OAovV2lkdGggOQov SGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0lu ZGV4ZWQgL0RldmljZVJHQiA0IDxmY2ZiZjdiOTk4NWNjZGExNGFkODZhNjJj ZjJjMzI+XQovTGVuZ3RoIDEzCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0 cmVhbQp42mNUdnFmAAAB6ACsCmVuZHN0cmVhbQplbmRvYmoKCjEwNTkgMCBv YmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9J bTEwNTkKL1dpZHRoIDE5Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0 Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDggPGZjZmJmN2Qx M2MzZGNmMmMzMmQ4NmE2MmViZGVkN2YyZTBiN2NlN2Y0YWQwYWM3ZGNiOGQ3 OT5dCi9MZW5ndGggMTgKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFt CnjaY1QyYU1SMm8vYQAACVgCEwplbmRzdHJlYW0KZW5kb2JqCgoxMDYwIDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW0xMDYwCi9XaWR0aCAxMQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg NAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA2IDxmY2ZiZjdl MTg4N2FjZjJjMzJlNWE3OTllYmMxNzdiOTk4NWNlYmNkOTc+XQovTGVuZ3Ro IDE0Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUUnYNYwAA Ar0A4gplbmRzdHJlYW0KZW5kb2JqCgoxMDYxIDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xMDYxCi9XaWR0aCAx MQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiA1IDxmY2ZiZjdlOWM2YmNiYmI0YzZlNWE3 OTlkNDUzNGNhMzJjMmQ+XQovTGVuZ3RoIDE0Ci9GaWx0ZXIgL0ZsYXRlRGVj b2RlCj4+CnN0cmVhbQp42mMQVHYNNQAAApAA/wplbmRzdHJlYW0KZW5kb2Jq CgoxMDYyIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFn ZQovTmFtZSAvSW0xMDYyCi9XaWR0aCA4Ci9IZWlnaHQgMQovQml0c1BlckNv bXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDUg PGZjZmJmN2Y4ZWVkYWViZGVkN2YyZTBiN2ViY2Q5N2U1YTc5OT5dCi9MZW5n dGggMTIKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1QyCQIA ASgAqgplbmRzdHJlYW0KZW5kb2JqCgoxMDYzIDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xMDYzCi9XaWR0aCAx OQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiA4IDxlMTg4N2FkMTNjM2RjZjJjMzJkODZh NjJmY2ZiZjdmMmUwYjdlYmMxNzdjZGExNGFlNWE3OTk+XQovTGVuZ3RoIDE4 Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUUlIycU1XUmoA AAibAgwKZW5kc3RyZWFtCmVuZG9iagoKMTA2NCAwIG9iago8PAovVHlwZSAv WE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTA2NAovV2lkdGgg NgovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiA0IDxmY2ZiZjdkMTNjM2RjZjJjMzJjYjhk NzlmOGVlZGE+XQovTGVuZ3RoIDExCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+ CnN0cmVhbQp42mNUMgEAAH4AWAplbmRzdHJlYW0KZW5kb2JqCgoxMDY1IDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW0xMDY1Ci9XaWR0aCAxMQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg NAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA2IDxlYmNkOTdk NDUzNGNjZjJjMzJjYjhkNzljZGExNGFlYmRlZDdmY2ZiZjc+XQovTGVuZ3Ro IDE0Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUUnZxTQAA AvgBMAplbmRzdHJlYW0KZW5kb2JqCgoxMDY2IDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xMDY2Ci9XaWR0aCAx MQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiA2IDxmY2ZiZjdlYmNkOTdkMTNjM2RjZjJj MzJkODZhNjJlNWE3OTlmMmUwYjc+XQovTGVuZ3RoIDE0Ci9GaWx0ZXIgL0Zs YXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUNjYJYwAAAs8A4gplbmRzdHJlYW0K ZW5kb2JqCgoxMDY3IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBl IC9JbWFnZQovTmFtZSAvSW0xMDY3Ci9XaWR0aCA5Ci9IZWlnaHQgMQovQml0 c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNl UkdCIDEgPGZjZmJmN2Y4ZWVkYT5dCi9MZW5ndGggMTEKL0ZpbHRlciAvRmxh dGVEZWNvZGUKPj4Kc3RyZWFtCnjaYxBlAAAALQAWCmVuZHN0cmVhbQplbmRv YmoKCjEwNjggMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0lt YWdlCi9OYW1lIC9JbTEwNjgKL1dpZHRoIDE0Ci9IZWlnaHQgMQovQml0c1Bl ckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdC IDYgPGZjZmJmN2U1YTc5OWQ0NTM0Y2QxM2MzZGNmMmMzMmNiOGQ3OWEzMmMy ZD5dCi9MZW5ndGggMTUKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFt CnjaY1QyEU0LYAAABAQBIwplbmRzdHJlYW0KZW5kb2JqCgoxMDY5IDAgb2Jq Cjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0x MDY5Ci9XaWR0aCA3Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9D b2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPGZjZmJmN2Y4ZWVk YWViZGVkNz5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4K c3RyZWFtCnjaY00BAABwAGoKZW5kc3RyZWFtCmVuZG9iagoKMTA3MCAwIG9i ago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0lt MTA3MAovV2lkdGggOQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAov Q29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA0IDxmY2ZiZjdiOTk4 NWNkMTNjM2RjZjJjMzJlMTg4N2E+XQovTGVuZ3RoIDEzCi9GaWx0ZXIgL0Zs YXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUNjZhAAABlwCMCmVuZHN0cmVhbQpl bmRvYmoKCjEwNzEgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTEwNzEKL1dpZHRoIDEyCi9IZWlnaHQgMQovQml0 c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNl UkdCIDUgPGY4ZWVkYWNmMmMzMmQxM2MzZGQ4NmE2MmU1YTc5OWZjZmJmNz5d Ci9MZW5ndGggMTQKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja YxRUFhR0BQABhwCdCmVuZHN0cmVhbQplbmRvYmoKCjEwNzIgMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTEwNzIK L1dpZHRoIDgKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8ZjhlZWRhY2U3ZjRhY2Yy YzMyZDQ1MzRjPl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+ PgpzdHJlYW0KeNqTWgMAAOIAxwplbmRzdHJlYW0KZW5kb2JqCgoxMDczIDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW0xMDczCi9XaWR0aCA2Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0 Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDQgPGY4ZWVkYWQx M2MzZGNmMmMzMmU1YTc5OWZjZmJmNz5dCi9MZW5ndGggMTEKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1Q0AQAAfABXCmVuZHN0cmVhbQpl bmRvYmoKCjEwNzQgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTEwNzQKL1dpZHRoIDEwCi9IZWlnaHQgMQovQml0 c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNl UkdCIDcgPGQwYWM3ZDlkNGUzZWNmMmMzMmQxM2MzZGNiOGQ3OWYyZTBiN2Y4 ZWVkYWZjZmJmNz5dCi9MZW5ndGggMTMKL0ZpbHRlciAvRmxhdGVEZWNvZGUK Pj4Kc3RyZWFtCnjaY1QyCU0HAAI/ARQKZW5kc3RyZWFtCmVuZG9iagoKMTA3 NSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05h bWUgL0ltMTA3NQovV2lkdGggMTIKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9u ZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNSA8ZmNm YmY3Y2RhMTRhY2YyYzMyZDEzYzNkZTE4ODdhZWJkZWQ3Pl0KL0xlbmd0aCAx NAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVFJSUnYFAAIv ANAKZW5kc3RyZWFtCmVuZG9iagoKMTA3NiAwIG9iago8PAovVHlwZSAvWE9i amVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTA3NgovV2lkdGggMTAK L0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9J bmRleGVkIC9EZXZpY2VSR0IgNiA8ZmNmYmY3ZWJjZDk3ZTE4ODdhZDg2YTYy ZDQ1MzRjZDEzYzNkZjhlZWRhPl0KL0xlbmd0aCAxMwovRmlsdGVyIC9GbGF0 ZURlY29kZQo+PgpzdHJlYW0KeNpjVDYJVQMAAgIA1AplbmRzdHJlYW0KZW5k b2JqCgoxMDc3IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9J bWFnZQovTmFtZSAvSW0xMDc3Ci9XaWR0aCAyMwovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiA4IDxlOWM2YmNjZjJjMzJlNWE3OTlkMGFjN2RjYjhkNzllMTg4N2FkODZh NjJmY2ZiZjdkMTNjM2Q+XQovTGVuZ3RoIDIwCi9GaWx0ZXIgL0ZsYXRlRGVj b2RlCj4+CnN0cmVhbQp42mMUFFR2CU0qzuhoKgAAEGIDlwplbmRzdHJlYW0K ZW5kb2JqCgoxMDc4IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBl IC9JbWFnZQovTmFtZSAvSW0xMDc4Ci9XaWR0aCA5Ci9IZWlnaHQgMQovQml0 c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNl UkdCIDUgPGZjZmJmN2QwYWM3ZGQxM2MzZGNmMmMzMmNiOGQ3OWY4ZWVkYT5d Ci9MZW5ndGggMTMKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja Y1Q2NgkAAAHnANwKZW5kc3RyZWFtCmVuZG9iagoKMTA3OSAwIG9iago8PAov VHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTA3OQov V2lkdGggMTMKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNiA8ZWJkZWQ3ZDQ1MzRjY2Yy YzMyZjJlMGI3ZDBhYzdkZDg2YTYyZjhlZWRhPl0KL0xlbmd0aCAxNQovRmls dGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVBJ2VVJMAAADVQEfCmVu ZHN0cmVhbQplbmRvYmoKCjEwODAgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QK L1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTEwODAKL1dpZHRoIDI2Ci9IZWln aHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhl ZCAvRGV2aWNlUkdCIDExIDxmMmUwYjdkNDUzNGNjZjJjMzJlMTg4N2FmY2Zi ZjdmOGVlZGFlOWM2YmNiOTk4NWNkMTNjM2RkMGFjN2RlNWE3OTllYmRlZDc+ XQovTGVuZ3RoIDIxCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4 2mNUUlJ2VRJzqVDqTFsNABAnA14KZW5kc3RyZWFtCmVuZG9iagoKMTA4MSAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltMTA4MQovV2lkdGggMTMKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50 IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNSA8ZTljNmJj ZTNhZTVhZDQ1MzRjY2YyYzMyZDEzYzNkZmNmYmY3Pl0KL0xlbmd0aCAxNQov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVDY2NjYJAAAD/AFC CmVuZHN0cmVhbQplbmRvYmoKCjEwODIgMCBvYmoKPDwKL1R5cGUgL1hPYmpl Y3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTEwODIKL1dpZHRoIDExCi9I ZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5k ZXhlZCAvRGV2aWNlUkdCIDUgPGZjZmJmN2UzYWU1YWQ0NTM0Y2NmMmMzMmQx M2MzZGViZGVkNz5dCi9MZW5ndGggMTQKL0ZpbHRlciAvRmxhdGVEZWNvZGUK Pj4Kc3RyZWFtCnjaY1Q2NnZlAAACqgDQCmVuZHN0cmVhbQplbmRvYmoKCjEw ODMgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9O YW1lIC9JbTEwODMKL1dpZHRoIDI0Ci9IZWlnaHQgMQovQml0c1BlckNvbXBv bmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDkgPGY4 ZWVkYWQxM2MzZGNmMmMzMmViY2Q5N2ViZGVkN2ZjZmJmN2U1YTc5OWQ4NmE2 MmQwYWM3ZGNlN2Y0YT5dCi9MZW5ndGggMjAKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjaY1RSUnZNUirtVFJKBQAPOwLZCmVuZHN0cmVhbQpl bmRvYmoKCjEwODQgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTEwODQKL1dpZHRoIDgKL0hlaWdodCAxCi9CaXRz UGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VS R0IgMyA8ZmNmYmY3Y2YyYzMyZDQ1MzRjZWJjZDk3Pl0KL0xlbmd0aCAxMAov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTzQEAAJgAggplbmRz dHJlYW0KZW5kb2JqCgoxMDg1IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9T dWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xMDg1Ci9XaWR0aCAyOQovSGVpZ2h0 IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQg L0RldmljZVJHQiAxMSA8ZjhlZWRhZDQ1MzRjY2YyYzMyZTVhNzk5ZWJjZDk3 ZDBhYzdkZTE4ODdhZDEzYzNkZmNmYmY3ZWJkZWQ3ZDg2YTYyZTljNmJjPl0K L0xlbmd0aCAyMwovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpj VFJ2TVIqaSlSUqqcpLUBAB3tBKMKZW5kc3RyZWFtCmVuZG9iagoKMTA4NiAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltMTA4NgovV2lkdGggMTEKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50 IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNCA8ZmNmYmY3 YWI4NDM0Y2YyYzMyZDEzYzNkZjhlZWRhPl0KL0xlbmd0aCAxNAovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVFIyUnIAAAJYANoKZW5kc3Ry ZWFtCmVuZG9iagoKMTA4NyAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3Vi dHlwZSAvSW1hZ2UKL05hbWUgL0ltMTA4NwovV2lkdGggMTMKL0hlaWdodCAx Ci9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9E ZXZpY2VSR0IgNSA8ZjJlMGI3ZTljNmJjZTVhNzk5ZDQ1MzRjY2YyYzMyZjhl ZWRhPl0KL0xlbmd0aCAxMwovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl YW0KeNpjVHYBggAABOgBhQplbmRzdHJlYW0KZW5kb2JqCgoxMDg4IDAgb2Jq Cjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0x MDg4Ci9XaWR0aCAxMAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAov Q29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA1IDxmOGVlZGFlMTg4 N2FjZjJjMzJkMTNjM2RlOWM2YmNmY2ZiZjc+XQovTGVuZ3RoIDEzCi9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUUlJ2BQABgwCuCmVuZHN0 cmVhbQplbmRvYmoKCjEwODkgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1 YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTEwODkKL1dpZHRoIDI0Ci9IZWlnaHQg MQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAv RGV2aWNlUkdCIDUgPGQ4NmE2MmNmMmMzMmViY2Q5N2ZjZmJmN2UxODg3YWNl N2Y0YT5dCi9MZW5ndGggMjAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3Ry ZWFtCnjaYxQUFDJ2FHQ2FRRUBgAIfwF4CmVuZHN0cmVhbQplbmRvYmoKCjEw OTAgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9O YW1lIC9JbTEwOTAKL1dpZHRoIDgKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9u ZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8ZmNm YmY3Y2YyYzMyZDg2YTYyZWJjZDk3Pl0KL0xlbmd0aCAxMAovRmlsdGVyIC9G bGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTzQEAAJgAggplbmRzdHJlYW0KZW5k b2JqCgoxMDkxIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9J bWFnZQovTmFtZSAvSW0xMDkxCi9XaWR0aCAzMAovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiAxMSA8ZmNmYmY3ZTE4ODdhY2YyYzMyZDg2YTYyZjJlMGI3ZjhlZWRhZDEz YzNkZWJjZDk3ZDBhYzdkZTljNmJjY2I4ZDc5ZWJkZWQ3Pl0KL0xlbmd0aCAy MwovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVFJ2CFRSK2hS UlKyVFoNABeMA34KZW5kc3RyZWFtCmVuZG9iagoKMTA5MiAwIG9iago8PAov VHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTA5Mgov V2lkdGggMTEKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNCA8ZjJlMGI3YTg2YTVkY2Yy YzMyZDEzYzNkZmNmYmY3Pl0KL0xlbmd0aCAxNAovRmlsdGVyIC9GbGF0ZURl Y29kZQo+PgpzdHJlYW0KeNpjVFJSNnYAAAJNANwKZW5kc3RyZWFtCmVuZG9i agoKMTA5MyAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1h Z2UKL05hbWUgL0ltMTA5MwovV2lkdGggMTMKL0hlaWdodCAxCi9CaXRzUGVy Q29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0Ig NiA8ZmNmYmY3ZWJjZDk3ZTNhZTVhZTE4ODdhZDEzYzNkY2YyYzMyZWJkZWQ3 Pl0KL0xlbmd0aCAxNQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0K eNpjVDIJDQ1NAAAFOwG3CmVuZHN0cmVhbQplbmRvYmoKCjEwOTQgMCBvYmoK PDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTEw OTQKL1dpZHRoIDkKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0Nv bG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNCA8ZTE4ODdhY2YyYzMy ZDEzYzNkZTljNmJjZjhlZWRhPl0KL0xlbmd0aCAxMwovRmlsdGVyIC9GbGF0 ZURlY29kZQo+PgpzdHJlYW0KeNpjFBRUdgAAAQcAhwplbmRzdHJlYW0KZW5k b2JqCgoxMDk1IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9J bWFnZQovTmFtZSAvSW0xMDk1Ci9XaWR0aCA5Ci9IZWlnaHQgMQovQml0c1Bl ckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdC IDIgPGZjZmJmN2NmMmMzMmYyZTBiNz5dCi9MZW5ndGggMTEKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaEw1tAAABbADrCmVuZHN0cmVhbQpl bmRvYmoKCjEwOTYgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTEwOTYKL1dpZHRoIDE1Ci9IZWlnaHQgMQovQml0 c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNl UkdCIDYgPGZjZmJmN2ViYzE3N2NiOGQ3OWQwYWM3ZGQ4NmE2MmNmMmMzMmVi Y2Q5Nz5dCi9MZW5ndGggMTYKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3Ry ZWFtCnjaY1Q2ZnANDWMAAAT2AUgKZW5kc3RyZWFtCmVuZG9iagoKMTA5NyAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltMTA5NwovV2lkdGggNwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg MgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAzIDxmY2ZiZjdj ZjJjMzJjYjhkNzllYmRlZDc+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRl RGVjb2RlCj4+CnN0cmVhbQp42hPNAQAAmACCCmVuZHN0cmVhbQplbmRvYmoK CjEwOTggMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdl Ci9OYW1lIC9JbTEwOTgKL1dpZHRoIDcKL0hlaWdodCAxCi9CaXRzUGVyQ29t cG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNCA8 ZTljNmJjZDEzYzNkY2YyYzMyZTVhNzk5ZWJkZWQ3Pl0KL0xlbmd0aCAxMgov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVFJ2AAAA9ACHCmVu ZHN0cmVhbQplbmRvYmoKCjEwOTkgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QK L1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTEwOTkKL1dpZHRoIDIyCi9IZWln aHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhl ZCAvRGV2aWNlUkdCIDcgPGY4ZWVkYWQ4NmE2MmNmMmMzMmQxM2MzZGViY2Q5 N2NlN2Y0YWUxODg3YWNiOGQ3OT5dCi9MZW5ndGggMTkKL0ZpbHRlciAvRmxh dGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1RSdghSVlJSUyoAAAoNAfgKZW5kc3Ry ZWFtCmVuZG9iagoKMTEwMCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3Vi dHlwZSAvSW1hZ2UKL05hbWUgL0ltMTEwMAovV2lkdGggMTEKL0hlaWdodCAx Ci9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9E ZXZpY2VSR0IgNiA8ZWJjZDk3OWQ0ZTNlY2YyYzMyZDg2YTYyZTVhNzk5ZDBh YzdkZmNmYmY3Pl0KL0xlbmd0aCAxNAovRmlsdGVyIC9GbGF0ZURlY29kZQo+ PgpzdHJlYW0KeNpjVFJ2DU0AAAMbAUEKZW5kc3RyZWFtCmVuZG9iagoKMTEw MSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05h bWUgL0ltMTEwMQovV2lkdGggMTMKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9u ZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNiA8ZmNm YmY3ZjJlMGI3YWI4NDM0ZTVhNzk5ZDg2YTYyY2YyYzMyZjhlZWRhPl0KL0xl bmd0aCAxNQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVFJ2 DQ1NAAAEpgGWCmVuZHN0cmVhbQplbmRvYmoKCjExMDIgMCBvYmoKPDwKL1R5 cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTExMDIKL1dp ZHRoIDEwCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNw YWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDQgPGZjZmJmN2Q0NTM0Y2NmMmMz MmU1YTc5OWY4ZWVkYT5dCi9MZW5ndGggMTMKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjaY1RSUjIBAAFwAJwKZW5kc3RyZWFtCmVuZG9iagoK MTEwMyAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UK L05hbWUgL0ltMTEwMwovV2lkdGggMTYKL0hlaWdodCAxCi9CaXRzUGVyQ29t cG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNyA8 ZTljNmJjY2YyYzMyZDQ1MzRjZjhlZWRhZmNmYmY3ZTNhZTVhY2RhMTRhYjk5 ODVjPl0KL0xlbmd0aCAxNgovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl YW0KeNpjFBQUMjFNSwcAA+kBbAplbmRzdHJlYW0KZW5kb2JqCgoxMTA0IDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW0xMTA0Ci9XaWR0aCA3Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0 Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDQgPGY4ZWVkYWQ0 NTM0Y2NmMmMzMmQxM2MzZGYyZTBiNz5dCi9MZW5ndGggMTIKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1RSdgAAAPQAhwplbmRzdHJlYW0K ZW5kb2JqCgoxMTA1IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBl IC9JbWFnZQovTmFtZSAvSW0xMTA1Ci9XaWR0aCA3Ci9IZWlnaHQgMQovQml0 c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNl UkdCIDQgPGY4ZWVkYWNmMmMzMmQxM2MzZGQwYWM3ZGZjZmJmNz5dCi9MZW5n dGggMTIKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYxRUdgAA AMEAdgplbmRzdHJlYW0KZW5kb2JqCgoxMTA2IDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xMTA2Ci9XaWR0aCA4 Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsv SW5kZXhlZCAvRGV2aWNlUkdCIDQgPGZjZmJmN2Q4NmE2MmNmMmMzMmQxM2Mz ZGQwYWM3ZD5dCi9MZW5ndGggMTIKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4K c3RyZWFtCnjaY1RSdgAAAPQAhwplbmRzdHJlYW0KZW5kb2JqCgoxMTA3IDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW0xMTA3Ci9XaWR0aCAyMgovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg NAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA4IDxmMmUwYjdk NDUzNGNjZjJjMzJlOWM2YmNlYmRlZDdlNWE3OTlkMTNjM2RkMGFjN2RmY2Zi Zjc+XQovTGVuZ3RoIDE5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVh bQp42mNUUjQRUlVSUlOqAAAH7wG0CmVuZHN0cmVhbQplbmRvYmoKCjExMDgg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTExMDgKL1dpZHRoIDEwCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVu dCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMgPGQwYWM3 ZGQxM2MzZGNmMmMzMmNkYTE0YT5dCi9MZW5ndGggMTEKL0ZpbHRlciAvRmxh dGVEZWNvZGUKPj4Kc3RyZWFtCnjak+r/AAACXwGaCmVuZHN0cmVhbQplbmRv YmoKCjExMDkgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0lt YWdlCi9OYW1lIC9JbTExMDkKL1dpZHRoIDE0Ci9IZWlnaHQgMQovQml0c1Bl ckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdC IDkgPGY4ZWVkYWViY2Q5N2YyZTBiN2I5OTg1Y2FiODQzNGViYzE3N2Q0NTM0 Y2NmMmMzMmQxM2MzZGZjZmJmNz5dCi9MZW5ndGggMTUKL0ZpbHRlciAvRmxh dGVEZWNvZGUKPj4Kc3RyZWFtCnjaY2QycU0v7wQABN4B5AplbmRzdHJlYW0K ZW5kb2JqCgoxMTEwIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBl IC9JbWFnZQovTmFtZSAvSW0xMTEwCi9XaWR0aCAyNwovSGVpZ2h0IDEKL0Jp dHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rldmlj ZVJHQiA4IDxlOWM2YmNkMTNjM2RjZjJjMzJlNWE3OTlmOGVlZGFkODZhNjJk MGFjN2RjZTdmNGFlYmNkOTc+XQovTGVuZ3RoIDIwCi9GaWx0ZXIgL0ZsYXRl RGVjb2RlCj4+CnN0cmVhbQp42mNUUlIycQQSYYWCgg0AEEYCrAplbmRzdHJl YW0KZW5kb2JqCgoxMTExIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0 eXBlIC9JbWFnZQovTmFtZSAvSW0xMTExCi9XaWR0aCA3Ci9IZWlnaHQgMQov Qml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2 aWNlUkdCIDMgPGU5YzZiY2NmMmMzMmQ0NTM0Y2Y4ZWVkYT5dCi9MZW5ndGgg MTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaE80BAACYAIIK ZW5kc3RyZWFtCmVuZG9iagoKMTExMiAwIG9iago8PAovVHlwZSAvWE9iamVj dAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTExMgovV2lkdGggNwovSGVp Z2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4 ZWQgL0RldmljZVJHQiA0IDxmMmUwYjdjZjJjMzJkMTNjM2RlYmNkOTdmY2Zi Zjc+XQovTGVuZ3RoIDEyCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVh bQp42mMUVHYAAADBAHYKZW5kc3RyZWFtCmVuZG9iagoKMTExMyAwIG9iago8 PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTEx MwovV2lkdGggOAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29s b3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA1IDxmOGVlZGFkMTNjM2Rj ZjJjMzJkODZhNjJlOWM2YmNmY2ZiZjc+XQovTGVuZ3RoIDEyCi9GaWx0ZXIg L0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUUnYFAAD5AIwKZW5kc3RyZWFt CmVuZG9iagoKMTExNCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlw ZSAvSW1hZ2UKL05hbWUgL0ltMTExNAovV2lkdGggMjEKL0hlaWdodCAxCi9C aXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZp Y2VSR0IgNyA8ZWJjZDk3Y2YyYzMyZTE4ODdhZWJkZWQ3OWQ0ZTNlZTljNmJj ZDg2YTYyZDEzYzNkPl0KL0xlbmd0aCAxOQovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNpjFBQycBRNFBQUDwAACAEBlQplbmRzdHJlYW0KZW5k b2JqCgoxMTE1IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9J bWFnZQovTmFtZSAvSW0xMTE1Ci9XaWR0aCAyNwovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiAxMyA8ZmNmYmY3Yjk5ODVjZDEzYzNkY2YyYzMyZTVhNzk5ZjJlMGI3ZWJj MTc3OWQ0ZTNlZDg2YTYyZTljNmJjZWJkZWQ3Y2RhMTRhY2I4ZDc5ZTE4ODdh Pl0KL0xlbmd0aCAyMgovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0K eNpjVDZyDQ1gq5gVfcjYlgEAGkoD5gplbmRzdHJlYW0KZW5kb2JqCgoxMTE2 IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFt ZSAvSW0xMTE2Ci9XaWR0aCAzNgovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25l bnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA5IDxmY2Zi ZjdlMTg4N2FjZjJjMzJlYmRlZDdkODZhNjJjYjhkNzllYmNkOTc5ZDRlM2Vk MTNjM2RlNWE3OTk+XQovTGVuZ3RoIDI0Ci9GaWx0ZXIgL0ZsYXRlRGVjb2Rl Cj4+CnN0cmVhbQp42mNUUlJSNAESqulKSp2MSkoOABkyAwEKZW5kc3RyZWFt CmVuZG9iagoKMTExNyAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlw ZSAvSW1hZ2UKL05hbWUgL0ltMTExNwovV2lkdGggNwovSGVpZ2h0IDEKL0Jp dHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rldmlj ZVJHQiA0IDxmY2ZiZjdlMTg4N2FjZjJjMzJkODZhNjJlYmRlZDc+XQovTGVu Z3RoIDEyCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUUnYA AAD0AIcKZW5kc3RyZWFtCmVuZG9iagoKMTExOCAwIG9iago8PAovVHlwZSAv WE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTExOAovV2lkdGgg NwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiAzIDxlOWM2YmNjZjJjMzJlMTg4N2FmOGVl ZGE+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVh bQp42hPNAQAAmACCCmVuZHN0cmVhbQplbmRvYmoKCjExMTkgMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTExMTkK L1dpZHRoIDIyCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xv clNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDggPGZjZmJmN2NlN2Y0YWNm MmMzMmQxM2MzZGU1YTc5OWQwYWM3ZGEzMmMyZGQ0NTM0Y2ViZGVkNz5dCi9M ZW5ndGggMTkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1RS dghSCjFSU6oAAAtJAkEKZW5kc3RyZWFtCmVuZG9iagoKMTEyMCAwIG9iago8 PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTEy MAovV2lkdGggMjYKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0Nv bG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMTAgPGY4ZWVkYWFiODQz NGNmMmMzMmQ0NTM0Y2YyZTBiN2ZjZmJmN2ViZGVkN2UzYWU1YWQxM2MzZGUx ODg3YWQ4NmE2Mj5dCi9MZW5ndGggMjEKL0ZpbHRlciAvRmxhdGVEZWNvZGUK Pj4Kc3RyZWFtCnjaY1RSdg1gSW9qntWkZAYAFakDwAplbmRzdHJlYW0KZW5k b2JqCgoxMTIxIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9J bWFnZQovTmFtZSAvSW0xMTIxCi9XaWR0aCAzNQovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiA3IDxmY2ZiZjdkNDUzNGNjZjJjMzJlMTg4N2FlNWE3OTlkMTNjM2RlYmNk OTdjZTdmNGE+XQovTGVuZ3RoIDI0Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+ CnN0cmVhbQp42mNUUlJSdgISYexKSmKMSkoOABZ+Am8KZW5kc3RyZWFtCmVu ZG9iagoKMTEyMiAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAv SW1hZ2UKL05hbWUgL0ltMTEyMgovV2lkdGggNwovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiA0IDxmY2ZiZjdkNDUzNGNjZjJjMzJlNWE3OTlmOGVlZGE+XQovTGVuZ3Ro IDEyCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUUnYAAAD0 AIcKZW5kc3RyZWFtCmVuZG9iagoKMTEyMyAwIG9iago8PAovVHlwZSAvWE9i amVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTEyMwovV2lkdGggOAov SGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0lu ZGV4ZWQgL0RldmljZVJHQiA0IDxmY2ZiZjdlNWE3OTlkMTNjM2RjZjJjMzJm OGVlZGE+XQovTGVuZ3RoIDEyCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0 cmVhbQp42mNUNhYBAADrAGwKZW5kc3RyZWFtCmVuZG9iagoKMTEyNCAwIG9i ago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0lt MTEyNAovV2lkdGggMjIKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQK L0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMTEgPGY4ZWVkYWQ0 NTM0Y2NmMmMzMmQ4NmE2MmU5YzZiY2ZjZmJmN2E4NmE1ZGEzMmMyZGNkYTE0 YWQwYWM3ZGNiOGQ3OWViZGVkNz5dCi9MZW5ndGggMTkKL0ZpbHRlciAvRmxh dGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1RSdk1X7zQvL1oNAA8FA24KZW5kc3Ry ZWFtCmVuZG9iagoKMTEyNSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3Vi dHlwZSAvSW1hZ2UKL05hbWUgL0ltMTEyNQovV2lkdGggMjYKL0hlaWdodCAx Ci9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9E ZXZpY2VSR0IgMTAgPGYyZTBiNzlkNGUzZWNmMmMzMmQ0NTM0Y2Q4NmE2MmQx M2MzZGViZGVkN2Y4ZWVkYWI5OTg1Y2U5YzZiY2ZjZmJmNz5dCi9MZW5ndGgg MTkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1RSdjZVq1AC gpBZAA/MAtMKZW5kc3RyZWFtCmVuZG9iagoKMTEyNiAwIG9iago8PAovVHlw ZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTEyNgovV2lk dGggMzUKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3Bh Y2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgOCA8ZTljNmJjY2YyYzMyZDEzYzNk ZTE4ODdhZjJlMGI3ZmNmYmY3ZDg2YTYyZWJjZDk3ZWJkZWQ3Pl0KL0xlbmd0 aCAyNAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjFBQUFFIE EiZhgoLmTYJCBQARcQKTCmVuZHN0cmVhbQplbmRvYmoKCjExMjcgMCBvYmoK PDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTEx MjcKL1dpZHRoIDcKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0Nv bG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNCA8ZjJlMGI3ZDEzYzNk Y2YyYzMyZDBhYzdkZmNmYmY3Pl0KL0xlbmd0aCAxMgovRmlsdGVyIC9GbGF0 ZURlY29kZQo+PgpzdHJlYW0KeNpjVBJ2AAAA1AB3CmVuZHN0cmVhbQplbmRv YmoKCjExMjggMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0lt YWdlCi9OYW1lIC9JbTExMjgKL1dpZHRoIDgKL0hlaWdodCAxCi9CaXRzUGVy Q29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0Ig MiA8ZmNmYmY3ZTVhNzk5Y2YyYzMyPl0KL0xlbmd0aCAxMAovRmlsdGVyIC9G bGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTWgIAANoAvwplbmRzdHJlYW0KZW5k b2JqCgoxMTI5IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9J bWFnZQovTmFtZSAvSW0xMTI5Ci9XaWR0aCAyMgovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiA4IDxlOWM2YmNjZjJjMzI5ZDRlM2VjYjhkNzlmY2ZiZjdlYmRlZDdhMzJj MmRjZTdmNGFmOGVlZGE+XQovTGVuZ3RoIDE5Ci9GaWx0ZXIgL0ZsYXRlRGVj b2RlCj4+CnN0cmVhbQp42mMUVHZVSwwvS0uzAAANNALTCmVuZHN0cmVhbQpl bmRvYmoKCjExMzAgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTExMzAKL1dpZHRoIDI1Ci9IZWlnaHQgMQovQml0 c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNl UkdCIDkgPGViYzE3N2QxM2MzZGNmMmMzMmQ0NTM0Y2ZjZmJmN2Y4ZWVkYWFi ODQzNGUxODg3YWQwYWM3ZGViZGVkNz5dCi9MZW5ndGggMTkKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1QCApMwQyFF84YJAA3hAr8KZW5k c3RyZWFtCmVuZG9iagoKMTEzMSAwIG9iago8PAovVHlwZSAvWE9iamVjdAov U3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTEzMQovV2lkdGggMzYKL0hlaWdo dCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVk IC9EZXZpY2VSR0IgOSA8ZmNmYmY3ZTE4ODdhY2YyYzMyZDg2YTYyZTVhNzk5 ZjJlMGI3ZWJkZWQ3ZDEzYzNkZjhlZWRhZWJjZDk3Pl0KL0xlbmd0aCAyNgov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVFJUUlJSVlJSCStS KmlRUrIEABuNA5UKZW5kc3RyZWFtCmVuZG9iagoKMTEzMiAwIG9iago8PAov VHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTEzMgov V2lkdGggNwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JT cGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA0IDxlNWE3OTljZjJjMzJkNDUz NGNlOWM2YmNmY2ZiZjc+XQovTGVuZ3RoIDEyCi9GaWx0ZXIgL0ZsYXRlRGVj b2RlCj4+CnN0cmVhbQp42mMUVHYAAADBAHYKZW5kc3RyZWFtCmVuZG9iagoK MTEzMyAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UK L05hbWUgL0ltMTEzMwovV2lkdGggMTYKL0hlaWdodCAxCi9CaXRzUGVyQ29t cG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgOCA8 ZmNmYmY3ZTljNmJjZDEzYzNkY2YyYzMyZTE4ODdhZjhlZWRhZDQ1MzRjYTMy YzJkYTg2YTVkPl0KL0xlbmd0aCAxNgovRmlsdGVyIC9GbGF0ZURlY29kZQo+ PgpzdHJlYW0KeNpjEDI2YU02bwQABOgBmgplbmRzdHJlYW0KZW5kb2JqCgox MTM0IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQov TmFtZSAvSW0xMTM0Ci9XaWR0aCA1Ci9IZWlnaHQgMQovQml0c1BlckNvbXBv bmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEgPGQw YWM3ZGEzMmMyZD5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUK Pj4Kc3RyZWFtCnjaE3UAAABsAFYKZW5kc3RyZWFtCmVuZG9iagoKMTEzNSAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltMTEzNQovV2lkdGggMjEKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50 IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMTEgPGU1YTc5 OTlkNGUzZWEzMmMyZGNiOGQ3OWZjZmJmN2I5OTg1Y2NmMmMzMmQxM2MzZGQ0 NTM0Y2Q4NmE2MmUxODg3YWQwYWM3ZD5dCi9MZW5ndGggMTkKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYxRSUnYJS+/onLUBAA6WA7UKZW5k c3RyZWFtCmVuZG9iagoKMTEzNiAwIG9iago8PAovVHlwZSAvWE9iamVjdAov U3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTEzNgovV2lkdGggMTIKL0hlaWdo dCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVk IC9EZXZpY2VSR0IgNiA8ZWJjZDk3YWI4NDM0Y2RhMTRhZDBhYzdkY2I4ZDc5 ZTNhZTVhZjhlZWRhPl0KL0xlbmd0aCAxNAovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNpjVHZxNmUDAAMEAOcKZW5kc3RyZWFtCmVuZG9iagoK MTEzNyAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UK L05hbWUgL0ltMTEzNwovV2lkdGggMzYKL0hlaWdodCAxCi9CaXRzUGVyQ29t cG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgOSA8 ZjhlZWRhZDEzYzNkY2YyYzMyZDQ1MzRjZWJjZDk3ZTVhNzk5ZDg2YTYyZmNm YmY3Y2I4ZDc5ZjJlMGI3Pl0KL0xlbmd0aCAyMwovRmlsdGVyIC9GbGF0ZURl Y29kZQo+PgpzdHJlYW0KeNpjVDJRUgJhE1YlpZQyJaVOABkpA1oKZW5kc3Ry ZWFtCmVuZG9iagoKMTEzOCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3Vi dHlwZSAvSW1hZ2UKL05hbWUgL0ltMTEzOAovV2lkdGggNjcKL0hlaWdodCAx Ci9CaXRzUGVyQ29tcG9uZW50IDgKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9E ZXZpY2VSR0IgMTggPGZjZmJmN2Q4NmE2MmNmMmMzMmYyZTBiN2Y4ZWVkYWVi ZGVkN2ViY2Q5N2Q0NTM0Y2QxM2MzZGUxODg3YWEzMmMyZGE4NmE1ZGU1YTc5 OTlkNGUzZWNiOGQ3OWFiODQzNGQwYWM3ZGNkYTE0YWUzYWU1YT5dCi9MZW5n dGggNTkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaFcfBAcAg CATBExUMKEj6LzZkXrtoRNQ6MGYHS816hJTUAFPVNbfJqXAg3O8v84Ijsrw8 8AE1UgIkCmVuZHN0cmVhbQplbmRvYmoKCjExMzkgMCBvYmoKPDwKL1R5cGUg L1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTExMzkKL1dpZHRo IDY3Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNl IFsvSW5kZXhlZCAvRGV2aWNlUkdCIDE0IDxlOWM2YmNjZjJjMzJlMTg4N2Fl YmNkOTdlNWE3OTllM2FlNWFmY2ZiZjdkODZhNjJkMTNjM2RmOGVlZGFmMmUw YjdkNDUzNGNlYmMxNzdjZGExNGE5ZDRlM2U+XQovTGVuZ3RoIDQwCi9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMUVBYUFHQVFFROB+IMQQnL tJmzGgW3VzeZnd0IlHk3AQB4rQmtCmVuZHN0cmVhbQplbmRvYmoKCjExNDAg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTExNDAKL1dpZHRoIDM4Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVu dCA4Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDE3IDxmY2Zi Zjc5ZDRlM2VhMzJjMmRjZjJjMzJkMTNjM2RkNDUzNGNkODZhNjJlMTg4N2Fl NWE3OTlhODZhNWRiOTk4NWNmMmUwYjdjZGExNGFlMWE5M2JlM2FlNWFlYmMx NzdlYmRlZDdmOGVlZGE+XQovTGVuZ3RoIDQzCi9GaWx0ZXIgL0ZsYXRlRGVj b2RlCj4+CnN0cmVhbQp42gXBhwEAIAgDsOIAtKDy/7MmkNbHVDV3W7LBiMjI c+4DUEWygA8UJQEyCmVuZHN0cmVhbQplbmRvYmoKCjExNDEgMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTExNDEK L1dpZHRoIDI5Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xv clNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDcgPGZjZmJmN2UxODg3YWNm MmMzMmU1YTc5OWY4ZWVkYWQwYWM3ZGNlN2Y0YWQxM2MzZD5dCi9MZW5ndGgg MjMKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1RSdlJSEk1S UnYoUlJ1AAATKALCCmVuZHN0cmVhbQplbmRvYmoKCjExNDIgMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTExNDIK L1dpZHRoIDI0Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xv clNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDkgPGNmMmMzMmQxM2MzZGUx ODg3YWQwYWM3ZGQ4NmE2MmQ0NTM0Y2ViYzE3N2U1YTc5OWYyZTBiN2Y4ZWVk YT5dCi9MZW5ndGggMTgKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFt CnjaY2AQMglNK2AAgk4ACy8B+wplbmRzdHJlYW0KZW5kb2JqCgoxMTQzIDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW0xMTQzCi9XaWR0aCAxMgovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg NAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA4IDxmMmUwYjdh Yjg0MzRjZTdmNGFkODZhNjJkMTNjM2RjZjJjMzJkNDUzNGNhODZhNWQ5ZDRl M2U+XQovTGVuZ3RoIDE0Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVh bQp42mNUdg1L7wAABCcBrwplbmRzdHJlYW0KZW5kb2JqCgoxMTQ0IDAgb2Jq Cjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0x MTQ0Ci9XaWR0aCAxNQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAov Q29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA3IDxlYmRlZDdjZjJj MzJkMTNjM2RkNDUzNGNlMTg4N2FlNWE3OTllOWM2YmNjZTdmNGE+XQovTGVu Z3RoIDE2Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMUUjZx DU1PAAAFpQHMCmVuZHN0cmVhbQplbmRvYmoKCjExNDUgMCBvYmoKPDwKL1R5 cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTExNDUKL1dp ZHRoIDkKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3Bh Y2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8ZjJlMGI3ZTljNmJjZjhlZWRh ZmNmYmY3Pl0KL0xlbmd0aCAxMQovRmlsdGVyIC9GbGF0ZURlY29kZQo+Pgpz dHJlYW0KeNoT2H8AAAJxAZAKZW5kc3RyZWFtCmVuZG9iagoKMTE0NiAwIG9i ago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0lt MTE0NgovV2lkdGggMjEKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQK L0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNyA8ZjhlZWRhZDEz YzNkY2YyYzMyZDQ1MzRjZWJjZDk3ZDg2YTYyYWI4NDM0ZmNmYmY3Pl0KL0xl bmd0aCAxOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVDJh UlJ1E1ISKQAAB74BnwplbmRzdHJlYW0KZW5kb2JqCgoxMTQ3IDAgb2JqCjw8 Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xMTQ3 Ci9XaWR0aCAzMgovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29s b3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA3IDxjZjJjMzJkMTNjM2Rl YmNkOTdmY2ZiZjdlMTg4N2FmMmUwYjdkNDUzNGNlYmRlZDc+XQovTGVuZ3Ro IDIyCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNgEDJmAAIW 1QQGBsGUYgAIdAG3CmVuZHN0cmVhbQplbmRvYmoKCjExNDggMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTExNDgK L1dpZHRoIDEyCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xv clNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDYgPGZjZmJmN2I5OTg1Y2Fi ODQzNGNiOGQ3OWQwYWM3ZDlkNGUzZWE4NmE1ZD5dCi9MZW5ndGggMTQKL0Zp bHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1QUdlFNAAACcwD/CmVu ZHN0cmVhbQplbmRvYmoKCjExNDkgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QK L1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTExNDkKL1dpZHRoIDE5Ci9IZWln aHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhl ZCAvRGV2aWNlUkdCIDkgPGY4ZWVkYWQ4NmE2MmNlN2Y0YWUxYTkzYmUzYWU1 YWUxODg3YWU1YTc5OWU5YzZiY2ViZGVkN2ZjZmJmNz5dCi9MZW5ndGggMTgK L0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1Qydg1NryifOQEA DckDcAplbmRzdHJlYW0KZW5kb2JqCgoxMTUwIDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xMTUwCi9XaWR0aCA1 MwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiAxMyA8ZTVhNzk5Y2YyYzMyZDg2YTYyZjJl MGI3ZmNmYmY3ZDEzYzNkZWJjMTc3Yjk5ODVjZDQ1MzRjZTE4ODdhZjhlZWRh Y2I4ZDc5ZDBhYzdkY2RhMTRhPl0KL0xlbmd0aCAzNQovRmlsdGVyIC9GbGF0 ZURlY29kZQo+PgpzdHJlYW0KeNpjFFR2FAwrFxRsdhEUVHYWFBQUnWylpL37 zFkHAEe7BrwKZW5kc3RyZWFtCmVuZG9iagoKMTE1MSAwIG9iago8PAovVHlw ZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTE1MQovV2lk dGggMTAKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3Bh Y2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNSA8ZmNmYmY3ZDBhYzdkY2RhMTRh Y2U3ZjRhYjk5ODVjZTljNmJjPl0KL0xlbmd0aCAxMwovRmlsdGVyIC9GbGF0 ZURlY29kZQo+PgpzdHJlYW0KeNpjVFIyCQAAAbAAygplbmRzdHJlYW0KZW5k b2JqCgoxMTUyIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9J bWFnZQovTmFtZSAvSW0xMTUyCi9XaWR0aCAzMAovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiA4IDxmY2ZiZjdlMWE5M2JmOGQyMjdmYWU2NmJlYmNkOTdlOWM2YmNlYmRl ZDdmOGVlZGFmMmUwYjc+XQovTGVuZ3RoIDIzCi9GaWx0ZXIgL0ZsYXRlRGVj b2RlCj4+CnN0cmVhbQp42mNUUlI2dg0rCy0vqKgoLwAAHOQEwAplbmRzdHJl YW0KZW5kb2JqCgoxMTUzIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0 eXBlIC9JbWFnZQovTmFtZSAvSW0xMTUzCi9XaWR0aCAyMAovSGVpZ2h0IDEK L0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rl dmljZVJHQiA5IDxkNDUzNGNjZjJjMzJlMTg4N2FmMmUwYjdmY2ZiZjdkMTNj M2RlNWE3OTljZGExNGFkMGFjN2RkODZhNjI+XQovTGVuZ3RoIDE4Ci9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMUVHZlSG8TFJwMAAirAh0K ZW5kc3RyZWFtCmVuZG9iagoKMTE1NCAwIG9iago8PAovVHlwZSAvWE9iamVj dAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTE1NAovV2lkdGggMzEKL0hl aWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRl eGVkIC9EZXZpY2VSR0IgMTIgPGZjZmJmN2NmMmMzMmUxODg3YWY4ZWVkYWU1 YTc5OWQ0NTM0Y2Q4NmE2MmNiOGQ3OWQwYWM3ZGU5YzZiY2ViY2Q5N2I5OTg1 Y2NkYTE0YT5dCi9MZW5ndGggMjMKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4K c3RyZWFtCnjaYxQUMnBNUy/vmLD6DBA0AAApuAcRCmVuZHN0cmVhbQplbmRv YmoKCjExNTUgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0lt YWdlCi9OYW1lIC9JbTExNTUKL1dpZHRoIDcKL0hlaWdodCAxCi9CaXRzUGVy Q29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0Ig MyA8ZmNmYmY3ZjJlMGI3ZWJkZWQ3ZjhlZWRhPl0KL0xlbmd0aCAxMAovRmls dGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpj3QAAALwAtgplbmRzdHJl YW0KZW5kb2JqCgoxMTU2IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0 eXBlIC9JbWFnZQovTmFtZSAvSW0xMTU2Ci9XaWR0aCAzMAovSGVpZ2h0IDEK L0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rl dmljZVJHQiA2IDxlYmMxNzdmOGQyMjdlYmNkOTdmMmUwYjdmOGVlZGFmY2Zi ZjdlOWM2YmM+XQovTGVuZ3RoIDIzCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+ CnN0cmVhbQp42mMUFBRUNnYJMVM2NjYyNgEAEH8CewplbmRzdHJlYW0KZW5k b2JqCgoxMTU3IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9J bWFnZQovTmFtZSAvSW0xMTU3Ci9XaWR0aCA2Ci9IZWlnaHQgMQovQml0c1Bl ckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdC IDMgPGNmMmMzMmQxM2MzZGViYzE3N2Y4ZWVkYT5dCi9MZW5ndGggMTAKL0Zp bHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY9wAAAC0ALIKZW5kc3Ry ZWFtCmVuZG9iagoKMTE1OCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3Vi dHlwZSAvSW1hZ2UKL05hbWUgL0ltMTE1OAovV2lkdGggMTMKL0hlaWdodCAx Ci9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9E ZXZpY2VSR0IgOSA8Yjk5ODVjZDBhYzdkY2RhMTRhZmNmYmY3ZTE4ODdhY2Yy YzMyZDEzYzNkZDQ1MzRjZTVhNzk5ZjhlZWRhPl0KL0xlbmd0aCAxNQovRmls dGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjFGJ2TauYAAAETwHKCmVu ZHN0cmVhbQplbmRvYmoKCjExNTkgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QK L1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTExNTkKL1dpZHRoIDMxCi9IZWln aHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhl ZCAvRGV2aWNlUkdCIDkgPGY4ZWVkYWQ4NmE2MmNiOGQ3OWQwYWM3ZGZjZmJm N2NkYTE0YWFiODQzNGViYzE3N2ViY2Q5N2YyZTBiNz5dCi9MZW5ndGggMjQK L0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1RSZgkODQ1Ndimv mDmBwQEAIIAEnAplbmRzdHJlYW0KZW5kb2JqCgoxMTYwIDAgb2JqCjw8Ci9U eXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xMTYwCi9X aWR0aCAzMQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JT cGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxMSA8ZmNmYmY3ZTFhOTNiZjhk MjI3ZTNhZTVhYTg2YTVkYjk5ODVjZjJlMGI3ZjhlZWRhZWJkZWQ3ZTVhNzk5 ZWJjZDk3ZWJjMTc3Pl0KL0xlbmd0aCAyNAovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNpjFFJSMglLL2DvXL179+5lDAAk5QXLCmVuZHN0cmVh bQplbmRvYmoKCjExNjEgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5 cGUgL0ltYWdlCi9OYW1lIC9JbTExNjEKL1dpZHRoIDcKL0hlaWdodCAxCi9C aXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZp Y2VSR0IgMyA8ZmNmYmY3Y2YyYzMyZDg2YTYyZjJlMGI3Pl0KL0xlbmd0aCAx MAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoT3QAAANwAxgpl bmRzdHJlYW0KZW5kb2JqCgoxMTYyIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0 Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xMTYyCi9XaWR0aCAxMwovSGVp Z2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4 ZWQgL0RldmljZVJHQiA1IDxlMWE5M2JlM2FlNWFlYmRlZDdmOGVlZGFkMGFj N2RjYjhkNzk+XQovTGVuZ3RoIDE1Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+ CnN0cmVhbQp42mMUVHZ1cTEAAAO7ATMKZW5kc3RyZWFtCmVuZG9iagoKMTE2 MyAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05h bWUgL0ltMTE2MwovV2lkdGggMTgKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9u ZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNyA8ZmNm YmY3Y2RhMTRhZTFhOTNiZjhlZWRhZTNhZTVhZWJjMTc3ZWJjZDk3ZjJlMGI3 Pl0KL0xlbmd0aCAxNwovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0K eNpjFBIycAlLKzcAAAc8Af0KZW5kc3RyZWFtCmVuZG9iagoKMTE2NCAwIG9i ago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0lt MTE2NAovV2lkdGggMzEKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQK L0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMTIgPGY4ZWVkYWUx YTkzYmY4ZDIyN2I5OTg1Y2NkYTE0YWE4NmE1ZGFiODQzNGViY2Q5N2YyZTBi N2ZjZmJmN2U5YzZiY2ViYzE3N2UzYWU1YT5dCi9MZW5ndGggMjQKL0ZpbHRl ciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1RSEnZNb+CcybV7957dBRMA JZMGHgplbmRzdHJlYW0KZW5kb2JqCgoxMTY1IDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xMTY1Ci9XaWR0aCA3 Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsv SW5kZXhlZCAvRGV2aWNlUkdCIDUgPGY4ZWVkYWNiOGQ3OWNlN2Y0YWI5OTg1 Y2YyZTBiN2ZjZmJmNz5dCi9MZW5ndGggMTIKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjaYxQyCQAAAPYAmAplbmRzdHJlYW0KZW5kb2JqCgox MTY2IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQov TmFtZSAvSW0xMTY2Ci9XaWR0aCAxMwovSGVpZ2h0IDEKL0JpdHNQZXJDb21w b25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA2IDxm OGVlZGFmY2ZiZjdlYmMxNzdlYmNkOTdlM2FlNWFlMWE5M2JjZGExNGE+XQov TGVuZ3RoIDE1Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMU FDIJcxEAAAM4AQMKZW5kc3RyZWFtCmVuZG9iagoKMTE2NyAwIG9iago8PAov VHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTE2Nwov V2lkdGggMTQKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8ZmNmYmY3ZjhlZWRhPl0K L0xlbmd0aCAxMgovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoT DWBgAAABSABmCmVuZHN0cmVhbQplbmRvYmoKCjExNjggMCBvYmoKPDwKL1R5 cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTExNjgKL1dp ZHRoIDMxCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNw YWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEyIDxmY2ZiZjdlYmMxNzdlMWE5 M2JmOGQyMjdiOTk4NWNjZTdmNGFhODZhNWRkMGFjN2RmYWU2NmJmOGVlZGFl YmRlZDdlNWE3OTllM2FlNWE+XQovTGVuZ3RoIDI0Ci9GaWx0ZXIgL0ZsYXRl RGVjb2RlCj4+CnN0cmVhbQp42mNUUjYJTa+YycC5WkbpjCQDACERBB8KZW5k c3RyZWFtCmVuZG9iagoKMTE2OSAwIG9iago8PAovVHlwZSAvWE9iamVjdAov U3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTE2OQovV2lkdGggNgovSGVpZ2h0 IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQg L0RldmljZVJHQiAzIDxlYmMxNzdjZGExNGFlMWE5M2JmMmUwYjc+XQovTGVu Z3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hPdAAAA 3ADGCmVuZHN0cmVhbQplbmRvYmoKCjExNzAgMCBvYmoKPDwKL1R5cGUgL1hP YmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTExNzAKL1dpZHRoIDkK L0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9J bmRleGVkIC9EZXZpY2VSR0IgNCA8ZjhlZWRhZTNhZTVhZWJjZDk3ZjJlMGI3 ZmNmYmY3Pl0KL0xlbmd0aCAxMwovRmlsdGVyIC9GbGF0ZURlY29kZQo+Pgpz dHJlYW0KeNpjVGZwcQAAAV4AqQplbmRzdHJlYW0KZW5kb2JqCgoxMTcxIDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW0xMTcxCi9XaWR0aCAzMAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg NAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxNSA8ZjhlZWRh Y2RhMTRhZTFhOTNiZjhkMjI3Yjk5ODVjYWI4NDM0OWQ0ZTNlYTg2YTVkZWJj ZDk3ZjJlMGI3ZmNmYmY3ZWJkZWQ3ZTVhNzk5ZWJjMTc3ZTNhZTVhZmFlNjZi Pl0KL0xlbmd0aCAyMwovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0K eNpjVDJWCSvpZODi2nNP7z4XAB1EBJMKZW5kc3RyZWFtCmVuZG9iagoKMTE3 MiAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05h bWUgL0ltMTE3MgovV2lkdGggNgovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25l bnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDxmOGVl ZGFmMmUwYjdmY2ZiZjc+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVj b2RlCj4+CnN0cmVhbQp42hNVAAAATAA2CmVuZHN0cmVhbQplbmRvYmoKCjEx NzMgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9O YW1lIC9JbTExNzMKL1dpZHRoIDYKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9u ZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8ZmNm YmY3ZjJlMGI3ZTFhOTNiZWJjMTc3Pl0KL0xlbmd0aCAxMAovRmlsdGVyIC9G bGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTdgAAAHgAXAplbmRzdHJlYW0KZW5k b2JqCgoxMTc0IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9J bWFnZQovTmFtZSAvSW0xMTc0Ci9XaWR0aCAyOAovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiAxMyA8ZjJlMGI3YWI4NDM0ZTFhOTNiZjhkMjI3Yjk5ODVjYTg2YTVkOWQ0 ZTNlZWJjZDk3ZmFlNjZiZjhlZWRhZTljNmJjZTNhZTVhZWJjMTc3ZmNmYmY3 Pl0KL0xlbmd0aCAyMgovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0K eNpjFFJ2CQut4Jw5c9aePbwAHKIE+AplbmRzdHJlYW0KZW5kb2JqCgoxMTc1 IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFt ZSAvSW0xMTc1Ci9XaWR0aCA4Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVu dCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDQgPGZjZmJm N2Y4ZWVkYWYyZTBiN2UxYTkzYmViYzE3Nz5dCi9MZW5ndGggMTIKL0ZpbHRl ciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1R2EgAAAQUAdwplbmRzdHJl YW0KZW5kb2JqCgoxMTc2IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0 eXBlIC9JbWFnZQovTmFtZSAvSW0xMTc2Ci9XaWR0aCAyNwovSGVpZ2h0IDEK L0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rl dmljZVJHQiAxMiA8ZWJjZDk3YWI4NDM0ZTFhOTNiZjhkMjI3YTg2YTVkYjk5 ODVjZDBhYzdkZmFlNjZiZjJlMGI3ZjhlZWRhZTE4ODdhZWJjMTc3ZmNmYmY3 Pl0KL0xlbmd0aCAyMgovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0K eNpjVDJWEgmr6Jg5c8bqygMAHZwFkQplbmRzdHJlYW0KZW5kb2JqCgoxMTc3 IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFt ZSAvSW0xMTc3Ci9XaWR0aCAxNwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25l bnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxMSA8ZmNm YmY3ZjhlZWRhZjJlMGI3ZTFhOTNiZWJjMTc3ZWJjZDk3ZTljNmJjZTVhNzk5 Y2I4ZDc5YTg2YTVkOTg4ZmFhZWJkZWQ3Pl0KL0xlbmd0aCAxNwovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVHZVYKuYtZoBAAjvAk0KZW5k c3RyZWFtCmVuZG9iagoKMTE3OCAwIG9iago8PAovVHlwZSAvWE9iamVjdAov U3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTE3OAovV2lkdGggMjYKL0hlaWdo dCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVk IC9EZXZpY2VSR0IgOSA8ZmNmYmY3ZDBhYzdkYWI4NDM0ZTFhOTNiZjhkMjI3 ZTNhZTVhZmFlNjZiZjJlMGI3ZjhlZWRhZWJjMTc3Pl0KL0xlbmd0aCAyMQov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVFJ2cQlMS09vby+d AQAXMQRvCmVuZHN0cmVhbQplbmRvYmoKCjExNzkgMCBvYmoKPDwKL1R5cGUg L1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTExNzkKL1dpZHRo IDE5Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNl IFsvSW5kZXhlZCAvRGV2aWNlUkdCIDE0IDxmY2ZiZjdmOGVlZGFmMmUwYjdl MWE5M2JlM2FlNWFlYmNkOTdiYmI0YzY5ODhmYWFkNDUzNGNhMzJjMmQ5ZDRl M2U0NjQzNzk3NzZjOGVjYjhkNzllYmRlZDc+XQovTGVuZ3RoIDE4Ci9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUdlWrmLV6zT0GABC/A9cK ZW5kc3RyZWFtCmVuZG9iagoKMTE4MCAwIG9iago8PAovVHlwZSAvWE9iamVj dAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTE4MAovV2lkdGggMjYKL0hl aWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRl eGVkIC9EZXZpY2VSR0IgMTIgPGZjZmJmN2NiOGQ3OWEzMmMyZGNmMmMzMmQx M2MzZGNlN2Y0YWUxYTkzYmY4ZDIyN2ZhZTY2YmYyZTBiN2Y4ZWVkYWViYzE3 N2U5YzZiYz5dCi9MZW5ndGggMjEKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4K c3RyZWFtCnjaY1RSdk2v6OiYuXJG9wEAHWsFoAplbmRzdHJlYW0KZW5kb2Jq CgoxMTgxIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFn ZQovTmFtZSAvSW0xMTgxCi9XaWR0aCAyMAovSGVpZ2h0IDEKL0JpdHNQZXJD b21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAx MiA8ZmNmYmY3ZjhlZWRhZjJlMGI3ZTNhZTVhZWJjMTc3ZTljNmJjNzc2Yzhl ZTVhNzk5ZDQ1MzRjZDg2YTYyY2I4ZDc5OTg4ZmFhZWJkZWQ3Pl0KL0xlbmd0 aCAxOAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVDYJS+9c vWr5AQARGARbCmVuZHN0cmVhbQplbmRvYmoKCjExODIgMCBvYmoKPDwKL1R5 cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTExODIKL1dp ZHRoIDI1Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNw YWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDggPGZjZmJmN2NiOGQ3OWEzMmMy ZGNmMmMzMmQxM2MzZGNlN2Y0YWY4ZDIyN2ZhZTY2YmYyZTBiNz5dCi9MZW5n dGggMjEKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1RSMjYJ Sy8vb28vbwAAFrcEXQplbmRzdHJlYW0KZW5kb2JqCgoxMTgzIDAgb2JqCjw8 Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xMTgz Ci9XaWR0aCAyMQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29s b3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA5IDxmY2ZiZjdmOGVlZGFm MmUwYjdlYmMxNzdlM2FlNWFlOWM2YmNlYmRlZDdlNWE3OTllMTg4N2FiYmI0 YzY+XQovTGVuZ3RoIDE5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVh bQp42mNUdg4NqyhLS53JAAAR6ANlCmVuZHN0cmVhbQplbmRvYmoKCjExODQg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTExODQKL1dpZHRoIDI1Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVu dCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDcgPGZjZmJm N2U1YTc5OWEzMmMyZGNmMmMzMmQ0NTM0Y2Y4ZDIyN2ZhZTY2YmY4ZWVkYT5d Ci9MZW5ndGggMTgKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja Y1RSNjY2CUsDgQIAE14DpQplbmRzdHJlYW0KZW5kb2JqCgoxMTg1IDAgb2Jq Cjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0x MTg1Ci9XaWR0aCAyMAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAov Q29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxMCA8ZmNmYmY3ZjJl MGI3ZWJjZDk3ZTNhZTVhY2RhMTRhYTg2YTVkZDg2YTYyZTljNmJjZTVhNzk5 ZjhlZWRhZWJkZWQ3Pl0KL0xlbmd0aCAxOAovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNpjVHZNS++YwMCwCgAOPQL5CmVuZHN0cmVhbQplbmRv YmoKCjExODYgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0lt YWdlCi9OYW1lIC9JbTExODYKL1dpZHRoIDI3Ci9IZWlnaHQgMQovQml0c1Bl ckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdC IDkgPGZjZmJmN2Y4ZWVkYWQwYWM3ZDlkNGUzZWEzMmMyZGNmMmMzMmQxM2Mz ZGQ0NTM0Y2UxYTkzYmZhZTY2Yj5dCi9MZW5ndGggMjAKL0ZpbHRlciAvRmxh dGVEZWNvZGUKPj4Kc3RyZWFtCnjaYxAycQkNDU3vnAkEDAAdsATeCmVuZHN0 cmVhbQplbmRvYmoKCjExODcgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1 YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTExODcKL1dpZHRoIDIwCi9IZWlnaHQg MQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAv RGV2aWNlUkdCIDExIDxmY2ZiZjdmOGVlZGFmMmUwYjdlMWE5M2JhODZhNWQ0 NjQzNzk3NzZjOGU5ODhmYWFlOWM2YmNlNWE3OTllMTg4N2FlYmRlZDc+XQov TGVuZ3RoIDE4Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNU dg2rmNUovXsHABAmA+EKZW5kc3RyZWFtCmVuZG9iagoKMTE4OCAwIG9iago8 PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTE4 OAovV2lkdGggMjkKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0Nv bG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMTEgPGZjZmJmN2YyZTBi N2ViY2Q5N2ViYzE3N2UzYWU1YWNlN2Y0YWEzMmMyZGNmMmMzMmQxM2MzZGUx YTkzYmY4ZDIyN2ZhZTY2Yj5dCi9MZW5ndGggMjIKL0ZpbHRlciAvRmxhdGVE ZWNvZGUKPj4Kc3RyZWFtCnjaYxAyCUsrB4LO1bt372YAACkHBkQKZW5kc3Ry ZWFtCmVuZG9iagoKMTE4OSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3Vi dHlwZSAvSW1hZ2UKL05hbWUgL0ltMTE4OQovV2lkdGggMjAKL0hlaWdodCAx Ci9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9E ZXZpY2VSR0IgMTIgPGY4ZWVkYWYyZTBiN2QwYWM3ZGE4NmE1ZDQ2NDM3OTc3 NmM4ZWNiOGQ3OWQ4NmE2MmQ0NTM0Y2UxODg3YWU1YTc5OWU5YzZiY2ZjZmJm Nz5dCi9MZW5ndGggMTgKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFt CnjaY1R2Te+YtXv3rj0AE8cE3wplbmRzdHJlYW0KZW5kb2JqCgoxMTkwIDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW0xMTkwCi9XaWR0aCAzMQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg NAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxMCA8ZmNmYmY3 ZWJjZDk3ZWJjMTc3ZTNhZTVhZTFhOTNiY2U3ZjRhYTMyYzJkY2YyYzMyZDQ1 MzRjZjhkMjI3ZjJlMGI3Pl0KL0xlbmd0aCAyMwovRmlsdGVyIC9GbGF0ZURl Y29kZQo+PgpzdHJlYW0KeNpjEDJxDktLLweCzpkzZzEAACnPBd4KZW5kc3Ry ZWFtCmVuZG9iagoKMTE5MSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3Vi dHlwZSAvSW1hZ2UKL05hbWUgL0ltMTE5MQovV2lkdGggMjAKL0hlaWdodCAx Ci9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9E ZXZpY2VSR0IgOCA8ZmNmYmY3ZjhlZWRhNzc2YzhlYTg2YTVkY2YyYzMyZDEz YzNkZDQ1MzRjZDg2YTYyZTVhNzk5Pl0KL0xlbmd0aCAxOAovRmlsdGVyIC9G bGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVDZxCavo6OhoBAAOcAOECmVuZHN0 cmVhbQplbmRvYmoKCjExOTIgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1 YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTExOTIKL1dpZHRoIDM0Ci9IZWlnaHQg MQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAv RGV2aWNlUkdCIDExIDxmY2ZiZjdmOGVlZGFmMmUwYjdlYmMxNzdlMWE5M2Jj ZGExNGFhODZhNWQ5ZDRlM2VhMzJjMmRjZjJjMzJkMTNjM2RmOGQyMjc+XQov TGVuZ3RoIDI0Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNg VHZxcQmr6JgJBLN2794AAC/9B2sKZW5kc3RyZWFtCmVuZG9iagoKMTE5MyAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltMTE5MwovV2lkdGggMjAKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50 IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgOSA8ZmNmYmY3 ZjhlZWRhNzc2YzhlOWQ0ZTNlY2YyYzMyZDEzYzNkZDQ1MzRjZTE4ODdhZTVh Nzk5ZWJkZWQ3Pl0KL0xlbmd0aCAxOAovRmlsdGVyIC9GbGF0ZURlY29kZQo+ PgpzdHJlYW0KeNpjVHZxcU0vb6+oBAANxgNICmVuZHN0cmVhbQplbmRvYmoK CjExOTQgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdl Ci9OYW1lIC9JbTExOTQKL1dpZHRoIDM2Ci9IZWlnaHQgMQovQml0c1BlckNv bXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEw IDxmY2ZiZjdmOGVlZGFmMmUwYjdlYmMxNzdlM2FlNWFlMWE5M2JjZTdmNGE5 ZDRlM2VhMzJjMmRjZjJjMzJmOGQyMjc+XQovTGVuZ3RoIDI2Ci9GaWx0ZXIg L0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMQVHYJDQ11SW/v6Jw5c+bUVYsA NK4HZwplbmRzdHJlYW0KZW5kb2JqCgoxMTk1IDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xMTk1Ci9XaWR0aCAx OQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiA5IDxmY2ZiZjdhODZhNWRhMzJjMmRjZjJj MzJkNDUzNGNkODZhNjJlNWE3OTllMTg4N2FlOWM2YmNiYmI0YzY+XQovTGVu Z3RoIDE4Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUVnZN D+2cOa0BAA34A4EKZW5kc3RyZWFtCmVuZG9iagoKMTE5NiAwIG9iago8PAov VHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTE5Ngov V2lkdGggNDEKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMTQgPGZjZmJmN2Y4ZWVkYWVi Y2Q5N2ViYzE3N2UzYWU1YWUxYTkzYmNkYTE0YWNiOGQ3OWNlN2Y0YTlkNGUz ZWEzMmMyZGNmMmMzMmQxM2MzZGY4ZDIyN2ZhZTY2Yj5dCi9MZW5ndGggMzAK L0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY2AQVHYNDQ0Nc3Hv nLVq1a5du87eYwAARbIIqgplbmRzdHJlYW0KZW5kb2JqCgoxMTk3IDAgb2Jq Cjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0x MTk3Ci9XaWR0aCAxOQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAov Q29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxMCA8ZjhlZWRhOWQ0 ZTNlYTMyYzJkZDg2YTYyY2I4ZDc5Nzc2YzhlZWJkZWQ3ZDQ1MzRjZTE4ODdh OTg4ZmFhYmJiNGM2Pl0KL0xlbmd0aCAxOAovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNpjVDIJTSvvmDlzAQAPrQPkCmVuZHN0cmVhbQplbmRv YmoKCjExOTggMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0lt YWdlCi9OYW1lIC9JbTExOTgKL1dpZHRoIDQ1Ci9IZWlnaHQgMQovQml0c1Bl ckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdC IDEyIDxmY2ZiZjdmOGVlZGFmMmUwYjdlYmNkOTdlYmMxNzdlM2FlNWFlMWE5 M2JjZGExNGFjZTdmNGE5ZDRlM2VhMzJjMmRhYjg0MzRmYWU2NmI+XQovTGVu Z3RoIDI5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNgEFR2 CUtLDQ0NDQsN75y1CgT2MAAAUSAIzAplbmRzdHJlYW0KZW5kb2JqCgoxMTk5 IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFt ZSAvSW0xMTk5Ci9XaWR0aCA3MwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25l bnQgOAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyMSA8ZmNm YmY3OWQ0ZTNlYTMyYzJkNzc2YzhlNDY0Mzc5MjcyODY1YmJiNGM2ZWJkZWQ3 ZTVhNzk5ZDEzYzNkZTE4ODdhZDQ1MzRjOTg4ZmFhZjhlZWRhZjJlMGI3ZWJj ZDk3ZWJjMTc3ZTNhZTVhZTFhOTNiY2RhMTRhY2U3ZjRhY2YyYzMyPl0KL0xl bmd0aCA1MQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjYGRi ZmFlZWPn4OTk4uBmZmbh4QUCBjDi5ePjFxAUAgFBdCAswsgEB6LcvABp5QMU CmVuZHN0cmVhbQplbmRvYmoKCjEyMDAgMCBvYmoKPDwKL1R5cGUgL1hPYmpl Y3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTEyMDAKL1dpZHRoIDcyCi9I ZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA4Ci9Db2xvclNwYWNlIFsvSW5k ZXhlZCAvRGV2aWNlUkdCIDE5IDxmY2ZiZjdhODZhNWQ5ZDRlM2UyNzI4NjVi YmI0YzZkODZhNjJlNWE3OTljZjJjMzJlMTg4N2FkNDUzNGM3NzZjOGU0NjQz NzliOTk4NWNlYmMxNzdlM2FlNWFlMWE5M2JlYmNkOTdjYjhkNzlhMzJjMmRl YmRlZDc+XQovTGVuZ3RoIDQ5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0 cmVhbQp42mNgZGJmZmZhYGVjZ+dgYOPk4ubhhQE+Pn4I4IMBXjhDgI1NkJFJ CApYhQFjYQM8CmVuZHN0cmVhbQplbmRvYmoKCjEyMDEgMCBvYmoKPDwKL1R5 cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTEyMDEKL1dp ZHRoIDcxCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA4Ci9Db2xvclNw YWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDE5IDxmY2ZiZjdiYmI0YzYyNzI4 NjU3NzZjOGVlMTg4N2FhODZhNWQ5ODhmYWFjZjJjMzJkODZhNjJkNDUzNGM0 NjQzNzliOTk4NWNlMWE5M2JlM2FlNWFlYmMxNzdmMmUwYjdmOGVlZGFlOWM2 YmNjYjhkNzk5ZDRlM2U+XQovTGVuZ3RoIDU2Ci9GaWx0ZXIgL0ZsYXRlRGVj b2RlCj4+CnN0cmVhbQp42lXEQQKAIAgEQEBMLdkI//9XqVtzGGIRKaT1aK0z 6Tiv+WPT0hsAg31wO/kTESuNqr4BV8gDAAplbmRzdHJlYW0KZW5kb2JqCgox MjAyIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQov TmFtZSAvSW0xMjAyCi9XaWR0aCA1NQovSGVpZ2h0IDEKL0JpdHNQZXJDb21w b25lbnQgOAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxNyA8 ZWJkZWQ3NDY0Mzc5MjcyODY1YmJiNGM2ZTVhNzk5ZDQ1MzRjNzc2YzhlY2Yy YzMyZTE4ODdhZjhlZWRhZDg2YTYyZTFhOTNiY2RhMTRhZTNhZTVhZWJjMTc3 ZWJjZDk3ZjJlMGI3ZmNmYmY3Pl0KL0xlbmd0aCA0NgovRmlsdGVyIC9GbGF0 ZURlY29kZQo+PgpzdHJlYW0KeNpjYGRiYmZhZWRjZ+dgY+bkYuPm5uYBQhDB CwLcvNzcQIoPCfALCAIAMXgCPAplbmRzdHJlYW0KZW5kb2JqCgoxMjAzIDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW0xMjAzCi9XaWR0aCAxMQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg NAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA2IDxmY2ZiZjdm OGVlZGFlOWM2YmNiYmI0YzZlNWE3OTljYjhkNzllYmRlZDc+XQovTGVuZ3Ro IDE0Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUdnVxEwAA AzcBBAplbmRzdHJlYW0KZW5kb2JqCgoxMjA0IDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xMjA0Ci9XaWR0aCA1 NAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiAxNCA8ZmNmYmY3OTg4ZmFhMjcyODY1Nzc2 YzhlYmJiNGM2ZDQ1MzRjY2YyYzMyZDEzYzNkZTE4ODdhYTg2YTVkZWJjZDk3 ZWJjMTc3ZTNhZTVhY2RhMTRhZjJlMGI3Pl0KL0xlbmd0aCAzMAovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVHY1MquQXN1zBgTOAvHp3UCw a9UDBgC9ZA/CCmVuZHN0cmVhbQplbmRvYmoKCjEyMDUgMCBvYmoKPDwKL1R5 cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTEyMDUKL1dp ZHRoIDYKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3Bh Y2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8ZmNmYmY3ZjhlZWRhPl0KL0xl bmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTYQAA ACoAFQplbmRzdHJlYW0KZW5kb2JqCgoxMjA2IDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xMjA2Ci9XaWR0aCA1 MAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiAxMyA8ZjhlZWRhMjcyODY1OTg4ZmFhOWQ0 ZTNlNzc2YzhlYTMyYzJkY2YyYzMyY2U3ZjRhYjk5ODVjZWJjMTc3ZTNhZTVh ZWJjZDk3ZjJlMGI3ZmNmYmY3Pl0KL0xlbmd0aCAyNgovRmlsdGVyIC9GbGF0 ZURlY29kZQo+PgpzdHJlYW0KeNpjVDYUCSvxmLUKBmbO3A0EB+4CAJAPDcsK ZW5kc3RyZWFtCmVuZG9iagoKMTIwNyAwIG9iago8PAovVHlwZSAvWE9iamVj dAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTIwNwovV2lkdGggNDYKL0hl aWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRl eGVkIC9EZXZpY2VSR0IgMTQgPGJiYjRjNjk4OGZhYTlkNGUzZTQ2NDM3OTI3 Mjg2NTc3NmM4ZWEzMmMyZGE4NmE1ZGQwYWM3ZGViYzE3N2UzYWU1YWViY2Q5 N2YyZTBiN2Y4ZWVkYWZjZmJmNz5dCi9MZW5ndGggMzEKL0ZpbHRlciAvRmxh dGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1R2CUt3iZg5cxUQrFw5c/fuPWfO3H0H AHw2DRwKZW5kc3RyZWFtCmVuZG9iagoKMTIwOCAwIG9iago8PAovVHlwZSAv WE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTIwOAovV2lkdGgg NDMKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2Ug Wy9JbmRleGVkIC9EZXZpY2VSR0IgMTAgPGZjZmJmN2ViZGVkNzk4OGZhYTQ2 NDM3OTI3Mjg2NTc3NmM4ZWEzMmMyZGViY2Q5N2ViYzE3N2YyZTBiN2Y4ZWVk YT5dCi9MZW5ndGggMjkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFt CnjaY1R2CUt1Vi8vL+8AgvLymTNnrWJgAABYggh3CmVuZHN0cmVhbQplbmRv YmoKCjEyMDkgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0lt YWdlCi9OYW1lIC9JbTEyMDkKL1dpZHRoIDM4Ci9IZWlnaHQgMQovQml0c1Bl ckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdC IDggPGZjZmJmN2Y4ZWVkYWJiYjRjNjk4OGZhYTc3NmM4ZWE4NmE1ZGViZGVk N2YyZTBiN2ViY2Q5Nz5dCi9MZW5ndGggMjUKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjaY1R2DnVOFC/vAILy8nJBAQYGADlbBZUKZW5kc3Ry ZWFtCmVuZG9iagoKMTIxMCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3Vi dHlwZSAvSW1hZ2UKL05hbWUgL0ltMTIxMAovV2lkdGggOAovSGVpZ2h0IDEK L0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rl dmljZVJHQiAyIDxmY2ZiZjdlYmRlZDdlOWM2YmM+XQovTGVuZ3RoIDEwCi9G aWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mOdAgAAoACaCmVuZHN0 cmVhbQplbmRvYmoKCjEyMTEgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1 YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTEyMTEKL1dpZHRoIDIxCi9IZWlnaHQg MQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAv RGV2aWNlUkdCIDIgPGZjZmJmN2Y4ZWVkYWYyZTBiNz5dCi9MZW5ndGggMTQK L0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYwhNDWVgAAAEQgEQ CmVuZHN0cmVhbQplbmRvYmoKCjEyMTMgMCBvYmoKPDwKL1R5cGUgL1hPYmpl Y3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTEyMTMKL1dpZHRoIDE2Ci9I ZWlnaHQgMTYKL0JpdHNQZXJDb21wb25lbnQgMQovSW1hZ2VNYXNrIHRydWUK L0RlY29kZSBbMCAxXQovRGVjb2RlUGFybXMgPDwgL0sgLTEgL0NvbHVtbnMg MTYgPj4KL0xlbmd0aCA1NgovRmlsdGVyIC9DQ0lUVEZheERlY29kZQo+Pgpz dHJlYW0KLowjCCUREZNUYRhGFERGXR9RGTVGEYRhRERl0YRhBKIiMmqMIwjC iIjLo+ojJqjCMIwoiIwAQAQKZW5kc3RyZWFtCmVuZG9iagoKMTIxMiAwIG9i ago8PAovVHlwZSAvUGF0dGVybgovUGF0dGVyblR5cGUgMQovUGFpbnRUeXBl IDEKL1RpbGluZ1R5cGUgMQovQkJveCBbMCAwIDEgMV0KL1hTdGVwIDEuMDAx Ci9ZU3RlcCAxLjAwMQovTWF0cml4IFsxLjUgMCAwIDEuNSAwIDBdCi9SZXNv dXJjZXMgPDwgL1Byb2NTZXQgWy9QREYgL0ltYWdlQ10gL1hPYmplY3QgPDwg L0ltMTIxMyAxMjEzIDAgUiA+PiA+PgovTGVuZ3RoIDMwCi9GaWx0ZXIgL0Zs YXRlRGVjb2RlCj4+CnN0cmVhbQp42jPQs1AwAGJDhaJ0Ln3PXEMjQ2MFl3wu AD42BSoKZW5kc3RyZWFtCmVuZG9iagoKMTIxNCAwIG9iago8PAovVHlwZSAv WE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTIxNAovV2lkdGgg NDI1NgovSGVpZ2h0IDI5NgovQml0c1BlckNvbXBvbmVudCAxCi9JbWFnZU1h c2sgdHJ1ZQovRGVjb2RlIFswIDFdCi9EZWNvZGVQYXJtcyA8PCAvSyAtMSAv Q29sdW1ucyA0MjU2ID4+Ci9MZW5ndGggMjQwMTIwCi9GaWx0ZXIgL0NDSVRU RmF4RGVjb2RlCj4+CnN0cmVhbQqeRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhRERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERGbRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGFERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RnkfR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9RERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE REREREREREREREREREREREREREREREREREREREREZtGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYURERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERGe RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhRERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERGbRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGFERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERnkfR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9RERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE REREREREREREZtGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYURERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERGeRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhR ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERGbRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGFERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERnkfR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9RERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE REREREREREREREREREREREREREREREREREREREREREREZtGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYURERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERGeRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhRERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERGbRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGFERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERnkfR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9RERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE REREREREREREREREZtGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYURERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERGeRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhRERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERGbRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGFERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERnkfR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9RERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE REREREREREREREREREREREREREREREREREREREREREREREREZtGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYURERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERGeRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhRERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERGbRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGFERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERnkfR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9RERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE REREREREREREREREREREZtGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYURERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERGeRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhRERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERGbRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGFERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERnkfR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9RE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE REREREREREREREREREREREREREREREREREREREREREREREREREREZtGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYURERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERGeRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhRERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERGbRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGFERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERnkfR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9RERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE REREREREREREREREREREREREZtGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYURERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERGeRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhRERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERGb RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGFERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERnkfR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9RERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE REREREREREREREREREREREREREREREREREREREREREREREREREREREREZtGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYURERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERGeRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhRERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERGbRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG FERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERnkfR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9RERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE REREREREREREREREREREREREREREZtGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYUR ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERGeRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhRERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERGbRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGFERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERnkfR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9RERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE ZtGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYURERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERGeRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhRERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERGbRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGFERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERnkfR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9RERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE REREREREREREREREREREREREREREREREZtGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYURERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERGeRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhRERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERGbRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGFERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERnkfR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9RERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE REREZtGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYURERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERGeRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhRERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERGbRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGFERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERnkf R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9RERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE REREREREREREREREREREREREREREREREREREZtGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYURERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERGeRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhRERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERGbRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGFERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERnkfR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9RERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE REREREREZtGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYURERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERGeRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhRERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERGbRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGFERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RnkfR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9RERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE REREREREREREREREREREREREREREREREREREREREZtGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYURERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERGe RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhRERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERGbRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGFERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERnkfR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9RERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE REREREREREREZtGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYURERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERGeRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhR ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERGbRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGFERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERnkfR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9RERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE REREREREREREREREREREREREREREREREREREREREREREZtGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYURERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERGeRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhRERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERGbRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGFERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERnkfR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9RERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE REREREREREREREREZtGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYURERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERGeRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhRERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERGbRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGFERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERnkfR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9RERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE REREREREREREREREREREREREREREREREREREREREREREREREZtGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYURERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERGeRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhRERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERGbRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGFERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERnkfR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9RERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE REREREREREREREREREREZtGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYURERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERGeRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhRERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERGbRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGFERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERnkfR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9RE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE REREREREREREREREREREREREREREREREREREREREREREREREREREZtGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYURERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERGeRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhRERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERGbRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGFERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERnkfR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9RERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE REREREREREREREREREREREREZtGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYURERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERGeRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhRERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERGb RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGFERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERnkfR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9RERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE REREREREREREREREREREREREREREREREREREREREREREREREREREREREZtGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYURERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERGeRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhRERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERGbRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG FERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERnkfR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9RERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE REREREREREREREREREREREREREREZtGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYUR ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERGeRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhRERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERGbRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGFERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERnkfR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9RERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE ZtGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYURERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERGeRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhRERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERGbRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGFERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERnkfR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9RERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE REREREREREREREREREREREREREREREREZtGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYURERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERGeRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhRERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERGbRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGFERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERnkfR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9RERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE REREZtGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYURERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERGeRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhRERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERGbRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGFERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERnkf R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9RERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE REREREREREREREREREREREREREREREREREREZtGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYURERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERGeRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhRERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERGbRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGFERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERnkfR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9RERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE REREREREZtGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYURERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERGeRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhRERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERGbRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGFERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RnkfR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9RERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE REREREREREREREREREREREREREREREREREREREREZtGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYURERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERGe RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhRERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERGbRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGFERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERnkfR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9RERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE REREREREREREZtGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYURERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERGeRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhR ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERGbRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGFERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERnkfR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9 H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9RERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE REREREREREREREREREREREREREREREREREREREREREREZtGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYURERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERGeRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhRERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERGbRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGFERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERnkfR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0f R9H0fR9H0fR9H0fR9H0fR9RERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE REREREREREREREREZtGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYURERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERGeRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhRERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERGbRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGFERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERnkfR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H 0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9RERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE REREREREREREREREREREREREREREREREREREREREREREREREZtGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYURERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERGeRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRh GEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhRERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERGbRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYR hGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGFERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERnkfR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR 9H0fR9H0fR9H0fR9H0fR9H0fR9RERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE REREREREREREREREREREZtGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYURERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERGeRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEY RhGEYRhRERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERER ERERERERERERERERERERERERERERERERERERERERERERERERERERERGbRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGE YRhGEYRhGEYRhGEYRhGEYRhGFERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERnkfR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0 fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9H0fR9RE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERE REREREREREREREREREREREREREREREREREREREREREREREREREREZtGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhGEYRhG EYRhGEYRhGEYRhGEYRhGEYUAEAEKZW5kc3RyZWFtCmVuZG9iagoKMTIxNSAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltMTIxNQovV2lkdGggNDI1NgovSGVpZ2h0IDI5NgovQml0c1BlckNvbXBv bmVudCA4Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDExMiA8 ZmZmZmZmYzhlM2Y1YmZkMWY1YzhkMWVjYzhkYWY1ZDFkYWY1ZDFlM2Y1YmZk YWY1YjZkMWY1YjZkYWY1YmZlM2ZlYmZkYWZlYmZjOGY1YzhkMWZlZDFkMWZl ZDFkYWZlZGFkYWZlYzhkMWY1YjZjOGVjZDFkMWY1ZDFkMWVjYzhkYWVjYmZl M2Y1YmZlY2Y1YzhkYWZlZDFlM2ZlYmZjOGVjZDFlY2ZlYjZkYWVjYzhlM2Zl YmZkMWVjYzhlY2ZlYjZlM2Y1YWRkYWY1YjZlM2ZlYjZkMWVjYzhkYWUzZDFk YWVjZTNlM2Y1ZTNkYWY1ZGFkYWY1YjZlY2Y1ZGFlY2ZlZTNkYWVjZGFlM2Zl ZDFkYWUzYmZkYWVjZGFlM2Y1YWRkMWY1YjZkYWZlYWRkYWZlYjZkMWZlZDFj OGY1YzhjOGY1YzhjOGVjZGFkMWY1YmZlM2VjYzhlM2VjYWRlM2Y1YTNkYWVj YTNkYWY1YWRlM2ZlYWRkMWVjZTNlM2ZlYWRkMWZlYjZjOGY1YjZkMWUzYzhk MWUzZTNkMWY1ZWNkMWY1YmZkMWZlYmZkMWUzZDFjOGVjZTNlY2ZlYTNkMWVj YWRjOGVjZGFjOGVjZWNkYWZlZTNkMWZlZWNkMWZlYWRjOGY1ZTNjOGVjZTNk YWZlZWNlM2ZlYzhiZmUzYjZlM2VjYmZjOGUzZDFiZmUzYzhjOGUzYmZlY2Zl YmZmNWZlYzhmNWZlYWRkYWUzYWRjOGUzZGFkMWZlYjZjOGUzZGFmNWZlZDFm NWZlYzhlY2Y1YmZkYWUzYmZiZmUzYjZiZmUzZDFlY2Y1ZGFkMWVjZGFjOGY1 ZGFkYWVjYWRkYWVjYWRkMWUzZWNlY2ZlYWRiZmRhZGFlY2Y1ZDFlM2VjYWRj OGRhPl0KL01hc2sgMTIxNCAwIFIKL0xlbmd0aCAyODUyMgovRmlsdGVyIC9G bGF0ZURlY29kZQo+PgpzdHJlYW0KeNrtvf93HMeVnr8AZjAkIXEwBEljSAKU jdDEMggpWTJhJxtB1jq2FNmKQ8VaO4mk7Ma73ni/JP//T/nwfOo9cd6T66rq rpppiM97zj11eqanv1T3gyreurz3z/4MIYQQQgghhBBCaAra+f9s12zPbJZs nmw/sJ1ki2Q3zG4m0/favpXsIJn/7q1kbye7nWyZ7DDZ0mwV2J1kui///ijZ 3WTqh3vJdJ/3k30nmbZ3zI6TrZPpPA/M9Lmuf26m32tbx3+YTOd/lEz9rOd6 kkzH0f2fJtP+2u9xMm3r+eh5vZPsu2bfS6bj6TwngeXeB9lZMn9+ev7eT/qd ju/Hu2nm+/t7qH7Uc/L3UOe/ZyY+tP0vkj1J9v1kTzN2nkz357yN5Vem9yjq h9b8aruUYz1/vbel/Gp/5/fPk+U4dv5q+X2WTNt6Lv48H5k5R77/UH51n6Uc j+VX74Oen95X/zuu/tHfzYhfP28tvzpPjuNafv9lsojfi2T+dzgah2v5rR2H /b3w5+X8yobyq/vLjcMRv9q/ll+9r+r/aBwuHX+dR43DEb8+Dst8HI44G8tv NA7reNqvFb+143B0vrH8Rhz/q2Ti0vl1i/jduebz6Fp+W8+jS/nVeJDjt3Ye rX5vPY/W99E43IrfofNo3c+25tFj+R06j9Z9bmse3evfwVOfRzs30TwaIYQQ QgghhBBCaDoieoLoCaIniJ4geoLoCaIniJ4geoLoCaIniJ4geoLoCaIniJ7Y RvTECrcMQgghhBBCCCGEJqWd1O5au2ftLLXz1O4HrY63SO0Na2/a99q+ldqD 4Hdvpfbt1N5O7TK1h7atdhW0d+y+/Puj1N61frhn93k/td+x7R1rj1O7tvM8 sHZl1z+3dm3bOv5DO/8j62c91xM7ju7/1PbXfo9t+8Ce1zup/a6137Pjzew4 3ubeB7VnwfM7DPrpwI7vx7tp7UHm/d2153Q7eF73rN237X+R2iep/X5qn2ba c7u/neA5D+V3396jqB9a83u7kuM79t6W8nsa8PvnhRw7f7X8PrPtWfA8HwUc R/sP5fd+Jcdj+b1hz283+Ds+t7+bEb+LkfzOCzmu5fdfZvi9CP4OR+NwLb+1 4/BBhmPn9+2R/O4WjsMRv7OB/J5Y/0fjcOn46zw+zPC7G/Dj43DE2Vh+o3H4 lu3Xit/acfggM44M5Tfi+F8Zl86vtxG/130eXctv63l0Kb/HhfzWzqP3O82j 15lxuBW/Q+fRu1ueR4/ld+g8+nDL8+he/w6e+jz6pHAejRBCCCGEEEIIITQN kX+C/BPknyD/BPknyD9B/gnyT5B/gvwT5J8g/wT5J8g/Qf4J8k+QfwIhhBBC CCGEEELo+Z/9H4+Me1DkMXGP0QuznOf33WTvJZOnSNvyFP4g2fvJ3IPkniP3 9Mg+SPZDs5fJ5DmSJ0ceJnmKLs30ud+nPEU/MvtxMu2vlVN5ftWf7qHT5xdm azN58nxlU9vu+ZXHy1d6/Hh+nmilRR6/f53s3yT7i2T/Npk8te5Zds/hh8mi 98TvT8fTc7tKpv6Sp/1mYD8w+8hM59d7+BMzXznyFSS9h7rO52YfJ/vLZFqZ +Wmyf2emz/U+6nnpeNEKRy2/pRwP5fdnyZxfcV3KsTyt6gf1v34X8euRR98x y3E8lF9dn/4O5FZMI471u1b8vpPMOdYKjvYTx2P59RUcPX/1kzj2lZte/Hok gK/g6LlG/P48WS2/vgKv/ozG4db8lo7DEb9+nbX8ahzWc/AVFR+HW/FbOg5H /Gp7KL+14/BQfjUO63nWjsNj+dV2xG+O47H8ahz2FT/nWPzq/RrK7/NrPo8e yu+3ZR7tkQmbmkf34rd0Hu3z2E3Po8fyO3QeHfG7qXn0WH7HzqPFbzSPzvE7 dBwu5RchhBBCCCGEEEJoOiJ6gugJoieIniB6gugJoieIniB6gugJoieIniB6 gugJoieInthG9MQctwxCCCGEEEIIIYQmpeepVT1Vr3+q/w/i9V5fWJur2/xu at9L7S3bVp3fH6T2ffv9DbvO23adR9Z+kNofWvsytar7qjqsqg+rOq+X1t4N 7lN1Xn9k7Y9t/2epvbD+3Av6+cLatbUz62evf+x1m0/t9w+D4/l5ojrpqtf7 r1P7b1L7F6n9t6k9s/MvrNVxPsy8JyfB/ei5XVl/Hdvxvf2BtR9Z+569hz+x 1uu+e/33I7vO59Z+nNq/TK3qqv80tf/O2p/a+ziz460a8VvK8VB+fxbw+3Yl xw+sH5b2u4jfecBvKcdD+V3a3wGvl35SyPGsMb/vBBx/1/Y7a8Sv119fWT9d 2fUfdOb37YBjf74Rvz8fyO88+DsejcOt+S0dhyN+3x7J70t7Dl4P/W4nfkvH 4Yjfi5H81o7DQ/n9C3uetePwWH4vMvzmOB7L76E9z2gc/rm9X0P5ve7z6KH8 flvm0bMtzaN78Vs6j97d8jx6LL9D59HzLc+jx/I7dh79MjOPzvE7dBwu5Rch hBBCCCGEEEJoGiL/BPknyD9B/gnyT5B/gvwT5J8g/wT5J8g/Qf4J8k+Qf4L8 E+SfIP8EQgghhBBCCCGE0GsPyDIweTjkCdzPmDwqvjIkz488QvIY/SCwnOfo bTNdrzxK8hxFHjFdn3tyPklW6jmSyVMkT9y9ZOqXT5P5SpFfl657Hph7gnUf ug55SO+b6br0vXt+ZfJw6XsdV9vuAZbH9t8n08qrPIHueZbH1t8L9/zKtALj Hmh5dtUf6l9f4ZKn198jHf8jMz+v9v8smVYM9LycF3+fdN/uqdfn8hjq/fpF Mnl8f5ns82QeQbHTmN/I8+v92JpfcVvKsa9URCuvpfy659c5lofcn28rfks5 dh5z/HrERbQS6xzrc+3nKy6l/Oo9ifh1bvzvpJ+nll+9h85vFAEVrZSP5fc/ JItWYHMcD+U3+jtYOg734tcjQ9Tf2t/H4bH81o7DvfgtHYd9/PWV2By/Goed 39pxOFqBzfGr7Wj8yHHsK6+/SlbLb+04LH610tqK36nPo4fy22oe3Zrf6zKP 7s1vbh6d47f3PNr/jrSaR//HZNE8uje/uXl0r38Ht5pHD/13cI7jKILCrwsh hBBCCCGEEEJoOiJ6gugJoieIniB6gugJoieIniB6gugJoieIniB6gugJoieI nthG9MQRbhmEEEIIIYQQQghNSqpfugxaZdNUHd/9TKvjeV131W1VPVfVe/1B 0Obqvr5tra5X9WDlhYnq2er6vA7rJ6ktrfuqVnVeVUf3nvXLp9aP8+C6jux7 b72O88yuQ/WN71v73L73us1qn9n3O7bt9ZtVb/nfp/a7qf2ePX/VL94N3guv 26z2wM6r9tj641PbVr/cDN4jHf8ja/282v+z1N6x5+W8+Pt0atczs8/37P36 RWpVr/mXqf3c3sdZJ36jus3ej635vV3J8Szg6e5Afr+T4fhF8Hxb8VvK8U4l v7MMvzcDjm/afouB/L6X4XcZcLwOzlPL7/sBv7sZbi6C5zOU3/9g7+O8kuOh /EZ/B0vH4V78rgIujoJxeCy/teNwL35Lx2Eff9eV/H434Ld2HH7PjlPK70Vm /Mhx/J69p78ayG/tOCx+f9qY36nPo4fy22oe3Zrf6zKP7s1vbh6d47f3PPq4 0zz6P2bm0b35zc2je/07uNU8eui/g3McPyucRyOEEEIIIYQQQghNQ+SfIP8E +SfIP0H+CfJPkH+C/BPknyD/BPknyD9B/gnyT5B/gvwT5J9ACCGEEEIIIYQQ eu3R85Wai8ByHiP39MuDJg+Se47c0/dRsvfNfmbmkRO6PvccrTKm/c+TyVP0 ykweKHmQ3PPmHtac51fmHrq9wPx6Iw+we0jV77o+ff442cPA/Lh+3fq9nu/N wHS+aCXSPcD+Puhz9wBr2/vD3wN5aHfN/P1yD6V//pNkbyXLRVDofXLPq3sq ZVfJfhmYVnT0fvpKmx9/KL+lHPfit5bj1vw6x0+SeQRFLb+yHL85jmv51e8i fv35Or/++1p+oxUcbes4Ub+05lcW8XuYTDzqvWrNr37nzys3Drfit3Yc7sVv Kce+glPKr0dAjR2HSyMpxo7D0bhey68sus5Sjj0SKsev7NislOOh/Mqc39w4 rP2G8vvwms+je/Orv6vROLwpfqN5dGt+S+fRpfz2mkf34rd0Hp2LgOo1j/bj bXoe3fvfwVOdR3uETsQvQgghhBBCCCGE0HRE9ATRE0RPED1B9ATRE0RPED1B 9ATRE0RPED1B9ATRE0RPED2xjeiJPdwyCCGEEEIIIYQQmpRUj9frrF8Eba7e q9fpVv1b1X/1uq9ep/cj20/tz6x92677wrZV93WVabX/eWpV5/WVtcoqqvqv XjfX6yPn6jav7fz6fzd7QbsK7tfrN3t944Vdnz5/bM/fWz+uX/dje743g/bE juOt12/29+GGncffq2Xwnupz1VfetdbfL68v7J//JLVvBc/Dr+Pcnqv3n9fj vkrtL4P2p/Z+roPnNZbfUo578VvLcWt+neMnqX0RcFfK714hvzmOa/ldZPg9 yXC8yFxnjt93M/zOMv3Smt+fZPg9NB7PO/E7D55XbhxuxW/tONyL31KOLwfy e8/4HTsOz0fyWzoOR+N6Lb83M9dZyvF7lfxeGL+1HA/ldxnwmxuHz0fye93n 0b35PcyMw5viN5pHt+a3dB5dym+veXQvfkvn0cstzaPnW55H9/538FTn0Z8W zqMRQgghhBBCCCGEpiHyT5B/gvwT5J8g/wT5J8g/Qf4J8k+Qf4L8E+SfIP8E +SfIP0H+CfJPIIQQQgghhBBCCL327MhD5h6kZ8nc45HzGLnnaGEWeY5k8hgd mB0H5ivm8gydJpPHT5/7SsilmTxuXyRzT557jtw8gmKdMe2n45au4LgHWOfX tu7/fmDaP/IEu4fWPczuuZWpv93Tqd/78/PjuAdZz/9WMu3v723kmYs8wLJo pUbfu8fSPZDyLGqlwJ+POIo8v3rPohUbX7nRcztpzG8px734LeXYOXDP71h+ azkeyq+eT3Rd8kA/Staa34g/ma/8tOa3lOPe/Mr0nmglppRfX7nJ8VvLcWt+ Sznuxa+Pw/q7qX5S/4nfp8l68VvKcS2/2v44We04rM+H8jt0HG7N79BxuJZf jcPOb45jj6Boze/U59Fj+c3No6OIlqnMo/13rfjNjcO9+GUezTz6T3Ec8dt7 Hl3KL0IIIYQQQgghhNB0RPQE0RNET+D1JXqC6AmiJ4ieIHqC6AmiJ4ieIHqC 6Anm0URPbCN6YoZbBiGEEEIIIYQQQpOS6rKqvq3Xf32WWq9Xmqv36nVfF9ZG dV/Vqt7rgbXHQbu0bdV1PU3trn3udcwvrVW93C9S63V4ve6rt/cy/bIO+lPH La2/fhFcz8zu/37Qav+ojrPXV54Fz9XrHu/a/Xm/+fPz43j9Zz3/W7a/v7dR Xd2ofvOundfrrOt7rzfs9YNVF/gweD7Pgv6Y23sW1Vv3uus7nfgt5bgXv6Uc Owfnjfmt5Xgov88y16X60Y868Xuc4djrtrfmt5Tj3vyu7D25quT3qpLfWo5b 81vKcS9+fRw+tH76qfH7tDO/pRzX8qvtjweOwzsj+R06Drfmd+g4XMvvUcBv juPzzvxOfR49lt/cPPpq4vPo/U785sbhXvwyj2Ye/ac4Xm1pHl3KL0IIIYQQ QgghhNA0RP4J8k+Qf4L/N0f+CfJPkH+C/BPknyD/BPknyD9B/gnyTzCPJv8E +ScQQgghhBBCCCGEXq/MuWdGnp7I0+EerchzNAvMPX3yGGm71HMkj1zk0XOP pUweJnnqPkn2n5L9Ipl73tyD5J4f9xi5ucdJv3NPYNRv0QqO76eVV3l+tQL7 62TvJJMHOPL85lZOz5JF/e2ea3nuIg+y7CAw389XeN3jK3OPra73LbM7ybSt 3/l9Rys4Ot+5mZ6Xnt+XydQvvr+/d6+SecSMnqt7wofy6+9zxPGm+I3eK+dX nveh/JZyPJZfPe9oRSDHcWt+1b+lHLfmt5TjXvxqv2gFJ+LX/67V8qv78xXr 0nF4LL+lHPfi1zlWP2kc/qtkrfkdy/FYfmvH4db8lnLcmt9ajofyK3N+nWP1 g8bhu8mG8vuo0Ty6Nb+l4/BYfq/7PLoXvzmOe/F7XebREb+959H+PJhHT2se jRBCCCGEEEIIITQdET1B9ATRE0RP4PUleoLoCaIniJ4geoLoCaIniJ4geoLo CebR25pHI4QQQgghhBBCCE1Hj1LrdVVVpzWqU+r1aKO6r7Og9Tq979p2ad1X 1dON6vEugvOrPqzq7H6S2v+U2l+k1uvmev1Xr9vq9V699Xqx+3a8eabfovrr vt/z1H5sz/nXqX0ntarfHNVt9ufo/X+W6W+vO70Kjud1vQ+CdhGcx99PrwPs 9ZZ1vW9Ze8e23w7uO6q/vrT35Nyel57fl9Yvvr+/d6/sODN7rotG/K4LOd4U v9F75fwejeS3lOOx/O4F/b8u5Lg1v7uVHLfmt5TjXvy+Zdtefz3id28kv2u7 /5uV4/BYfks57sWvc3xp4/BfdeJ3LMdj+a0dh1vzW8pxa35rOR7K7yrg1zne s3H47kh+W82jW/NbOg6P5fe6z6N78ZvjuBe/12Ue/daW5tFr5tGTnkcjhBBC CCGEEEIITUPknyD/BPknyD/B/5sj/wT5J8g/Qf4J8k+Qf4L8E+SfIP8E+SeY R5N/AiGEEEIIIYQQQuj/5Wk7Dsw9bfIcuWdrVmg6nzxFN8xKr8s9RO4Bk+lz eY7kUXPPr1ZwPjFzz6uOo8/dE6T7dM+RW6knWMfRfr6iru9Pk8kDHHl+Hwem /tJ1RR5W9+S6x/VBspfJ5KHT95EHv3blJvLs306m80aRD+4B1udvm7nn2Fde 9bzumulz7fcbs9zK7afJPGJm0Zjf6P3tza++L+XYPb/y7Ob4VT9H/OY4Hsuv PP3Or3vYI46d398mG8qvPo841ufieFP8+nX04lf9m+PY+dXfsxy/2v7UzFdg SzluzW+O41786nPn18fhiF/9rpbfoeNwK359HPaV19b8Dh2HW/NbOw635tc5 1rb4Vb9E/F4lG8tvjuPW/JZyPJTfVvPo3vzm5tFD+R07j+7FbynHvfgt5Xgo v2Pn0f7vpjdtHu38bmoeXcovQgghhBBCCCGE0HRE9ATRE0RPED1B9ATRE0RP ED1B9ATRE0RPED1B9ATRE0RPED2xjeiJfdwyCCGEEEIIIYQQmpSiOrnHQet1 clX31evSzgpbnU91Xm9YW3pdXt/V69ee2Oeq+6p6uF63+a/s80/s/i7sOPp8 P+iHe5l+KK3jfM/2uwi+P02t6jdHdZsfB+2JXVdUH9nrMHu95AepfZnaI/s+ qr9dW3c9qst92867Clqv36zP37bW6z6v7Ph6Xnetndt+v7FWn3vddj3fT423 WSd+9ys5bsXvQSXHXrf5spDfowy/84H9UMrvXsDvupBj5/e3I/mdZTheGceb 4tevoxe/p4UcO78vC/k9NH4/tf5fVHLcmt8cx734PQ749XE44vdwIL9Dx+FW /Po4fL8zv0PH4db81o7Drfm9G3z+G+uXiN+rRvzmOG7NbynHQ/ltNY/uzW9u Hj2U37Hz6F78lnLci99SjofyO3YeffGGz6OPtzSPLuUXIYQQQgghhBBCaBoi /wT5J8g/Qf4J8k+Qf4L8E+SfIP8E+SfIP0H+CfJPkH+C/BPknyD/BEIIIYQQ QgghhNAfe1TcU+oeGXm63AMqe5JsL7DWniNdp3sGTwLTeeUx+iKZPMCXgUUr OOoH7xdf6ZBn6KGZ75fzxLm5B1r9LE+VzvtOsj9P9p+T/Zdk7vFVP8rDGXkM 3dOr/vHnLg+o+s09b6dmet/0nP356nP3RMvc41tqeo76vbbluX5gpu/dg6j7 dY+3PLruGfYVG+8nmZ6nv+el/MoifvV5Kcet+I2ec8Sx+lsrW6X8ypxf3VeO 41786vcRx1ppHcqvjhddZynHviLhkRZD+W3F8VB+nWMdz//uj+VX96kVuVKO nV/1z1h+x0ZQDOVX5xW3uXHY+dXntfzWjsOt+K0dhyN+dfyh/EbjsJ7HtvmV jeVX/aT3pXQc7sVv6Ty6Nb+1K7Dbmkf34rd0HG7Nb+k8uhW/Q+fRvfgtHYdb 81s6DnvkxKbn0b3+HVzKsUfIbGoeXcovQgghhBBCCCGE0HRE9ATRE0RPED1B 9ATRE0RPED1B9ATRE0RPED1B9ATRE0RPED2xjeiJZ7hlEEIIIYQQQgghNCl5 PVSvc+z1VFWn1usXq32S2r2gbV33VdfpdX1PglbnVb3XL1Kr+s2XQRvVX58H /eJ1ylXX9aG1vl+uju486P+59fM9O+87qf3z1P7n1P6X1D4O+vPU+s2v0+s0 HwXP/a71m9fNPbV2156zP99jux5/r7xec2m7st9rW3WnH1i7svvwus1er/rc vr9rnx8G/XRhz3MxkN/dDL/zSo5b8XtcybH6+6qS308CfvcKOe7F7zrD8f2R /O5lrrOU4/Pgd6uR/LbieCi/q+D+P2nMr+7zeSXHzu+sEb85jnvxOzNuc+Ow 83s5kN/acbgVv7XjcMTvfCS/0Tg8mwi/R434ndv7UjoO9+K3dB7dmt9Sjofy 22oe3Yvf0nG4Nb+l8+hW/A6dR/fit3Qcbs1v6Tg82/I8ute/g0s5nm1pHl3K L0IIIYQQQgghhNA0RP4J8k+Qf4L8E+SfIP8E+SfIP0H+CfJPkH+C/BPknyD/ BPknyD9B/gmEEEIIIYQQQgih1x4NeVbcgyNPkb53T1tuJT8yeVjk8TkILPJo 3UomD9FnyXTd7knSfcizKE9c5Clyj6Cv3MjT5J5O3b+vSORWYN3Dq9/Lg+se X+9P9b88xzqu+utRsl8n+20y9/ju2Pvgnt6cuUfN3wv1l69I6H2QZ1X9Fnn6 /frc/Hz+XD9IJs+stn0FJ/JU63rdI+6eW3l0o/dKn2t/fa7r1/nc46r32p+X uCnl19+fUo5b8avts2Ti2D2/zrHOX8uvTB5j7a/3wJ+n9/tQfr2fvT+dF+dY ERTi9zvJWvOb49hXvryfWvOrlZFe/Oo6/T6d49b8+gqsnlu0khJFjA3lt5Tj ofz6352x47Dz639X9R54pNDYcdj5jfo1x6/64b8meydZNA734jeKAIm4UP/V 8isTv6Xj8FB+PaJo6Dg8ll/m0cPm0fp8W/PoWn6vyzzaIyjcWvNbOw5HkSW9 59Gt+Z3aPPpOsmgerX6f6jwaIYQQQgghhBBCaDrC60v0BNETRE8QPUH0BNET RE8QPUH0BNETRE8QPUH0BNETRE9sax6NEEIIIYQQQgghNB2pHqnqonr91V37 3uvkRvWb9zKt6qOqXutB0Eb1aG+lVvVdP7Pr9jqwug/VBVYd3ajOq9fz9brr r+x7r0/u9cTVb1Hd1/3g9/fs86h/1f/P7Ljqr0ep/XVqf5tar9e8Ezzvi8L2 MPNeHNnna3sfHli/RXW6/fq8nQfPWdsfpPalbXv99ajO9Mqe09r2V3ueea8u bf8ju/6lncfrNvvzOqjkdy94jvMN8avtM+PY6zY7x6uB/Kq9sv1fBs/T+30o v97Pe8HfjYjj+8bvdzrxm+PY69Z7P7Xm925nfk+D+3SOW/P7POA4qoN+3Jjf Uo6H8rub4bd2HHZ+zwN+94J+GjoO3ws4reVX/fBfU/tOZhzuxe88+DziYjaQ 37XxWzoOD+V3luG3dBweyy/z6GHz6E+2PI+u5fe6zKN3M+Nwa35rx+HTLc2j W/M7tXn0ncw8+nTi82iEEEIIIYQQQgihaYj/N0f+CfJPkH+C/BPknyD/BPkn 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 4ByrX9XPrfkt5Tji1yOpSvnNcewrShG/vqJTym8UuaD3+2+TbYpf9ZfeN1/B 0YrNWH61MqP7VP9E43Brfks57sVv6Tjcit+h43BrfrX942TRSnArfluPw6X8 ysRv6Tg8ll+Z86vf+QqsONb1DOX3ZaN5dGt+S8fhXvyWjsO9+GUe/ac5bs1v 7Tgc8dt7Hh3x+6bMo3v9O7jVPBohhBBCCCGEEEJoOiJ6gugJoieIniB6gugJ oieIniB6gugJoieIniB6gugJoieIntjWPBohhBBCCCGEEEJoOlIdWtXr9Tqq qrvqda+9nQefez1btap36nVlvc7rImj1veoh5+pSe51dr9t6bu2h3Veuvu+R Hd/v46Fdf1Rv3ftv364jav04XrdZ26rPrLqz/z24Hq8L7efzes3Lwvfi08r3 JFeP3es2e/3m39l7fpR5/k9t2+s33w3uO6rbfNfOq7rNr+z4L40Hr1d8Zu0D +91OI36Xhc+nNb+LSo5b8/tBhuMT6+fW/JZyHPF7byC/OY69Hvynmfeolt9l wLHe77/dML8ze9+8/vrXjfi9Y/e5yozDrfkt5bgXv6XjcCt+h47DrfnV9o+N 4+cBr2P5bT0Ol/K7Z/yWjsNj+V0G/N614/k4fDSS31bz6Nb8lo7DvfgtHYd7 8cs8+k9z3Jrf2nF4uaV59J03fB7d69/BrebRCCGEEEIIIYQQQtMQ+SfIP0H+ CfJPkH+C/BPknyD/BPknyD9B/gnyT5B/gvwT5J8g/wT5JxBCCCGEEEIIIYRe ezrkGZQHQ56NdWCRZ8g9R5HHyD0r8vy45+tGMveERb+Th0ieMW27ZyvyAPp+ 7unUflpJkydPniPdp67nZjJ5uOQ5ksfoImPuiX2SzFc2d8z+Jpm2/zrZ3yXT 5/cCk+fSPbeR59lXVp6ZRZ5g7e8rp7LI05wzRVC4x1cmj+zvk8ljeJXsPGPy LEYrr+6xjlZgdRztF61c6j3S8f1+nM+h/Kr/fD/nuDW/OY79fWzN798ny3Hc i98cx39nVsqvLMdvKccRv3rfWvGr69bKjXPUmt8cx6359ePqvkvH4Ry/rcbh VvwOHYdb8+srODmOW/FbOw47v6XcDB2Howim6D0ttWjlNeK4F785jiMOSvk9 ajSPbs3vdZlHl/LLPLpuHh3Nm6Yyj27Fb+04HPG7qXl0L35L59G9/h2c47iU X4QQQgghhBBCCKHpiOgJoieIniB6gugJoieIniB6gugJoieIniB6gugJoieI niB6YhvRE0RQIIQQQgghhBBCaFpSnVLV9VX90ZltexvVdV0Gn3u9V6+Lqrqt Xrf2hm0vMr9TfdcHtu11aaP6vb7fPNj/69SqDu8Hdp+6npupVX1a1X3dD/ox V7f5iX2+b8dV+ze2/dep/Tv7/F7Q7tl5vb7vPOgvvR/PrI3qOK/tfA+sjepE 59ovU+v1mtWqnvLvU6t6v1e2HbWHdt8ze9+83vSRvTev7Dir4L1e2Ht0GtzP uhG/82A/57g1vzmO9zI8juX37ws57sVvjuO/G8jvXiG/pRxH/M4a86vr/l3A UWt+cxy35ncV9EvpOJzjt9U43IrfoeNwa35PKjluxW/tOLwX/N0by+9FZlz3 cXg1kN+58Vs6DvfiN8fxciS/rebRrfm9LvPoUn6ZR9fNo/cmPo9uxW/tOLza 8jy6F7+l8+he/w7OcVzKL0IIIYQQQgghhNA0RP4J8k+Qf4L8E+SfIP8E+SfI P0H+CfJPkH+C/BPknyD/BPknyD9B/gmEEEIIIYQQQgih154n9wzJsxF5gNzc 0+WeQHmM3DMkD1CpxyjyFLnnTZ4i9xhqWx4/eYLk0XPPkZt7muTB07buX9fx YTJ57tQfL5K518g9pTLt7x4n7e+e3x8le55sP2M5T6p7an3FxT37Oq6vvLpH 11dedRw/76FZ7UqOnp+es78H+vxpsv9hFnmAdRx//3Vf7qH198Y9v+pfrfTJ 43g/mY7r/TGUX32u88tTHnmOneNW/Gq7lOPW/MoDrPPous6SiWM9l9b8Ris4 4vjHyVrzq/7OcazfR/z6isd14dfHhRzHrfjV/ZRyXMuvX8/QcbgXv0PH4VJ+ df/Or66zdhwey+/YcXgsv7lx2Fdevf/H8lvKcW9+I479PWvNb+k82p/jpubR m+I34lj8bmse3ZvfXOThmzqPbsVv7Tjcmt/aeXSvfweXctzr38GKqIjm0R7J GPGLEEIIIYQQQgghNB0RPUH0BNETRE8QPUH0BNETRE8QPUH0BNETRE8QPUH0 BNETRE9sI3riGW4ZhBBCCCGEEEIITUqqG+t1Xfdt2+u3eut1ar2Or+q9el3X 4+DzqN5rVOfV6+aqzqvX+9W26vWqjuu57Rfdp9eJfWXbK7uOD1N70/rjhfWr 2mfB5y/sufj+Xrf5R6l9br+L2lwdZK+z7PXSvS73vl2f7z+3/b3eup/30Nra OuxLe87+Hujzp6n9H9ZG9ZuPgvd/Zt8fBe+N121W/56kVvWC79txDxvxe2Hn f2nnWWc4bsXvopLj1vx+bufRdZ0Zxyed+N3PcPzjTvzOCjm+yPB7ek35nVdy 3IrfZSXHtfyuCvnNcdyL36HjcCm/q4DfxcBxeCy/Y8fhsfzmxuE9G4fnmfd0 3onj3vxGHPt71prf0nn03pbm0ZviN+L48y3Po3vzG3Hcit/rOo9uxW/tONya 39p5dK9/B5dy3OvfwV9n5tE3C+fRCCGEEEIIIYQQQtMQ+SfIP0H+CfJPkH+C /BPknyD/BPknyD9B/gnyT5B/gvwT5J8g/wT5JxBCCCGEEEIIIYRee47cE+ge I/ccuQdOniP34HmEhb6/k8w9RvK0uGdJHhdtRxEUMl2XrjPy+LnnyD3Wspzn 6INkfn/y/MqDl/P8RvbCzFdutMLqnt9Hye6Z+fOOrifnGT41U//rOtwTKVsF 5u9X5Pl1T1/kqfb3Vt+7J9c9vtrWe3LXzN8XXb+/t7reoZ5fN33v/TGUX32u fon49fvszW+O47H8/n0y9/zK8637+yxZqed3KL/iJeJYKzit+XVPeynH/ne/ Nb/OcS9+dT0Rx/q8Nb9DOS7lVxbxWzoO9+K3dhzO8asVWPGr+xO/Y8fhsfwO HYd78+srt7JW/F4lq+W4Fb+l43AUQdGa39w82iNZNjWP7s1vbh4tfrc1j+7F b47jofy2mkeXjr+9xuFW/F63efSm/h0ccdyKXx+H9fnYeTRCCCGEEEIIIYTQ dET0BNETRE8QPUH0BNETRE8QPUH0BNETRE8QPUH0BNETRE8QPbGN6AkiKBBC CCGEEEIIITQtqe6r1/H1eq9e99Xr56ruq9ffXQbf30mt13s9s23VhT2xba/7 OrN2btcZ1ev1uq9eb3ptn0d1Xz8I7k91m2/Z8aK6r1H7wlqvu/7j1Hrd5kep vWetP+/oenJ1nU+tndl1rIPzrYLW36+obvN55rqi93Zuv4/qNT+19+SutefB ++3v7aG9d7V1m71dB/0xlN8L65eIX7/P3vzmOB7L79/bc1Dd5pd2f5+ltrRu 81B+dzIcP+/E72wgx/PO/M43xO9hhuNlJ36HclzK74MMv6XjcC9+a8fhHL+f G78PjN+x4/BYfoeOw7353Qs4bsXv1UCOW/FbOg47J734zc2j97Y0j+7Nb24e /fmW59G9+M1xPJTfVvPo0vG31zjcit/rNo/e1L+DI45b8evj8GWjeTRCCCGE EEIIIYTQNET+CfJPkH+C/BPknyD/BPknyD9B/gnyT5B/gvwT5J8g/wT5J8g/ Qf4JhBBCCCGEEEIIoT/2iC1HmjxD8gTKgySPjzw67hlamOnzaCVFx5HHWdcf eTLlGZLnzj1G7iH2z2X6nTxQ8iD5yo3u7yCZ7ivyVOq+3NOp8+h+14HdT6aV Vnl+30nmK7GyHTN9rucXedjd4+fXp/uIPnePaeT5dc+f/96fv57blZn3p0z7 Rx53HVfvTfTe+3W5p1krAzqvv1f+nP09l4kL56EVv75Co+frHLfm1z29OY5b 8/tJMufY78evs5Rf3WfEr/gTxz8yE8et+dV+Eccyfd6aX/3OOdZ+rfn15+Xv R7RC4udtxW9rjkv51fX4++3vSy9+S8fhsfyOHYed34iPUn5z47CvqOr7ofwO HYfH8ttqHNbxniSL+PXn5tddOg5Pjd/W82i3aKV10/PoXvyWzqOd303No3vx WzoO9+Z37Dy6lt/ScbgXv6XjcK9/B5dy3Ovfwbl5tHMQ8YsQQgghhBBCCCE0 HRE9QfQE0RNETxA9QfQE0RNETxA9QfQE0RNETxA9QfQE0RNET2wjeoL8Ewgh hBBCCCGEEJqWvJ7tcmSruq6q46v6r6rXqnqsXtd1Ye2xHdfrr+o4e3b9UR1i 1XVV3V2v9+r1nf3zQ/ud6seq/qvXXdf9Hdh9RXWGl3a9Xqd2Zv3g7f3UPk+t 6ja/Y9vPrd2x9rk9v6g+ttfr9eu7yHzu9Y6jus1et9d/789fz+3KWu/PI9s/ qpc9t/cmeu8vgs/1+w/svIeZ57wM+v044KEVv6vgPXaOW/M7q+S4Nb+fBBwv gr9ftfzuZfjdMY5/FHDcmt/TDMdr+7w1v6uA44tO/M6D64yuLzpvK35bc1zK 7yx4vxfBfbTmt3QcHsvv2HH4KLjPofzmxuGZcfl8JL9Dx+Gx/LYah3W8Jxl+ l8HvDivH4anx23oevczc37bm0b34LZ1H72xpHt2L39JxuDe/Y+fRtfyWjsO9 +C0dh3v9O7iU417/Ds7NoxeF82iEEEIIIYQQQgihaYj8E+SfIP8E+SfIP0H+ CfJPkH+C/BPknyD/BPknyD9B/gnyT5B/gvwTCCGEEEIIIYQQQn/sSXPPk3tq VoHJ0+MewePA9H2px9c9OO55kadI2/IYyfP3NNnvk7ln6FUyX6F9ZXYZmHsU 3SPk93XbLLrPyAMoO0l2K9k7yf6Q7NfJ9Lm27wfmnmF/Ph454c8/8iTmPIwy fa5+LPVU+nvrHkB/Tr5SK5OH8lkybec8mZEn1z2K+tzPG92ve1q1retzD/VY frWd47g1v7Uc9+Y34rgXv4+T5Thuze9QjlvzK/OVnk3xm+PY+fWVqFp+o+uM /p615reW49b8lo7DrfmtHYdb81s7DvfiN8ex92Mpv+qXaCWulOPW/Po47Of1 513L70WjeXQvfqc+j+7FbynHm+J30/PoXERAxO+m5tFD+R07j474fVPm0Zv6 d7C/J6X8IoQQQgghhBBCCE1HRE8QPUH0BNETRE8QPUH0BNETRE8QPUH0BNET RE8QPUH0BNET24ieOMQtgxBCCCGEEEIIoUnJ6+B63Vivs7oKWtVp9Xq+x0Gr 70vrNXv9Va+bum/bqvequr1PU/v71Hpd11f2+aV9/so+99brAXs9V7+v29ZG 9xnV71V7ktpbqX0ntX9I7a/tc23fD1qv6+zPZ9faVea5rTKfP7B2Zf1YWmfY 39vz4Hn68/E6zaov/My2c3WIozrMXg/4KDjvUYY7r4/9zH4/b8TvqpDj1vzW ctyb34jjXvw+LuS4Nb9DOW7N78r6+3DD/OY4dn4PR/IbXWf096w1v7Uct+a3 dBxuzW/tONya39pxuBe/OY6PCjleBe/t4chxuDW/Pg77eQ9H8ttqHt2L36nP o3vxW8rxpvjd9Dx6PpDfTc2jh/I7dh69fsPn0Zv6d7C/J6X8IoQQQgghhBBC CE1D5J8g/wT5J8g/Qf4J8k+Qf4L8E+SfIP8E+SfIP0H+CfJPkH+C/BPkn0AI IYQQQgghhBD645WbWk+de4bc06zPtdLg+50lk+dI+8nDFXm43XOn7XvJ/Hv3 DEV2WWju4dN1aXsvmfpN1xF5LmXuSYqeg3ve5AGWB/dRMnmA3cO7kyz6XM8h 5/l1j+DbyXwl1U3fyyOq9+lLs/lAu5vMn5t7DN3j6xEK0QqKP5foPl+a6bxX Zn48XyFyj//azD27pfzK9Pyi+3WOnd+byYbyq/2dYz0v9VOO46H85jj2lYjW /PpKrHMsa82ve/5LOe7Nb8RxL35LOdb2WH7Vz75fNA635lfbN5JF4/BYfrVd ym8px7X81o7DrfmtHYd781vKsf/929Q4LNNKYGt+fRz296KW33WjeXQtv63m 0Zvmd2rz6Nb8lo7D31Z+fZ46tXl0xO+m5tERv5uaR/fiN8dxLoJHhhBCCCGE EEIIITQdET1B9ATRE0RPED1B9ATRE0RPED1B9ATRE0RPED1B9ATRE0RPbCN6 4jZuGYQQQgghhBBCCE1KXne9ts6u13X1OtH6/CTY7yy1C9tP1xXVp/a6u9q+ F3zvdV2j9rKw9fq8S9ves367CPrT29tB//vvvG6u6jer/vKj1P7BPle7k/n8 xI4f1W32er5v23VG9XD1/Ut7n760dj6wvRs8N6/36/Wa9d4+s21/r5fBc/f2 pbU675W1fjyv7+71utfBddfy+8Ce36yQY+f35kh+1wHH59ZPrzrxm+N43pnf kwzHjzrxuxrIcW9+I4578VvK8VEjfo+D/aJxuDW/2r6RGYfH8juv5Pe8E7+1 43BrfmvH4d78lnK8t6VxWO1+J359HL4YyW+reXQtv63m0Zvmd2rz6Nb8lo7D 31Z+Z8H2VObRx1ueRx9veR7di98cx8tCfhFCCCGEEEIIIYSmIfJPkH+C/BPk nyD/BPknyD9B/gnyT5B/gvwT5J8g/wT5J8g/Qf4J8k8ghBBCCCGEEEII/SlP VuThOE3mK+m1Ht+vkulz92i5x0jmnjudV9clz9GLZO45kidYx6n1HMk+Seb9 5h5NebTUD+rHt5KVruC4J9A95u75/Ydkz5PtmOlzP46vlPvzja7T7++o0LT/ npmeT+ThdU+iLPL4Rp5f/U7vj1ZuTgOLuPD7kgc6WrnxFRy3aIV1Flgtv+75 LeXY+dW2e6ZL+dX+4lbP3z2/vpLTil/3/Or8vhLRi19fcXGOP07Wmt9oJaOW 47H85jjeFL+5+23Fr6+sRO9NxPFYfn0cvpPMV76G8qvre5LM+6vVOBzxq23x WzsOt+Z36Dis7d78RhznVlhL+S3l2Mczf5+G8jt0HC7ld3bN59G+guzz6F78 yiJ+NzWP7sVvbhzuza+/77359XHY36epzKMjfjc1j4741fbQfweXzqN7/Ts4 N4/2iKGIX4QQQgghhBBCCKHpiOgJoieIniB6gugJoieIniB6gugJoieIniB6 gugJoieIniB6YhvRE0RQIIQQQgghhBBCaFrK1aGN6pOeplb1W73ua2m95q/s c69Hexhcn9fdndl1qe7ri9R63ddXdpzauq9qPwn6zesRz60f1I9vBf27zLS6 X6937XWb/yG1z1O7Y+3z4DgnmecbXaff31Fhq/33rD20/vN2GXwe1WuO6jbP 7f3Zt21vIy78vu7adlS3+SJovX7zyp7DLOC4lF+v21zKsfN7Zt/X8rs2bvfs eXl/tebX6zbr/F5HvBe/OxmOP+7E76wRx2P5zXG8KX5z99uK393Cv6dHnfj1 cfiO/W4sv7q+J0F/tRqHI36PjN/acbg1v0PH4cWG+I04njfit5RjH8/uNeJ3 6Dhcyu91n0evM/PoXvxeZvjd1Dy6F7+5cbg3v0eZcbg1vz4OzyY6j97d8jx6 NzOPHvrv4NJ5dK9/B+fm0atCfhFCCCGEEEIIIYSmIfJPkH+C/BPknyD/BPkn yD9B/gnyT5B/gvwT5J8g/wT5J8g/Qf4J8k8ghBBCCCGEEEIIvV45kQfldrIf JpMHM+dBcs+ye/4PkrnnSOYexsgTrW33kMlT5Z5/fe8rr18kuwrsVcbcc+Qe SfXHN8nkYYs8pH7fkQfQPZXuAVa/PzKTh9c9hXp++p3O4x5A97D7Co57DnV9 7gk9z5h7cP1+o+/dA+weXm3rOqIIDPfw6r3097vWA+zvb+QBza3c6Lx6r7Ty qeO34jfHcWt+/f3KRVCM5Vf9Ln59xd/5UH9HHuCx/JZyXMuvvo/4reW4F785 jnvxW8txa35luq5oHG7Nb+04PJRfPZeIz6Ec5/jVdXp/l47DvfjNjcPOYbTS N5TfWo5b8Vs6Dnt/tOa3lONafu80mkf34jfH8ab59Xm0n4959Gbm0a35vS7z 6IjfTc2je/07uHQe3YpfH4c9wsX5EL+5eTRCCCGEEEIIIYTQdET0BNETRE8Q PUH0BNETRE8QPUH0BNETRE8QPUH0BNETRE8QPbGN6IklbhmEEEIIIYQQQghN Sqp7rvqnt1P7w9Sq/nCu/qvXhfa63Qf2/Zm1Xh84qiOtba9vqzqzXrdb36vu q+q9fmGfXwX7Ra3XffV6wuqPb1L7wL73+q/Hmftb2/bc7nvH+v2Rtc9tf69L vLDzeP1er4/t9de97u/cnpva80w7D57fPPO912/2+szndh3z4Hden3k3eL9r 6zcfBe/1YeZ5LwPevjF+jxrzm+O4Nb/rgOPzgM+x/B4av3v2+Szo71Unfks5 ruX3NMNvLce9+M1x3IvfWo5b8/uNXVc0Drfmt3YcHsrvPMPnUI5z/C6D/i4d h3vxmxuHncPdYP+h/NZy3Irf0nF41pnfUo5r+W01j+7Fb47jTfPr8+g95tFb mUe35ve6zKO/2fI8ute/g0vn0a349XH4KDOPflA4j0YIIYQQQgghhBCahsg/ Qf4J8k+Qf4L8E+SfIP8E+SfIP0H+CfJPkH+C/BPknyD/BPknyD+BEEIIIYQQ Qggh9NrDIY+HPCAvzXKeI3mg5AmSx+jATJ/fSOb7y+MSeQ4jj517NHMRFJGH yD+/NHNPlLbdk6Xzu0fNParuOV1n7Fky95TJngc2C0weNm27x07X7yscfl/u Cdb9672KPHTqL/fQukfUn3fkQSz1/Ebvk7/f+tz72z2k/jv1a84T7B5RPd9o BV/mK27uYR3KbynHrfndT+bvZxRBMZRfmfMbrSj48x7Krz/fiN9ajsfyG61w lHLcmt+I4178RvfvHNfyG63gRxx7PzvHrfktHYfH8ptbgc1xHPGr/XL86nP/ e13LcW7Fudc43JvfiOPW/A4dh1vxWzoO+/ONVlyjcfi6zqN78Vs6j+7N71Tn 0b34LR2He/Ob47g1v/53aarz6F7/Di6dR4/lt/c8GiGEEEIIIYQQQmg6InqC 6AmiJ4ieIHqC6AmiJ4ieIHqC6AmiJ4ieIHqC6AmiJ4ie2NY8GiGEEEIIIYQQ Qmg6Un1S1StV/dKX1ubqvqp+rOq4qt7rgbX6/Eawv64nqvsb1dudBb9XXViv 5xrVd/XPL631OrLndh6vM+z1cI+D69Xn60z7zLb9OM+Ddha0e7bt9XZXtj0L 7msV9P+h9Ze3F7af11uO6jIvM/2eq9scvU+r4L69v3eD+19Zv+bqOHs942d2 nqje+mnw3MbyW8pxa373g/fzPPP+1PJ7GfAb1QOfNeJ3WchvLcdj+T0dyXFr fiOOe/F7WshxLb/LDL/O8TwzDrfmt3QcHsvvPMNtjuOI31eF/M6Dv9e1HPv7 2orfHMe9+Y04bs3v0HG4Fb+l47A/31Uhv9d9Ht2L39J5dG9+pzqP7sVv6Tjc m98cx635XQbzt6nNo3v9O7h0Hj2W397zaIQQQgghhBBCCKFpiPwT5J8g/wT5 J8g/Qf4J8k+Qf4L8E+SfIP8E+SfIP0H+CfJPkH+C/BMIIYQQQgghhBBC/6+V ktvJtB15juQReZDMPZ0Ls5vJ5Dlyj1HOc+TX4x6wuZk8f+4hksfHPbq+n76/ m+xpsi+SyYPkHtPI0yoPke5b/eT7uWfMPVO+suOewpxn0FcG/fr9vO7ZLT2f e37/MVnkecuZe2LdU6fzRRE0vsIh85UpbbvnXc/Pn5t7irUtz2vUz/4+63rd 4yu+vJ9njfmVJzfHcSt+dd7o9xHHQ/nVtvOr4+c4HsqvPo/4jVYW/Hm35tf/ juY47s1vxHEvfiOOfQWlll9feXV+o+cRcdya39JxuBe/pRxH/PpKTym/pRxH /EaRFaX8lo7DvfgdOw4P5bd2HB7Lr67TV0BzHHv/PzAbym/pONya39JxOFq5 39Q8ujW/tfPo1vyWcrxpfksjoKYyj67l138fzaN78Vs6Drfm99s2j0YIIYQQ QgghhBCajoieIHqC6AmiJ4ieIHqC6AmiJ4ieIHqC6AmiJ4ieIHqC6AmiJ7Y1 j0YIIYQQQgghhBCajqI657dtO6r7qnqmD2xb7cLam6m9YZ9HdZejOrded9Z/ 53WDvb6r6rV6PWbfT9/fTe3T1H6RWtV/9XrHUZ3kY7vv3WC/ZXA/Xp87qqec q+u7Z9vLzHlXwXXmzud1m//Rts+D80Wt11H2OruHQX9d2ff+Ps2C+/S62cfB c/M6z9p+melnf58vrD+/Mb5Og+fQit+zQo5b8fsg8/uI46H8Xgb8HhZyPJTf WYbfdSFXrfldVXLcm9+I4178RhwfjeR3leF3Vclxa35Lx+Fe/JZyHPH7aiC/ pRxH/K5H8ls6Dvfid+w4PJTf2nF4LL9L47eUY+//B434LR2HW/NbOg6vtjyP bs1v7Ty6Nb+lHG+aX+e4F7+t5tG1/Prvo3l0L35Lx+HW/H7b5tEIIYQQQggh hBBC0xD5J8g/Qf4J8k+Qf4L8E+SfIP8E+SfIP0H+CfJPkH+C/BPknyD/BPkn EEIIIYQQQgghhF57mD5IFnnW5EmSJ0ueKXk+5MlZBCZP0ZlZznMUecjkEfsq mR/HPU2XZu5B0vYXZu5B0v5XZjpPtNItj9FJsp1kkYc454n1/tG2PLp+fnm2 ch5J7zePCPDzRpEs8pTK4+b9pm19/5dmug+/33Vg3l9+Pnmc9T67B9z7zT2s en6RJ1AcRCswOp9z5f3ont+oX93T/8Nk4nQov9GKTcTxUH51/n9KpuPlPNq9 +BUf7pH2/u/Fb24Fxz3prfj1lQt/j53TXvzmOPYVI/97N5Zf/96Pr+PpPRnL rz/vaCXOzyPOW/Gb47gXv6Uct+a3dBweyq8+j55/7Thcy6/Op/vU+1M7Drfm 18dhX4F1jofyq/df963j6X3wFWHnq3ReE/29zs2j/e+3c9ya39J5tGxb82h/ HzY9j3Z+NzWPjvj1iMtv6zw64lfnd35L59G5SJjcPHrsv4NzHLfid2rzaH8O znEpvwghhBBCCCGEEELTEdETRE8QPUH0BNETRE8QPUH0BNETRE8QPUH0BNET RE8QPUH0xDaiJ4igQAghhBBCCCGE0LSk+rAfpDaqi6s6sC/td6pbqjqsi6BV ndcza3N1X6P6tqpn+1VwHK8Te2mt13/V9hfWev1X7X9lrc7jdbK93utJaneC +/a6x1Ed5Xnw/V5w/kN7flE94aPg81Vw3lVwPtU5vhv027l9/5fW7gX3uw5a 7y8/3z/a++z1q73fVsHzi+r47gbP44Gdz7nyfvS6zVG/ep3uHxqnQ/ndreR4 KL86/z/Z8WaFHLfm99CuL+K4F7+5+uteB7sVv7Pg+S8DTnvxm+PY673PG/N7 HLy/e3a8w0b8+vPeC56bn+eHjfnNcdyL31KOW/NbOg4P5Xeeef6143Atv6d2 nxcDx+HW/Po4fJgZh4fyu2v3vWfvwzwzDpfOa6K/17l59FFmHG7Nb+k8+pst z6MPtzyPXm9pHj3LvG9D+b0u8+jjzDx6b+A8ejZyHj3238E5jlvxO7V59DIz DpfyixBCCCGEEEIIITQNkX+C/BPknyD/BPknyD9B/gnyT5B/gvwT5J8g/wT5 J8g/Qf4J8k+QfwIhhBBCCCGEEELotUdDng95CN1jI8+Rfx95wOQR0nbkMXKP mq9ERStW8szI86vzuKdMx/skmXuM5HnU5/IQuudIHiJtH5pFnnW/f3mOZoWW 8/iXeoJ/l0yeP3n61S+RRzjqf/cA+8qHvnfP79Nk30+mftXx9bufJ4v6xft5 ZeaeYz9+zvOb8zTrvdV77B7jZWDRytuzZO4Bzq0YHXfiN8fxWH61nzy/fh4/ jrbdg+vvV+T5zfGr68txHHm6x/Lr3DjHzmcpvzqPe7ijldgcx635LeW4F7+1 HPfiN8dxa35LOc7x+7fJ/DzqR98/GofFta/Utea3dhxuxW/tOBxF0uh+h/Jb Og7rOPeSjeW3dhyOzjOW3xzHPq9pxW/pONya39J5tI63rXl0L35LOW7Nb+k8 uhe/Hsn1psyjdX1v2jza/yfB2Hn00H8H5zjORYwQPYEQQgghhBBCCKHpiegJ oieIniB6gugJoieIniB6gugJoieIniB6gugJoieIniB6YhvRE0RQIIQQQggh hBBCaFpSPVLVLT20bdVLvR18H9WvXdh2VO/V6+GuguvxOreqq/qNnec0ON4n qfV6r3ftc9X39bqvV7Z9aG1UF9vv/8S+z7W5et2ldZx/l1rV7f3A+iWq53yY Oe/MzuP1nb1u89PUft/69cJ+9/NMv6yD57yy65kHx8/Vbc7ViT629/g0eH+j +ttLO94z+31038dB25rfHMdj+dV+/xScZxXsfxnwe27c1vJ7UcjxohO/qwzH Lwfyu7T7j97DUo5b81vKcS9+aznuxW+O49b8lnKc4/dvg/OcBvtH4/ClvU// 2Inf2nG4Fb+147Dze2H3O5Tf0nFYx7nXiN/acXjWid8cx/NO/JaOw635LZ1H n215Ht2L31KOW/NbOo/uxe88eI7f9nn0xRs6j/6q8Tx66L+DcxyfFc6jEUII IYQQQgghhKYh8k+Qf4L8E+SfIP8E+SfIP0H+CfJPkH+C/BPknyD/BPknyD9B /gnyTyCEEEIIIYQQQgj9sYdoWWnyyOQiKO4kc0+te4z8OtxD4x5H91S5B07H +zrZL5PJMySPka/cuKdI29rfPaQ5z6DsYbKdZPvJ/PfzjEUrOZFHVtcrT+8H Zvr+N8m07f3oHlZfcfDrk6fuqZn60T3a7vlVP7knzp9z5LHTe/NpssjT7B5j 98jmnqtfj84f8eKezcizXmqt+I0iBpzj1vxGK7B+3M+TiV+9T6X8yqKVyhzH WrnpxW+O4178RhzruTnHQ/lV/+l7reD5io6v0Pjza8XvQbJSjnvxO5TjofyW jsOt+fVx2MfVXASF7MislN9W4/BQfkvH4Vb8Dh2Ho0iGUn5lOk7tOOzX34rf HMeb5tevpzW/pePwUH5bzaM3zW8UEbDpeXQvfvX758miebT4jebRQ/ktHYdb 83td5tG9/h1cyrF4nOo8GiGEEEIIIYQQQmg6InqC6AmiJ4ieIHqC6AmiJ4ie IHqC6AmiJ4ieIHqC6AmiJ4ie2NY8GiGEEEIIIYQQQmg68vquy8pW9VS97qvX Yb2TWq+z7PVe/Tq8vqrXC/Y6s6fB8b5O7S9Tq7quqvfqdde9zuuV7e/1jXN1 fdU+TO1OaveD388zbVSHPaqnrOtVneYPrNX3v7Ft70evj+z1wv36VGf3qbXn tl9Ut3nH+mUWPOeo3q7em0/tOfr5vN6z11POPVe/nlmGF69LfDGQv9b8zgo5 bs3vopDjz43fp5X8XgX8Lgs5PunMb47jXvxGHB8GHA/l98S+f2Dn9f47Cp5f K34PKjnuxe9QjofyWzoOt+bXx+GrzDgc8Xs0kN9W4/BQfkvH4Vb8Dh2H9wIu S/ld23Fqx+F5J35zHG+a32VwvZueRw/lt9U8etP8zoP3b9Pz6F786vfPM/Po B5l59FB+S8fh1vxel3l0r38Hl3L8auLzaIQQQgghhBBCCKFpiPwT5J8g/wT5 J8g/Qf4J8k+Qf4L8E+SfIP8E+SfIP0H+CfJPkH+C/BMIIYQQQgghhBBCf+wB KvVEzczcUxJ5ktxj5B7DyGPkniP36PvxdT+3k8kDJA+wPEDyTLpHSdvuGZan yD2jfv8ngWk/9xg9S+YeyT0z96xGHmD3/LoHXP3pK1G6L/+dPpfHVd/7CpJ7 TNV/7vGV+e/coy8PsPefv2f+e+8neX4vAvP3259H5MmXuUfU31PnxnlbB1br wa3lN/Kc5zhuza97fp1jvbevzPQelfKr63B+/boijnvxG634OMet+fXnluO4 lt+Pk6n/tPLlEXfa9vdZxx/Lrz53bp1rX3HIcdOK31qOx/I7lOOh/EbjsLaj cTji11ciS/mt5bg1v6XjcC9+S8dhH9d85TriV7+PIiFKOY4+z/Gr643ei1qO e/E7tXn0UH5bzaN78Vs6Drfmt3Qc7sWvrvu5mfdfxO+m5tERv8yj+86jffyd 2jwaIYQQQgghhBBCaDoieoLoCaIniJ4geoLoCaIniJ4geoLoCaIniJ4geoLo CaIniJ7Y1jwaIYQQQgghhBBCaDry+q2ldWRn1nqd06gO7G7we687fBi0Xl/1 JDi+7ud2alW/VfWbVb/10r7/wra9rrPqvHpdY7//k6DVfl7v9Zn1u/pjz1qv ixzVb/a6zV6/+tA+9/vaCz5/YN97/Xevd6z+83rN58HvvB7386D//D1bB++T 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 fXgrWW0EhfMr04qE8xv1o3Os627Fr86r/SOOoxWcVvzWclzK72+Tid93k+l7 Pff3zXIrGa35leUiF1rx689V+9eOw2P51fsSjcND+fVx2FdgfRz2CArx6fxq P/FUy6+v5OQ4bsVv7Tjcm98cx87vO8lK+dXz1/2PHYdL+dXz9vezdBweyu+y 0Ty6lt9W82iftzi/byfrNY8u5bfXPFrv/5s2j/a/2734LY2EYh69mXl0xG/v ebT/fY74RQghhBBCCCGEEJqOiJ4geoLoCaIniJ4geoLoCaIniJ4geoLoCaIn iJ4geoLoCaInthE9Qf4JhBBCCCGEEEIITUuqv7qw9jjTeh1arxfr9V0vgvYo aM/t94fBef26VNf3TmpV91V1XD9Pba5u87l9fm6t132dBf14y7ZV/1V1Xl9Y K+/RXmqf2Hmjus1fpvY0eB6roJ+9f72f5/b7qE7zOvg8qtfsdXxVd/im9Zva 7wbfq97v+/b8F9bPXsc4eh+j+sRet1nbJ3a+k8z+UT3lVeZ83vr1zSr5PQ74 XVZyPG/Er9dv1vvwVmq/Nh5zdZudX7V3A36XhRyvG/O7tP0jjped+a3luJTf 3xq/79r3J8bv+3a82Yb4PQnOd9yJ31mwf+04PJbfw8w4PJRfH4dvZ8bhS/v+ KuD30niq5XdWOQ634rd2HO7Nb45j5/edSn5v2P2PHYdL+V0E72fpODyU31bz 6Fp+W82jTzLz6Lc7z6NL+e01j169ofPok8w8uhW/EVcnzKO3Mo/+fEvz6EXh PBohhBBCCCGEEEJoGiL/BPknyD9B/gnyT5B/gvwT5J8g/wT5J8g/Qf4J8k+Q f4L8E+SfIP8EQgghhBBCCCGE0B97OuRxiTxI7oHyz31lRhat3LjJY+O/c0+N e4p0vR8m033Io1PqOZL5Sk1uBcU9gvJYylN5lizyGLnnVx4qeX71va8caX/3 +Oo6Ig9e5NFzj5yOK0905AHW7/0+dL3uGdT3ek7qHz2/95J9L9l7GfuVmTzA 7pmOPL9637R/1E/uGfRIDvcIrwOLePL9cs9t1phf75+I47H86jzeb+JFKzd6 X3Q8cVzLr68UR/zmONb3rfkVX0M5HstvLce+IjSUX1+5Eb8/Sabj9+a3luNW /NZy3IrfUo6H8vtZMj0/57d0HI749edcyq94KB2HN8Wvc6znqvegNb8yXaeP w+qvofzKdNzacbg3vxHHvfnNcdya39J5tK9g+zx6KL+l8+hSfnvNo1vze13m 0eIlmkcP5bd0HG7NL/Po/988Asrn0UP5HTuP1vuZm0cjhBBCCCGEEEIITUdE TxA9QfQE0RNETxA9QfQE0RNETxA9QfQE0RNETxA9QfQE0RPbiJ4g/wRCCCGE EEIIIYSmJa9TumvbXufV68f6515X/dA+j75Xex78zuusep1XXe+Hdh+qx1pa 9/Wpfe/1mqP6517PV/WGVWf4LLVRvVev26z6sk/se6/7rv1Pg+uI6u9G9Xi9 nq6OqzrSUf3mi+A+dL1e13duz+nMnt97qf2ebUftr6y9YefJ1W0+tP2jfnJe btl7eBL0f1Sv2XlaVz631vyuCzkey+866Dfxcsfel0PjuJbfQztexG+O41kn fvdGcjyW31qOvZ77UH697rr4/Ykdvze/tRy34reW41b8lnI8lN/P7PkdDhyH I37nA/k9rRyHN8Wvc3xs70Frfo/sOn0cvjmS31/ZcWvH4d78rjP89OI3x3Fr fkvn0SeZefRQfkvn0aX89ppHt+b3usyjDzLz6KH8lo7DrfllHv1///snmkcP 5XfsPPqscB6NEEIIIYQQQgghNA2Rf4L8E+SfIP8E+SfIP0H+CfJPkH+C/BPk nyD/BPknyD9B/gnyT5B/AiGEEEIIIYQQQmjxRyYPX+SJ0n7yCO6ayZPinj73 WLlHxz+XBy7yqMtj5Z42Xbc8rM+SReeXuYdXniOdX54r92jpeDq/X5f666tk ur55pel87vnVc/H9I49jFPGhz3W98nTpurX9PJn28/7269Hn0fXp92dm8pi7 Z1WewXeTfZRMKzjalkdYx/f7do9o9PyiFQZdh67Pf6/z6T7VD34dvl/OdBz3 VJbyq8+dX2379Ucct+LXV46iiCznbSi/0fGcY3/eei/VT735jThuze+9ZLUc R+9TxK/M+dVKjXMsE/e9+NW2r9Q4B6353UlWy3Erfks5HsuvPh86DpeOv6Xj 8DfJasfhVvzmONZ1iyNForTmVxb9nRO/4s9XsnP8alu/rx2Ha/nV9UX8thqH I34XjebRfj2bmkfrut7UeXQrfmvH4bH85ubRUaSv+OnFb+k47Ne3qXn00PH3 usyj/b6mMo8WB7l5NEIIIYQQQgghhNB0RPQE0RNETxA9QfQE0RNETxA9QfQE 0RNETxA9QfQE0RNETxA9sY3oCSIoEEIIIYQQQgghNC0trFV93qiOrPZTPd9d a1UH1ev0LoPvD4PP58H3alVv1uvk6rpVH/lZ5vxqvT7zpZ3/yra97utJcF3q r6/s+uaV7YVdn9e/9f2jesFep/bEPtf1ntl1a/u57ef97dezn7m+mR3f6697 XWTV9X03tR+l9n3bfs+O7/d9HDyv6L3y53nDrs9/v7T73A+uY5l5XuvgOF5n uJTfWcDvaXD9Ecet+PW6715H+iLgbSi/0fGWmed9Zv3Um9/5hvi9N5Dj6H2K +L0V8PurgOP3jfte/C7s+3XAQWt+dwZy3IrfUo7H8rseOQ6Xjr+l4/A3A8fh VvzmOD42jj7rxO8883fupvF3yz7P8fuR/b52HK7l91aG31bjcMRvq3n0bEvz 6PUbPo9uxW/tODyW39w8epGZR/fit3QcXmxpHj10/L0u8+jZROfRXxXOoxFC CCGEEEIIIYSmIfJPkH+C/BPknyD/BPknyD9B/gnyT5B/gvwT5J8g/wT5J8g/ Qf4J8k8ghBBCCCGEEEIIvfZsyDP1Ipk8Iw+T6Xt5Qo4Dcw+je4Aiz4s8UKtk kYfHPUm3k/nxI4+1zvPS7G4yP597KiOPkXvU3PPmESZ+vTqP7r/UQ/wisO8n i/rjoZk8XY+S/UOyD5P9wUz7+cqjP3df8Zfn0q/HPW5+XVEExXtmHyXTfvqd 3k9tRytEvlLk235cWdQPOU+vP88nyfYDU788TnY/mfo1x2/k+XZ+SznW9yuz Wn4jLvz9EMe1/Or40UqQr3yI16ifevOb47gVv1EEQcRxLb/6vpRfmVZy/Dn0 4jf3/rfm1zn2FTTnuBe/Mv3ex+FW/A4dh51fP27Er69k1Y7DvfmNONbf8w/N WvFbOg47v+rHUn41Dqu/a8fhWn5l0ftfyvFQfheN5tFD+R07j+7Fb+t5tCID vi3z6F78ls6je/HLPPpPcxzxu6l59FB+c/No3X80j/a/exG/CCGEEEIIIYQQ QtMR0RNETxA9gdeX6AmiJ4ieIHqC6AmiJ4ieIHqC6AmiJ4ieIHpiG9ETK9wy CCGEEEIIIYQQmpRUl1R1ZV+kVnVNH9r32v84aL0+sNdvjeqmqn7syj73+qxe B/Z2cPyo3rTO89Lau8H5vM5wVO/V6+F63dxd29+vd273X1rf+UXQfj/THw+t VZ3aR6n9h9R+mNo/WPvIfhc99327n53gerxerl+X121W/fX3rP3I9juw91Pb UX13r/Pu237cg0w/5Oo0+/N8Yv3mrfrlcWrvW7/m+J0V8lvK8dLe26H8LjMc ex3lWn51/KiO+zL4OxH1U29+cxy34ndRyXEtv+tKftW+HzyHXvzm3v/W/DrH s8w43IvfC/u9j8Ot+B06Dju/F5m/swsbh48HjsO9+Y04vm/ctua3dBx2fo8r +f3I+rt2HK7l9yDz/pdyPJTfVvPoofyOnUf34rf1PPrsWzaP7sVv6Ty6F7/M o//087zY8jx6KL+5efRxZh69KJxHI4QQQgghhBBCCE1D5J8g/wT5J/h/c+Sf IP8E+SfIP0H+CfJPkH+C/BPknyD/BPknyD9B/gmEEEIIIYQQQgih1x6kT5M9 M5PHSB5NeURynlB5gPaSuefHf/fALPIkRefxz91zJY+NPF+6nrtml8lyHiT3 0PoKlLbledO2X6/3g/pL/X3PzD2Fej5XZvL8nidzD7Z7Vu+bydMpT/BNM3nC Ig+1e3rddF5tez/6yo08rOrfyAMcrYy6By/n+ZXH2z2+7vnVdi6yyN9PeWj1 /Nzjq+//OZmvYLsH+Flgzq9WIHRd7gl1biKOI8/vUH513FKOh/Kr63Z+/X2L VjZ68avj5Dhuze9Qjnvxm+O4Nb/u6Y9WRnrx6xaNw3p/xK+ueyi/Pg47v85x a35rx2Hn199Pf9/0PH0lMTcO67jqr9b8lo7DvfnNcdyL31KO/X5z/Orz3Mpm juOh/D5uNI8eyu/YeXRvfnPz6IjfTc2jW/N7XebRvfgtHYed303NoyN+NzWP zkUi955Hj+V36DxaluMXIYQQQgghhBBCaDoieoLoCaIniJ4geoLoCaIniJ4g eoLoCaIniJ4geoLoCaIniJ7YRvTEHm4ZhBBCCCGEEEIITUqq//ppap9Zq3qv qkeseqa5OsbKwilviNdt9d89sDaqAxudxz/3urOqtzqz67lr7aV9H9V/9frK Xj9e2w9t26/X+2HP+vuetV7nV8/nylrVbT63/b1us+rh3rdWdYof2bbahd2/ X5fXafb2xLa9H73u+oH1b1S/2espe13ihd1HVLf5Q9vvhrVeRzqqZ34cvJ8v 7Pl5vWZ9/8/2+Y49v8cBtxG/Z3ZdzzLcRBxHdZuH8ntUyfFQfi8CftfBe+L1 uHvxe1HIcWt+h3Lci98cx6359Trdsw3z6200Dt8zfhcj+T0MeIjG4db81o7D zu88w++uvael4/Dc+qs1v6XjcG9+cxz34reU45uV/N7I8FvK8VB+W82jh/I7 dh7dm9/cPHq95Xl0a36vyzy6F7+l4/BiS/Poh1ueRx9ueR49lt+h8+iTQn4R QgghhBBCCCGEpiHyT5B/gvwT5J8g/wT5J8g/Qf4J8k+Qf4L8E+SfIP8E+SfI P0H+CfJPIIQQQgghhBBCCL32IMnDFHmQ5CGRB0nb7lkt9fzKQ1nq+XWPi19P 5GGLTNdxmTF5lPw6dJ3uCdd1uMdI+0X9Nyu0aAVHnnv1qzy+8ijq935dvhLj 37tH2D2+OXOPr3+fW8HczZh7cN1DHH3uv3PPtjy/7ybTtq9gajt3ne5p1PN7 EVjkwdUKgHuAa/mN3tvSSCi9Z+Io5/l1fnU+XY++L+V4KL/qd12n//2IOPbr bc2vPMg5jjfNr3Pcml+tnJRyPJZfmV93juPW/EYrORHH2v95srH81kZQtOa3 lOOIX18hzfHbahwey2/tONya31KOe/FbynFrfms5bs1v6Ty6lt9W8+he/JbO o6MV2E3No3vxO/V5dC9+S+fRvfjNcdyK36HjsPP7psyj9Z7m+EUIIYQQQggh hBCajoieIHqC6AmiJ4ieIHqC6AmiJ4ieIHqC6AmiJ4ieIHqC6AmiJ7YRPUEE BUIIIYQQQgghhKYl1X9Vfdio/qu8Gqe27XWRS+s2X9n+ubrNXi/Vryeqjxu1 uo7LTHs3uA5dp9ex1nV4vdfdTP/NCtuo/vqn1q+q1/zEfu/X5XXU/Xuv57yo vF6v1+zfL6x/vH7zbqb1+ste3zn63H/ndalVt/ld2z6z6z4rvM5V8BxfBG1U f/mecTuU3+i9XRZyfGUcrSr5PbbrWVVyPJTfuV2n//2IOD7uzO9FIceb5nfW md8blRyP5ffD4LrPNszvfiXH2v95I369/vqqcBxuxW8pxxG/e5X8thqHx/Jb Ow635reU4178lnLcmt9ajlvzWzqPruW31Ty6F7+l8+jZlufRvfid+jy6F7+l 8+he/OY4bsXv0HH48A2dRy8K+UUIIYQQQgghhBCahsg/Qf4J8k+Qf4L8E+Sf IP8E+SfIP0H+CfJPkH+C/BPknyD/BPknyD+BEEIIIYQQQggh9NrTIY+TrwhE HiT3aMkDIs+JtnOeSvcwuYfMPVXHZvo85yGSvUr2ebKc5+jILFppco+Wr7ze SeaeVveAuidZps/3zOTRV7+651f9ruPfSiZP7qNk+l7nk0fRn6c/15zn97mZ e3r9vv09ck+wTM/BPazu4fXzyLSf+kOf+0qNPMxRBIXMr8/74Z6Ze37Flzy4 4kPb/zOZr+CsR/Lr/Ph7F3Gs6/MV2KH85laSnOOh/MrE7ZfJdN2R59c9/bX8 auUj4lfP7cpMHOu4rfnNcazjborfiONW/H6WzI+T43gov/rc+fUV+FKO9blz XMvvhVk0Dvfit3Qcjvh9mayU39pxOOJXz6+W39JxWNfRit+h43Brfks59pXX VvyWchzx6xEUQ/n1fvV5dC2/rebRvfgtnUeLp23No/15vSnz6Nb81s6jW/Nb Oo8eym+rebTzu+l59Fh+o3l0LhLqzCziFyGEEEIIIYQQQmg6InqC6AmiJ4ie IHqC6AmiJ4ieIHqC6AmiJ4ieIHqC6AmiJ4ie2Eb0BPknEEIIIYQQQgghNC2p TqnqxXo976j+q9ejXdrxtJ2rM+z1Yb2+rdeZPbZ2144T1XdV+yq1n6c2V/f1 yNqoTrzXoz2x7Tup9TrJs2B7ba0+37P2nvWr122e2/FvpVZ1mB/Z9zrfw+B5 +nPN1W1+bq3Xafb7Xgb37c99ZcfxOs27wXkWtt8t+9zrrN+w7bPgeH593g/3 rPW6zeLrn40Pbf9P+/1+I353g37PcfypnWcsv7NKjofye2TcfmnXHdVt3g2e fym/Oxl+941f53jWid8cx4sN8xtx3Irfz4Lj5Dgeyu+zgN/5QI73A45r+b2w NhqHe/FbOg5H/L6s5Ld2HI74vTeQ39JxeNaY36HjcGt+Szm+2YnfUo4jfvcb 8bvOzKNr+W01j+7Fb+k8em/L8+j9N3Qe3Zrf2nl0a35L59FD+W01j77Y8jx6 LL/RPHqWGYfPCufRCCGEEEIIIYQQQtMQ+SfIP0H+CfJPkH+C/BPknyD/BPkn yD9B/gnyT5B/gvwT5J8g/wT5JxBCCCGEEEIIIYRee4rcU+yepcgD7B4bX5mR xybyAOt79xhFHr4DM/dYusfoazP3GP3C7KfJIs+SH9+v2z2B2v4q2SJj8jQ9 NJMH7ZtkHyf7eTL3JLrJ86oVCnl83ZOl80eev9qVHB0/8sC6589XaCJPoHvg 75hFnmG/Tzd5ev090+f+e12v+kv9rOel+9IK3H5g7gGOVnCeJPPft+K3lGP/ XB7Vofx6P+Y4bs1vjuPI81vKr44b8asVAa3YOL96f1rzm+NYx43ueyy/4qSU 47H8yvx3vmKj+9X19eY3x3Frfp3jaDzrxW/pOBzx6/OG1uOw86vnr/ehll89 R3Gb47gVv0PH4V785jg+CKyUX/Wb81s6Dvfid+rz6F78TmUerfuK5tHRivy3 fR7dmt/rMo/uze/U59G9+G01j0YIIYQQQgghhBCajoieIHqC6AmiJ4ieIHqC 6AmiJ4ieIHqC6AmiJ4ieIHqC6AmiJ7Y1j0YIIYQQQgghhBCajlTn1es8e13Y qH6z11v1uuqqtxrVb9b3Xu81qs97YK3XG/Z6r19b6/Vef2HtT4P9LoPj+3V7 HV9tf2XbUSvv0UNrVf/2m9R+nNqfW7++CFrVTVZ9cdVrPgvOH9Xtra3DfmbP z+93N3juq+B83u+qv3vH2qius9+ntzeC9+xG8Ptj66/n9rx0XzsBX/v2nMRZ VH/9SfD7VvyWcuyfH43k97iS49b85jiO6jaX8jvL8Kt63ucBvzud+M1xvMjc 91h+Tys5HsvvjeB3x8HfrdMN8ZvjuDW/znE0nvXit3Qcjvg9rOS3dhx2fnfs fajld9+4zXHcit+h43AvfnMcH4zkdx3wWzoO9+J36vPoXvxOZR69zsyj772h 8+jW/F6XeXRvfqc+j+7Fb6t5NEIIIYQQQgghhNA0RP4J8k+Qf4L8E+SfIP8E +SfIP0H+CfJPkH+C/BPknyD/BPknyD9B/gmEEEIIIYQQQgih1x7hUg+Te5Tk AfLtaGVmL5k8RdrPPTDyuMhDdMvMPXLyxLmnSB4f9xzJQ1TrOdJ1+335Cpx7 juT5cs/R/WTRyqs8hu5RlLnnVys4V8n0XPX7PyTz69B1uyfXPXs6fuTRjzx/ 2o5WLH3l5mUyHffIzN8n7xd/Du6B9Otxz69/7/2k9933+9hM/R55fv852TMz 9/xGHn2t6PhK3VB+I8+vnoPz6+9BKb8y96j7dUQcj+U3WoHNcdyL3xzHOk5r fms57sWvc+yctuLX3zPnWN//r2TiuBe/zm3pOFzLrz73/vYVPeehF7+l43Br fmvH4Vb86nhacS3luDW/peOw+D0KLMevzLnKcewrg7X8an/nt3YcruX3SaN5 dC2/rebRvqLNPPrbMY/2v/POcWt+mUdfj3l0K35rx+FSfhFCCCGEEEIIIYSm I6In8PoSPYHXl+gJoieIniB6gugJoieIniB6gnk00RNETxA9sY3oiYe4ZRBC CCGEEEIIITQpqZ5zaX1Yrwd7EWxHddX3Untk+3n9VNVLVX3XW9Z6Pd0TO5/q vF7atuq5qr5rbd3Xo+C+dL1R3VfVrfW6r/ft+qO6614PWK3XbVb99St7rvr9 H4LrmNlx1Hpd3nP7PKrb7Pd9bPfp/eV111/acY+s9ffJ+8Wfw27merxus3/v /bQO9vvY2uf2HJ2jf7bnFNVtjupxP7HtsfxGdZvnAb/+HpTye8v6exFcR8Tx WH4PM393cvWbW/Ob43inE7+1HPfi1zneDc4/ll9/z5xjff+/jONe/Dq3zzrx uwz6ex6MZ6vO/JaOw635rR2HW/Gr4z2q5Lg1v6Xj8MuA21J+TwOuchwfWFvL 70nAb+04XMtvq3l0Lb+t5tEL5tHfynn0XmYcbs0v8+jrMY9uxW/tOFzKL0II IYQQQgghhNA0RP4J/t8c+Sf4f3PknyD/BPknyD9B/gnyT5B/gvwTzKPJP0H+ CfJPbDP/xP8G4wSdPQplbmRzdHJlYW0KZW5kb2JqCgoxMjE3IDAgb2JqClsK MCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMAowIDAgMCAwIDAgMCAw IDAgMCAwIDAgMCAwIDAgMjI4IDIyOAoyMjggMjczIDM4OSA0NTYgNDU2IDcy OSA1OTIgMTk1IDI3MyAyNzMgMzE5IDQ3OSAyMjggMjczIDIyOCAyMjgKNDU2 IDQ1NiA0NTYgNDU2IDQ1NiA0NTYgNDU2IDQ1NiA0NTYgNDU2IDI3MyAyNzMg NDc5IDQ3OSA0NzkgNTAxCjgwMCA1OTIgNTkyIDU5MiA1OTIgNTQ3IDUwMSA2 MzggNTkyIDIyOCA0NTYgNTkyIDUwMSA2ODMgNTkyIDYzOAo1NDcgNjM4IDU5 MiA1NDcgNTAxIDU5MiA1NDcgNzc0IDU0NyA1NDcgNTAxIDI3MyAyMjggMjcz IDQ3OSA0NTYKMjczIDQ1NiA1MDEgNDU2IDUwMSA0NTYgMjczIDUwMSA1MDEg MjI4IDIyOCA0NTYgMjI4IDcyOSA1MDEgNTAxCjUwMSA1MDEgMzE5IDQ1NiAy NzMgNTAxIDQ1NiA2MzggNDU2IDQ1NiA0MTAgMzE5IDIzMCAzMTkgNDc5IDIy OAo0NTYgMjI4IDIyOCA0NTYgNDEwIDgyMCA0NTYgNDU2IDI3MyA4MjAgNTQ3 IDI3MyA4MjAgMjI4IDUwMSAyMjgKMjI4IDIyOCAyMjggNDEwIDQxMCAyODcg NDU2IDgyMCAyNzMgODIwIDQ1NiAyNzMgNzc0IDIyOCA0MTAgNTQ3CjQ1NiAy NzMgNDU2IDQ1NiA0NTYgNDU2IDIzMCA0NTYgMjczIDYwNCAzMDMgNDU2IDQ3 OSAyNzMgNjA0IDUwMAo0MDAgNTQ5IDI3MyAyNzMgMjczIDU3NiA0NTYgMjcz IDI3MyAyNzMgMjk5IDQ1NiA2ODQgNjg0IDY4NCA1MDEKNTkyIDU5MiA1OTIg NTkyIDU5MiA1OTIgODIwIDU5MiA1NDcgNTQ3IDU0NyA1NDcgMjI4IDIyOCAy MjggMjI4CjU5MiA1OTIgNjM4IDYzOCA2MzggNjM4IDYzOCA0NzkgNjM4IDU5 MiA1OTIgNTkyIDU5MiA1NDcgNTQ3IDUwMQo0NTYgNDU2IDQ1NiA0NTYgNDU2 IDQ1NiA3MjkgNDU2IDQ1NiA0NTYgNDU2IDQ1NiAyMjggMjI4IDIyOCAyMjgK NTAxIDUwMSA1MDEgNTAxIDUwMSA1MDEgNTAxIDU0OSA1MDEgNTAxIDUwMSA1 MDEgNTAxIDQ1NiA1MDEgNDU2Cl0KZW5kb2JqCgoxMjIwIDAgb2JqClsKMCAw IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMAowIDAgMCAwIDAgMCAwIDAg MCAwIDAgMCAwIDAgMjI4IDIyOAoyMjggMjI4IDI5MSA0NTYgNDU2IDcyOSA1 NDcgMTU3IDI3MyAyNzMgMzE5IDQ3OSAyMjggMjczIDIyOCAyMjgKNDU2IDQ1 NiA0NTYgNDU2IDQ1NiA0NTYgNDU2IDQ1NiA0NTYgNDU2IDIyOCAyMjggNDc5 IDQ3OSA0NzkgNDU2CjgzMiA1NDcgNTQ3IDU5MiA1OTIgNTQ3IDUwMSA2Mzgg NTkyIDIyOCA0MTAgNTQ3IDQ1NiA2ODMgNTkyIDYzOAo1NDcgNjM4IDU5MiA1 NDcgNTAxIDU5MiA1NDcgNzc0IDU0NyA1NDcgNTAxIDIyOCAyMjggMjI4IDM4 NSA0NTYKMjczIDQ1NiA0NTYgNDEwIDQ1NiA0NTYgMjI4IDQ1NiA0NTYgMTgy IDE4MiA0MTAgMTgyIDY4MyA0NTYgNDU2CjQ1NiA0NTYgMjczIDQxMCAyMjgg NDU2IDQxMCA1OTIgNDEwIDQxMCA0MTAgMjc0IDIxMyAyNzQgNDc5IDIyOAo0 NTYgMjI4IDE4MiA0NTYgMjczIDgyMCA0NTYgNDU2IDI3MyA4MjAgNTQ3IDI3 MyA4MjAgMjI4IDUwMSAyMjgKMjI4IDE4MiAxODIgMjczIDI3MyAyODcgNDU2 IDgyMCAyNzMgODIwIDQxMCAyNzMgNzc0IDIyOCA0MTAgNTQ3CjIyOCAyNzMg NDU2IDQ1NiA0NTYgNDU2IDIxMyA0NTYgMjczIDYwNCAzMDMgNDU2IDQ3OSAy NzMgNjA0IDUwMAo0MDAgNTQ5IDI3MyAyNzMgMjczIDU3NiA0NDAgMjcyIDI3 MyAyNzMgMjk5IDQ1NiA2ODQgNjg0IDY4NCA1MDEKNTQ3IDU0NyA1NDcgNTQ3 IDU0NyA1NDcgODIwIDU5MiA1NDcgNTQ3IDU0NyA1NDcgMjI4IDIyOCAyMjgg MjI4CjU5MiA1OTIgNjM4IDYzOCA2MzggNjM4IDYzOCA0NzkgNjM4IDU5MiA1 OTIgNTkyIDU5MiA1NDcgNTQ3IDUwMQo0NTYgNDU2IDQ1NiA0NTYgNDU2IDQ1 NiA3MjkgNDEwIDQ1NiA0NTYgNDU2IDQ1NiAyMjggMjI4IDIyOCAyMjgKNDU2 IDQ1NiA0NTYgNDU2IDQ1NiA0NTYgNDU2IDU0OSA1MDEgNDU2IDQ1NiA0NTYg NDU2IDQxMCA0NTYgNDEwCl0KZW5kb2JqCgoxMjIyIDAgb2JqCjw8Ci9UeXBl IC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xMjIyCi9XaWR0 aCAyMAovSGVpZ2h0IDIwCi9CaXRzUGVyQ29tcG9uZW50IDgKL0NvbG9yU3Bh Y2UgL0RldmljZVJHQgovTGVuZ3RoIDc0MQovRmlsdGVyIC9EQ1REZWNvZGUK Pj4Kc3RyZWFtCv/Y/+AAEEpGSUYAAQEAAAEAAQAA/9sAQwAFAwQEBAMFBAQE BQUFBgcMCAcHBwcPCwsJDBEPEhIRDxERExYcFxMUGhURERghGBodHR8fHxMX IiQiHiQcHh8e/9sAQwEFBQUHBgcOCAgOHhQRFB4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e/8AAEQgAFAAUAwEi AAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQ AAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEV UtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpj ZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1 tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/E AB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQH BQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoW JDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpz dHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLD xMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMR AD8A+lLaGMHesmcnp0zTdQjbaCG2kfw02O3l85meQbcDAx0NEuxonZ5A8iHG Qf517e0ro85Q5o6lP7Q65VRsAPQUU8mEcSYLeoorpuuxy+zfcnlmkjRtp/iP Wo0Akmct/EgLD1oorJHXLYIIY5E3MgyOKKKKDBH/2QplbmRzdHJlYW0KZW5k b2JqCgoxMjIzIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9J bWFnZQovTmFtZSAvSW0xMjIzCi9XaWR0aCAyMQovSGVpZ2h0IDIwCi9CaXRz UGVyQ29tcG9uZW50IDgKL0NvbG9yU3BhY2UgL0RldmljZVJHQgovTGVuZ3Ro IDc0MwovRmlsdGVyIC9EQ1REZWNvZGUKPj4Kc3RyZWFtCv/Y/+AAEEpGSUYA AQEAAAEAAQAA/9sAQwAFAwQEBAMFBAQEBQUFBgcMCAcHBwcPCwsJDBEPEhIR DxERExYcFxMUGhURERghGBodHR8fHxMXIiQiHiQcHh8e/9sAQwEFBQUHBgcO CAgOHhQRFB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e Hh4eHh4eHh4eHh4e/8AAEQgAFAAVAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEB AAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAE EQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkq NDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeI iYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY 2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAAB AgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEH YXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpD REVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWW l5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm 5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A+k7eGPcZFlySenTNF/GSgw20 g9AaYlvMZt8jgLtBxjoaWQKUk3yB3Q8YP869vrdHnKHNGzKJmYHavyAdhRUh aFf9Zgn1FFdKa7HK6bXUsTyvEJNp6MRzUK/vJyzdWTnHeiiskdcnoPtYY5FO 5RwccUUUUjKOx//ZCmVuZHN0cmVhbQplbmRvYmoKCjEyMjQgMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTEyMjQK L1dpZHRoIDUKL0hlaWdodCAyCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNSA8ZWQxYzI0Zjg5YTdhZjQ3 MDVkZmFiNjhkZjE0NjQxZWUyYTJlPl0KL0xlbmd0aCAxNAovRmlsdGVyIC9G bGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjYBBgMgkAAAEEAJcKZW5kc3RyZWFt CmVuZG9iagoKMTIyNSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlw ZSAvSW1hZ2UKL05hbWUgL0ltMTIyNQovV2lkdGggMgovSGVpZ2h0IDEKL0Jp dHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rldmlj ZVJHQiAxIDxlZDFjMjRmNzhjNzA+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxh dGVEZWNvZGUKPj4Kc3RyZWFtCnjaEwAAABEAEQplbmRzdHJlYW0KZW5kb2Jq CgoxMjI2IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFn ZQovTmFtZSAvSW0xMjI2Ci9XaWR0aCAyCi9IZWlnaHQgMQovQml0c1BlckNv bXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEg PGY3OGM3MGVkMWMyND5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNoTAAAAEQARCmVuZHN0cmVhbQplbmRvYmoKCjEyMjcg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTEyMjcKL1dpZHRoIDUKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50 IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8ZmRkMmEw ZjE0NjQxZWQxYzI0ZWYzODM3Pl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0 ZURlY29kZQo+PgpzdHJlYW0KeNqTZgAAADgAHAplbmRzdHJlYW0KZW5kb2Jq CgoxMjI4IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFn ZQovTmFtZSAvSW0xMjI4Ci9XaWR0aCAxNQovSGVpZ2h0IDEKL0JpdHNQZXJD b21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA3 IDxmMjU0NGFmNDcwNWRlZTJhMmVmZGQyYTBmYmM0OTZlZjM4MzdlZDFjMjRm ZWUwYTk+XQovTGVuZ3RoIDE2Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0 cmVhbQp42mNUMnFhcU0oAAAFmQG1CmVuZHN0cmVhbQplbmRvYmoKCjEyMjkg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTEyMjkKL1dpZHRoIDUKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50 IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNCA8ZWQxYzI0 ZjQ3MDVkZmFiNjhkZjE0NjQxZjM2MjU0Pl0KL0xlbmd0aCAxMQovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVHYAAACMAGUKZW5kc3RyZWFt CmVuZG9iagoKMTIzMCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlw ZSAvSW1hZ2UKL05hbWUgL0ltMTIzMAovV2lkdGggNQovSGVpZ2h0IDEKL0Jp dHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rldmlj ZVJHQiAyIDxmNzhjNzBlZjM4MzdmYWI2OGQ+XQovTGVuZ3RoIDEwCi9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42pNkAAAANAAaCmVuZHN0cmVh bQplbmRvYmoKCjEyMzEgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5 cGUgL0ltYWdlCi9OYW1lIC9JbTEyMzEKL1dpZHRoIDE1Ci9IZWlnaHQgMQov Qml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2 aWNlUkdCIDcgPGVkMWMyNGYxNDY0MWY1N2U2N2Y3OGM3MGZhYjY4ZGYyNTQ0 YWVmMzgzN2Y5YTg4Mz5dCi9MZW5ndGggMTYKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjaY1QwcWEJKzAAAAWeAZQKZW5kc3RyZWFtCmVuZG9i agoKMTIzMiAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1h Z2UKL05hbWUgL0ltMTIzMgovV2lkdGggNQovSGVpZ2h0IDEKL0JpdHNQZXJD b21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAx IDxlZDFjMjRmNTdlNjc+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVj b2RlCj4+CnN0cmVhbQp42mNwAAAAQgBBCmVuZHN0cmVhbQplbmRvYmoKCjEy MzMgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9O YW1lIC9JbTEyMzMKL1dpZHRoIDEKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9u ZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMCA8ZjI1 NDRhPl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVh bQp42mMAAAABAAEKZW5kc3RyZWFtCmVuZG9iagoKMTIzNCAwIG9iago8PAov VHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTIzNAov V2lkdGggMTIKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNSA8ZWQxYzI0Zjc4YzcwZmFi NjhkZjQ3MDVkZWUyYTJlZmRkMmEwPl0KL0xlbmd0aCAxNAovRmlsdGVyIC9G bGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVFJQdlIFAAJIAM4KZW5kc3RyZWFt CmVuZG9iagoKMTIzNSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlw ZSAvSW1hZ2UKL05hbWUgL0ltMTIzNQovV2lkdGggNQovSGVpZ2h0IDEKL0Jp dHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rldmlj ZVJHQiAzIDxmNzhjNzBlZDFjMjRmZGQyYTBmMjU0NGE+XQovTGVuZ3RoIDEw Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42pM+AAAA+ADcCmVu ZHN0cmVhbQplbmRvYmoKCjEyMzYgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QK L1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTEyMzYKL1dpZHRoIDExCi9IZWln aHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhl ZCAvRGV2aWNlUkdCIDUgPGVkMWMyNGY3OGM3MGZhYjY4ZGZlZTBhOWYxNDY0 MWY1N2U2Nz5dCi9MZW5ndGggMTQKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4K c3RyZWFtCnjaY1RSUHYIAAACbwD3CmVuZHN0cmVhbQplbmRvYmoKCjEyMzcg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTEyMzcKL1dpZHRoIDUKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50 IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8ZmFiNjhk ZWQxYzI0ZjI1NDRhPl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNoTagAAAKYAkwplbmRzdHJlYW0KZW5kb2JqCgoxMjM4 IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFt ZSAvSW0xMjM4Ci9XaWR0aCAxMgovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25l bnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA1IDxlZDFj MjRmNzhjNzBmYWI2OGRmYmM0OTZmNDcwNWRmODlhN2E+XQovTGVuZ3RoIDE0 Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUUlBWYQUAAewA kAplbmRzdHJlYW0KZW5kb2JqCgoxMjM5IDAgb2JqCjw8Ci9UeXBlIC9YT2Jq ZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xMjM5Ci9XaWR0aCA4Ci9I ZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5k ZXhlZCAvRGV2aWNlUkdCIDQgPGVkMWMyNGY0NzA1ZGZhYjY4ZGZkZDJhMGYx NDY0MT5dCi9MZW5ndGggMTIKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3Ry ZWFtCnjaY1RkFgEAAIUAOgplbmRzdHJlYW0KZW5kb2JqCgoxMjQwIDAgb2Jq Cjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0x MjQwCi9XaWR0aCAyCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9D b2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEgPGYxNDY0MWY0NzA1 ZD5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0K eNoTAAAAEQARCmVuZHN0cmVhbQplbmRvYmoKCjEyNDEgMCBvYmoKPDwKL1R5 cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTEyNDEKL1dp ZHRoIDEyCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNw YWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDYgPGVkMWMyNGY3OGM3MGZhYjY4 ZGY5YTg4M2Y4OWE3YWYyNTQ0YWZlZTBhOT5dCi9MZW5ndGggMTQKL0ZpbHRl ciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1R2UA1jBAAC1wDhCmVuZHN0 cmVhbQplbmRvYmoKCjEyNDIgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1 YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTEyNDIKL1dpZHRoIDUKL0hlaWdodCAx Ci9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9E ZXZpY2VSR0IgMSA8ZWQxYzI0Zjc4YzcwPl0KL0xlbmd0aCAxMAovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjcAAAAEIAQQplbmRzdHJlYW0K ZW5kb2JqCgoxMjQzIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBl IC9JbWFnZQovTmFtZSAvSW0xMjQzCi9XaWR0aCA1Ci9IZWlnaHQgMQovQml0 c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNl UkdCIDEgPGY5YTg4M2VkMWMyND5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxh dGVEZWNvZGUKPj4Kc3RyZWFtCnjaE2UAAAAsABYKZW5kc3RyZWFtCmVuZG9i agoKMTI0NCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1h Z2UKL05hbWUgL0ltMTI0NAovV2lkdGggMTIKL0hlaWdodCAxCi9CaXRzUGVy Q29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0Ig NyA8ZWQxYzI0Zjc4YzcwZmVlMGE5ZjE0NjQxZmFiNjhkZjlhODgzZWUyYTJl ZmRkMmEwPl0KL0xlbmd0aCAxNAovRmlsdGVyIC9GbGF0ZURlY29kZQo+Pgpz dHJlYW0KeNpjVDBwZUgHAAKiAP4KZW5kc3RyZWFtCmVuZG9iagoKMTI0NSAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltMTI0NQovV2lkdGggMwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg MgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxIDxmZGQyYTBm YWI2OGQ+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3Ry ZWFtCnjaEwAAABEAEQplbmRzdHJlYW0KZW5kb2JqCgoxMjQ2IDAgb2JqCjw8 Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xMjQ2 Ci9XaWR0aCAxCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xv clNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDAgPGZiYzQ5Nj5dCi9MZW5n dGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjAAAAAQAB CmVuZHN0cmVhbQplbmRvYmoKCjEyNDcgMCBvYmoKPDwKL1R5cGUgL1hPYmpl Y3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTEyNDcKL1dpZHRoIDMKL0hl aWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRl eGVkIC9EZXZpY2VSR0IgMiA8ZmRkMmEwZmFiNjhkZmVlMGE5Pl0KL0xlbmd0 aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42pMAAAAZABkK ZW5kc3RyZWFtCmVuZG9iagoKMTI0OCAwIG9iago8PAovVHlwZSAvWE9iamVj dAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTI0OAovV2lkdGggMwovSGVp Z2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4 ZWQgL0RldmljZVJHQiAxIDxmYWI2OGRlZDFjMjQ+XQovTGVuZ3RoIDkKL0Zp bHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaEwAAABEAEQplbmRzdHJl YW0KZW5kb2JqCgoxMjQ5IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0 eXBlIC9JbWFnZQovTmFtZSAvSW0xMjQ5Ci9XaWR0aCAxMgovSGVpZ2h0IDEK L0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rl dmljZVJHQiA1IDxlZDFjMjRmMjU0NGFlZTJhMmVlZjM4MzdmZWUwYTlmNzhj NzA+XQovTGVuZ3RoIDE0Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVh bQp42mNUdhFQDQAAApUA7gplbmRzdHJlYW0KZW5kb2JqCgoxMjUwIDAgb2Jq Cjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0x MjUwCi9XaWR0aCA2Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9D b2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMgPGZhYjY4ZGVkMWMy NGZiYzQ5NmYyNTQ0YT5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjaE3oAAAEGAPMKZW5kc3RyZWFtCmVuZG9iagoKMTI1 MSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05h bWUgL0ltMTI1MQovV2lkdGggMTIKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9u ZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNSA8ZWQx YzI0ZjI1NDRhZjlhODgzZjc4YzcwZjM2MjU0ZWUyYTJlPl0KL0xlbmd0aCAx NAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVDBmcjUAAAI4 AMwKZW5kc3RyZWFtCmVuZG9iagoKMTI1MiAwIG9iago8PAovVHlwZSAvWE9i amVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTI1MgovV2lkdGggOQov SGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0lu ZGV4ZWQgL0RldmljZVJHQiA1IDxlZDFjMjRmNzhjNzBmZGQyYTBmYWI2OGRm YmM0OTZmMTQ2NDE+XQovTGVuZ3RoIDEzCi9GaWx0ZXIgL0ZsYXRlRGVjb2Rl Cj4+CnN0cmVhbQp42mNUdmVkAAABZwBrCmVuZHN0cmVhbQplbmRvYmoKCjEy NTMgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9O YW1lIC9JbTEyNTMKL1dpZHRoIDYKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9u ZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNCA8ZjQ3 MDVkZWUyYTJlZjE0NjQxZWQxYzI0Zjc4YzcwPl0KL0xlbmd0aCAxMQovRmls dGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVHYGAACPAGgKZW5kc3Ry ZWFtCmVuZG9iagoKMTI1NCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3Vi dHlwZSAvSW1hZ2UKL05hbWUgL0ltMTI1NAovV2lkdGggOQovSGVpZ2h0IDEK L0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rl dmljZVJHQiAzIDxlZDFjMjRmNzhjNzBmODlhN2FmYmM0OTY+XQovTGVuZ3Ro IDExCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42pO4yAAAAe0A 6gplbmRzdHJlYW0KZW5kb2JqCgoxMjU1IDAgb2JqCjw8Ci9UeXBlIC9YT2Jq ZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xMjU1Ci9XaWR0aCAxMgov SGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0lu ZGV4ZWQgL0RldmljZVJHQiA0IDxlZDFjMjRmMzYyNTRmZGQyYTBmNzhjNzBm ZWUwYTk+XQovTGVuZ3RoIDE0Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0 cmVhbQp42mNUMGYRMAAAAdQAmQplbmRzdHJlYW0KZW5kb2JqCgoxMjU2IDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW0xMjU2Ci9XaWR0aCA2Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAy Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMgPGZhYjY4ZGVk MWMyNGZkZDJhMGY3OGM3MD5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVE ZWNvZGUKPj4Kc3RyZWFtCnjaE3oAAAEGAPMKZW5kc3RyZWFtCmVuZG9iagoK MTI1NyAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UK L05hbWUgL0ltMTI1NwovV2lkdGggMTIKL0hlaWdodCAxCi9CaXRzUGVyQ29t cG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNiA8 ZWQxYzI0ZWYzODM3ZWUyYTJlZmRkMmEwZmFiNjhkZjI1NDRhZjc4YzcwPl0K L0xlbmd0aCAxNAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpj ZDJhCEgAAAHmAOgKZW5kc3RyZWFtCmVuZG9iagoKMTI1OCAwIG9iago8PAov VHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTI1OAov V2lkdGggNgovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JT cGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxIDxmYWI2OGRlZDFjMjQ+XQov TGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hNw AAAAYgBRCmVuZHN0cmVhbQplbmRvYmoKCjEyNTkgMCBvYmoKPDwKL1R5cGUg L1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTEyNTkKL1dpZHRo IDEKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2Ug Wy9JbmRleGVkIC9EZXZpY2VSR0IgMCA8ZmRkMmEwPl0KL0xlbmd0aCA5Ci9G aWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMAAAABAAEKZW5kc3Ry ZWFtCmVuZG9iagoKMTI2MCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3Vi dHlwZSAvSW1hZ2UKL05hbWUgL0ltMTI2MAovV2lkdGggMgovSGVpZ2h0IDEK L0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rl dmljZVJHQiAxIDxmZGQyYTBmYmM0OTY+XQovTGVuZ3RoIDkKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaEwAAABEAEQplbmRzdHJlYW0KZW5k b2JqCgoxMjYxIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9J bWFnZQovTmFtZSAvSW0xMjYxCi9XaWR0aCA4Ci9IZWlnaHQgMQovQml0c1Bl ckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdC IDQgPGY5ZThhYmQ1Yzg4ZWQwYzI2ZGM5Yjg2MGVmZGRhMj5dCi9MZW5ndGgg MTIKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1Q2FgEAAOsA bAplbmRzdHJlYW0KZW5kb2JqCgoxMjYyIDAgb2JqCjw8Ci9UeXBlIC9YT2Jq ZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xMjYyCi9XaWR0aCAxNAov SGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0lu ZGV4ZWQgL0RldmljZVJHQiAxMSA8ZjllOGFiZDBjMjZkZDRhMzM5ZTg5YjFk ZmY5ZDBhZmY5OTAwZjM5MzAxZTU4YjAxZDc4MjAxY2I3YjAyYmY4ZDJjYzli ODYwPl0KL0xlbmd0aCAxNQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl YW0KeNpjVHZNq5i1AQAHHQKSCmVuZHN0cmVhbQplbmRvYmoKCjEyNjMgMCBv YmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9J bTEyNjMKL1dpZHRoIDE2Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0 Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDExIDxkMGMyNmRl ODliMWRmZWE0MWRmZWFkMzJmZjljMDdmMzkzMDFlNThiMDFkNzgyMDFjYjdi MDJjMzc2MDFiZjhkMmNjOWI4NjA+XQovTGVuZ3RoIDE2Ci9GaWx0ZXIgL0Zs YXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUNjZyTe9cDQAHNwJqCmVuZHN0cmVh bQplbmRvYmoKCjEyNjQgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5 cGUgL0ltYWdlCi9OYW1lIC9JbTEyNjQKL1dpZHRoIDIwCi9IZWlnaHQgMQov Qml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2 aWNlUkdCIDEwIDxmOWU4YWJkNGEzMzlmZjlkMGFmZWFkMzJmZWJiNTRmMzkz MDFlNThiMDFkNzgyMDFjYjdiMDJjMzc2MDFiZjhkMmM+XQovTGVuZ3RoIDE4 Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUdnFxNgqrmLkA AAxpAykKZW5kc3RyZWFtCmVuZG9iagoKMTI2NSAwIG9iago8PAovVHlwZSAv WE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTI2NQovV2lkdGgg MjIKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2Ug Wy9JbmRleGVkIC9EZXZpY2VSR0IgMTIgPGVmZGRhMmQ0YTMzOWZmOWMwN2Zl YWQzMmZlYmI1NGZmY2E3OGZlYTQxZGZmOTkwMGYzOTMwMWQ3ODIwMWNiN2Iw MmMzNzYwMWJmOGQyYz5dCi9MZW5ndGggMTkKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjaY1R2DQ11Se9cvfsAABLSBG4KZW5kc3RyZWFtCmVu ZG9iagoKMTI2NiAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAv SW1hZ2UKL05hbWUgL0ltMTI2NgovV2lkdGggMjMKL0hlaWdodCAyCi9CaXRz UGVyQ29tcG9uZW50IDgKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VS R0IgMTYgPGY5ZThhYmQyOTIyNGYzOTMwMWZlYTQxZGZlYmI1NGZmY2E3OGVm ZGRhMmViZDM5OGZlYWQzMmZmOWQwYWU1OGIwMWQ3ODIwMWMzNzYwMWNiN2Iw MmQ0YTMzOWZmOTkwMGZmZWVkMj5dCi9MZW5ndGggNDcKL0ZpbHRlciAvRmxh dGVEZWNvZGUKPj4Kc3RyZWFtCnjaDchBAgAgBARAakmo/P+1meMQjwkRJV0C 28MjMw9ff4beKlqw+TxOd3wa4AFgCmVuZHN0cmVhbQplbmRvYmoKCjEyNjcg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTEyNjcKL1dpZHRoIDI1Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVu dCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEzIDxkMGMy NmRkNzgyMDFlNThiMDFmZjljMDdmZWFkMzJmZWJiNTRmZmNhNzhlZmRkYTJm ZmVlZDJmOWU4YWIzZDI3MDZmZjk5MDBjYjdiMDJjMzc2MDE+XQovTGVuZ3Ro IDIxCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUdk3v6Fy1 apPM3YMMACJwBaIKZW5kc3RyZWFtCmVuZG9iagoKMTI2OCAwIG9iago8PAov VHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTI2OAov V2lkdGggMjcKL0hlaWdodCAzCi9CaXRzUGVyQ29tcG9uZW50IDgKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMjMgPGY5ZThhYmJmOGQyY2Q3 ODIwMWU1OGIwMWZmOTkwMGZlYWQzMmZlYmI1NGZmY2E3OGVmZGRhMmZmZWVk MjhlODM1ZDAwMDAwMDNkMjcwNmYzOTMwMWNiN2IwMmMzNzYwMWU4OWIxZGQw YzI2ZGZlYTQxZGViZDM5OGQ1Yzg4ZWZmOWQwYThhNTYwOWQ0YTMzOT5dCi9M ZW5ndGggNjYKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaLctZ FoAgCABAhJIIAc2W+980W77nDSSkac68iMiqqsUIPcKxQvNBW+YOsOtP8ZC1 FEh2jMb91PKSf3TdcP0DGQplbmRzdHJlYW0KZW5kb2JqCgoxMjY5IDAgb2Jq Cjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0x MjY5Ci9XaWR0aCAyOQovSGVpZ2h0IDgKL0JpdHNQZXJDb21wb25lbnQgOAov Q29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyMyA8ZjllOGFiY2I3 YjAyYzM3NjAxZDc4MjAxZTU4YjAxZmY5OTAwZmVhNDFkZmVhZDMyZmViYjU0 ZmZjYTc4YTU4YjQ1MDAwMDAwM2QyNzA2YmY4ZDJjZjM5MzAxZTg5YjFkZDVj ODhlZDI5MjI0ZDBjMjZkZmY5ZDBhOGE1NjA5ZmY5YzA3YzliODYwZWZkZGEy Pl0KL0xlbmd0aCAxMjMKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFt CnjaPczrGsIgCAZgObhVEHOmdv93Gugaf4DvfSABAnHe9sfzJfoWUSZA9NCO VKKzue4qeDoS4ZWV+p8+TXQDR1iHnHsd18ieo2HgDALHxFhUGnNgrOvXqLQ0 Yi/x1uYn670WWtrkLo2nfthLOl2DVe/LMMv9+P4A0yAG2QplbmRzdHJlYW0K ZW5kb2JqCgoxMjcwIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBl IC9JbWFnZQovTmFtZSAvSW0xMjcwCi9XaWR0aCAyNwovSGVpZ2h0IDMKL0Jp dHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rldmlj ZVJHQiAxNCA8ZDRhMzM5ZTU4YjAxZDc4MjAxY2I3YjAyYzM3NjAxOGE1NjA5 MDAwMDAwM2QyNzA2ZjM5MzAxZmY5OTAwZmY5YzA3ZDBjMjZkZmY5ZDBhZjll OGFiZTg5YjFkPl0KL0xlbmd0aCA1MQovRmlsdGVyIC9GbGF0ZURlY29kZQo+ PgpzdHJlYW0KeNpjFFI2cXFxTStSlOhcybBDUEnZ2Ng0rUiwY9aJDfc6BIWU lFTSCjtmrll3AQAFzQ66CmVuZHN0cmVhbQplbmRvYmoKCjEyNzEgMCBvYmoK PDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTEy NzEKL1dpZHRoIDI1Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9D b2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDggPGQwYzI2ZGZmOTkw MGYzOTMwMWU1OGIwMWMzNzYwMWNiN2IwMmQ3ODIwMWZmOWMwN2ZmOWQwYT5d Ci9MZW5ndGggMjEKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja Y1RSNjY2NglTEu8oZAAAD4QCnAplbmRzdHJlYW0KZW5kb2JqCgoxMjcyIDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW0xMjcyCi9XaWR0aCAyMwovSGVpZ2h0IDIKL0JpdHNQZXJDb21wb25lbnQg NAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA2IDxkNGEzMzlm Zjk5MDBmMzkzMDFmZjljMDdmZjlkMGFmOWU4YWJkMjkyMjQ+XQovTGVuZ3Ro IDI3Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMUVAIBQWNn IYUAY0EQMHYxVEoAACW4A3gKZW5kc3RyZWFtCmVuZG9iagoKMTI3MyAwIG9i ago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0lt MTI3MwovV2lkdGggMjUKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQK L0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgOCA8ZjllOGFiZWJk Mzk4ZDRhMzM5ZmY5ZDBhZmY5YzA3ZmY5OTAwZjM5MzAxZTU4YjAxZDI5MjI0 Pl0KL0xlbmd0aCAyMQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0K eNpjEDI2cXFxNnYJS29kAAARjAL6CmVuZHN0cmVhbQplbmRvYmoKCjEyNzQg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTEyNzQKL1dpZHRoIDI3Ci9IZWlnaHQgNgovQml0c1BlckNvbXBvbmVu dCA4Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDE4IDxmOWU4 YWJlZmRkYTJlYmQzOThkNWM4OGVkNGEzMzlmZjljMDdmZjlkMGFmZjk5MDBm MzkzMDFlNThiMDFiZjhkMmNjMmI1ODVhZWEyNzdhNThiNDVlODliMWRkMjky MjQ5ODhkNjg4ZTgzNWRkNzgyMDE+XQovTGVuZ3RoIDkzCi9GaWx0ZXIgL0Zs YXRlRGVjb2RlCj4+CnN0cmVhbQp42kWNWxaAIAhEUUJRJLH9LzYwz2k+gOHy AEgZL6JSigeiWpm5dcwAQWToXT9Fv00dgsmRE7Ol8+bdf7ousyE/CqlrFwdB HBxOLQZ2cisIcL5J4CM3mH3pBaPEBaIKZW5kc3RyZWFtCmVuZG9iagoKMTI3 NSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05h bWUgL0ltMTI3NQovV2lkdGggMjUKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9u ZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8Zjll OGFiZWZkZGEyZWJkMzk4ZDVjODhlPl0KL0xlbmd0aCAxNQovRmlsdGVyIC9G bGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjzP7//98UBgAPqQP9CmVuZHN0cmVh bQplbmRvYmoKCjEyNzYgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5 cGUgL0ltYWdlCi9OYW1lIC9JbTEyNzYKL1dpZHRoIDIyCi9IZWlnaHQgMQov Qml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2 aWNlUkdCIDEgPGY5ZThhYmVmZGRhMj5dCi9MZW5ndGggMTQKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYxANDXVgAAADQgEACmVuZHN0cmVh bQplbmRvYmoKCjEyNzcgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5 cGUgL0ltYWdlCi9OYW1lIC9JbTEyNzcKL1dpZHRoIDkKL0hlaWdodCAxCi9C aXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZp Y2VSR0IgNCA8ZjdlOWFiYjhkNzk4OWRkMzg1OGNjZDdjZWNkZWEzPl0KL0xl bmd0aCAxMwovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVDY2 dAAAAdEAyQplbmRzdHJlYW0KZW5kb2JqCgoxMjc4IDAgb2JqCjw8Ci9UeXBl IC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xMjc4Ci9XaWR0 aCAxNQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFj ZSBbL0luZGV4ZWQgL0RldmljZVJHQiA4IDxmN2U5YWI5ZGQzODU1ZWM2NjU1 NWUwNjY1NmUxNjc0ZmRhNjA0NmQwNTczY2MyNGM4Y2NkN2M+XQovTGVuZ3Ro IDE2Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUdg5LK69g AAAIMgITCmVuZHN0cmVhbQplbmRvYmoKCjEyNzkgMCBvYmoKPDwKL1R5cGUg L1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTEyNzkKL1dpZHRo IDE3Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNl IFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEwIDw5ZGQzODU1ZWM2NjU1ZGU4NmU2 M2VlNzQ1NWUwNjY0ZmRhNjA0NmQwNTczY2MyNGMzM2JhNDMyY2I3M2Q4Y2Nk N2M+XQovTGVuZ3RoIDE3Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVh bQp42mNUNjZyDauYsQAACaQC1QplbmRzdHJlYW0KZW5kb2JqCgoxMjgwIDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW0xMjgwCi9XaWR0aCAyMQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg NAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxMCA8ZjdlOWFi NWVjNjY1NTZlMTY3NjNlZTc0NzZmMzg1OGNmNTk5NGZkYTYwNDZkMDU3M2Nj MjRjMzNiYTQzMmNiNzNkPl0KL0xlbmd0aCAxOQovRmlsdGVyIC9GbGF0ZURl Y29kZQo+PgpzdHJlYW0KeNpjVHYJdTZSq5i1kAEADy8DDAplbmRzdHJlYW0K ZW5kb2JqCgoxMjgxIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBl IC9JbWFnZQovTmFtZSAvSW0xMjgxCi9XaWR0aCAyMwovSGVpZ2h0IDEKL0Jp dHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rldmlj ZVJHQiAxMiA8ZWNkZWEzNWVjNjY1NTVlMDY2NjNlZTc0NzZmMzg1OGNmNTk5 YTRmNWFlNWRlODZlNGZkYTYwNDZkMDU3M2NjMjRjMzNiYTQzMmNiNzNkPl0K L0xlbmd0aCAyMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpj VHZNSw0p71x95hQDABlwBMoKZW5kc3RyZWFtCmVuZG9iagoKMTI4MiAwIG9i ago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0lt MTI4MgovV2lkdGggMjUKL0hlaWdodCAyCi9CaXRzUGVyQ29tcG9uZW50IDQK L0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMTQgPGY3ZTlhYjVl YzY2NTRmZGE2MDVkZTg2ZTc2ZjM4NThjZjU5OWE0ZjVhZWI5ZjljMTYzZWU3 NDU2ZTE2NzQ2ZDA1NzNjYzI0YzJjYjczZDMzYmE0M2Q0ZjlkOD5dCi9MZW5n dGggMzUKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1R2TS8v i+jU2nPmNoOUhmvdu7IQZ629Z24LAACEQQrKCmVuZHN0cmVhbQplbmRvYmoK CjEyODMgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdl Ci9OYW1lIC9JbTEyODMKL1dpZHRoIDI3Ci9IZWlnaHQgMQovQml0c1BlckNv bXBvbmVudCA4Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDE2 IDw5ZGQzODUzY2MyNGM0NmQwNTc1NWUwNjY2M2VlNzQ3NmYzODU4Y2NkN2M1 ZTliNTk5MTg5NjVkNGY5ZDhiOWY5YzE4Y2Y1OTk1ZWM2NjUyYTc3MzMyYTlk MzgzM2JhNDMyY2I3M2Q+XQovTGVuZ3RoIDM1Ci9GaWx0ZXIgL0ZsYXRlRGVj b2RlCj4+CnN0cmVhbQp42mNgZGJmYWVj5+Dk5OTi5uHh5eXl4xcQ4GdkYgAA CpQA4wplbmRzdHJlYW0KZW5kb2JqCgoxMjg0IDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xMjg0Ci9XaWR0aCAy OQovSGVpZ2h0IDMKL0JpdHNQZXJDb21wb25lbnQgOAovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiAxOSA8ZjdlOWFiM2NjMjRjNDZkMDU3NTVl MDY2NjNlZTc0NzZmMzg1MmE3NzMzMDAwMDAwYjhkNzk4ZDRmOWQ4YTRmNWFl MTc0YzFlMmNiNzNkMzNiYTQzNWVjNjY1OWRkMzg1NGZkYTYwMGIyMjBlYjlm OWMxMmE5ZDM4Pl0KL0xlbmd0aCA2NgovRmlsdGVyIC9GbGF0ZURlY29kZQo+ PgpzdHJlYW0KeNodiUsWwCAIA4V+FEtB6v3v2kAWyctMI+LjvO7eh8jEZB7V l9iao5cBxpCvXJQFZjelHcV8OjqI8++U9gNzmgLrCmVuZHN0cmVhbQplbmRv YmoKCjEyODUgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0lt YWdlCi9OYW1lIC9JbTEyODUKL1dpZHRoIDMxCi9IZWlnaHQgMQovQml0c1Bl ckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdC IDEzIDxmN2U5YWIzM2JhNDMyY2I3M2QyYTlkMzgwMDAwMDAwYjIyMGU4Y2Nk N2M4Y2Y1OTk1ZTliNTkyYTc3MzM0ZmRhNjA0NmQwNTczY2MyNGMxNzRjMWU+ XQovTGVuZ3RoIDI0Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4 2mNUNHFxCatwmbn6rMvE06sYACvhBkwKZW5kc3RyZWFtCmVuZG9iagoKMTI4 NiAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05h bWUgL0ltMTI4NgovV2lkdGggMzEKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9u ZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMTIgPGI4 ZDc5ODJjYjczZDMzYmE0MzJhOWQzODNjYzI0YzBiMjIwZTAwMDAwMDVlYzY2 NTc2ZjM4NTU2ZTE2NzQ2ZDA1NzRmZGE2MDU1ZTA2Nj5dCi9MZW5ndGggMjQK L0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYxRSVgkL71R2WeKa ZuK1hwEAIKQEgQplbmRzdHJlYW0KZW5kb2JqCgoxMjg3IDAgb2JqCjw8Ci9U eXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xMjg3Ci9X aWR0aCAzMQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JT cGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxMyA8OWRkMzg1MmNiNzNkMzNi YTQzM2NjMjRjNDZkMDU3MGIyMjBlMDAwMDAwNWVjNjY1NWRlODZlNTVlMDY2 NGZkYTYwMmE5ZDM4MmE3NzMzMTc0YzFlPl0KL0xlbmd0aCAyNAovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjFFR2CQvvmOWy51qusstKBgAq DwWcCmVuZHN0cmVhbQplbmRvYmoKCjEyODggMCBvYmoKPDwKL1R5cGUgL1hP YmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTEyODgKL1dpZHRoIDMx Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsv SW5kZXhlZCAvRGV2aWNlUkdCIDEwIDw4Y2NkN2MzM2JhNDMyY2I3M2QzY2My NGMwYjIyMGUwMDAwMDA0ZmRhNjA0NmQwNTcxNzRjMWUyYTlkMzg1NWUwNjY+ XQovTGVuZ3RoIDI0Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4 2mNUUjR2DU4rN24N9TQuy2IAACEjBFYKZW5kc3RyZWFtCmVuZG9iagoKMTI4 OSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05h bWUgL0ltMTI4OQovV2lkdGggMzEKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9u ZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMTAgPDhj Y2Q3YzMzYmE0MzJjYjczZDBiMjIwZTAwMDAwMDQ2ZDA1NzNjYzI0YzJhNzcz MzRmZGE2MDU1ZTA2NjU2ZTE2Nz5dCi9MZW5ndGggMjQKL0ZpbHRlciAvRmxh dGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1RSEjRxDEsTLHZxFo2YxQAAGigDmgpl bmRzdHJlYW0KZW5kb2JqCgoxMjkwIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0 Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xMjkwCi9XaWR0aCAzMQovSGVp Z2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4 ZWQgL0RldmljZVJHQiAxMCA8OWRkMzg1M2NjMjRjMzNiYTQzMmNiNzNkMGIy MjBlMDAwMDAwMmE5ZDM4MmE3NzMzNDZkMDU3NGZkYTYwNTVlMDY2Pl0KL0xl bmd0aCAyNAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVDY2 dg0TVDI2SwmtmLmKAQAcagQ2CmVuZHN0cmVhbQplbmRvYmoKCjEyOTEgMCBv YmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9J bTEyOTEKL1dpZHRoIDMxCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0 Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEyIDxiOGQ3OTgz Y2MyNGMzM2JhNDMyY2I3M2QwYjIyMGUwMDAwMDAyYTlkMzgyYTc3MzMxNzRj MWU0NmQwNTc0ZmRhNjA1NWUwNjY1NmUxNjc+XQovTGVuZ3RoIDI0Ci9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMUMjZ2DVNLMzZWD+1cfZoB AB3aBIIKZW5kc3RyZWFtCmVuZG9iagoKMTI5MiAwIG9iago8PAovVHlwZSAv WE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTI5MgovV2lkdGgg MzEKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2Ug Wy9JbmRleGVkIC9EZXZpY2VSR0IgMTIgPGY3ZTlhYjQ2ZDA1NzNjYzI0YzMz YmE0MzJjYjczZDBiMjIwZTAwMDAwMDJhOWQzODE3NGMxZTJhNzczMzRmZGE2 MDU1ZTA2NmVjZGVhMz5dCi9MZW5ndGggMjQKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjaY1QydglL90ib6WyZ1rV71wEAJ7UGQAplbmRzdHJl YW0KZW5kb2JqCgoxMjkzIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0 eXBlIC9JbWFnZQovTmFtZSAvSW0xMjkzCi9XaWR0aCAyOQovSGVpZ2h0IDMK L0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rl dmljZVJHQiAxNCA8NWVjNjY1NDZkMDU3M2NjMjRjMzNiYTQzMmNiNzNkMGIy MjBlMDAwMDAwMmE5ZDM4MmE3NzMzMTc0YzFlNGZkYTYwNTVlMDY2NTZlMTY3 OWRkMzg1ZjdlOWFiPl0KL0xlbmd0aCA1NAovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNpjVFJ2TStpy5ysNC1j9WmGi4JKpmnFpWmpU9MC9+y6 8GChoGpakUZaWlqq9ekFDwCTHhM2CmVuZHN0cmVhbQplbmRvYmoKCjEyOTQg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTEyOTQKL1dpZHRoIDI3Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVu dCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEwIDw5ZGQz ODU0ZmRhNjA0NmQwNTcyYTlkMzgyYTc3MzMzY2MyNGMzM2JhNDMxNzRjMWUw YjIyMGU1NmUxNjc1NWUwNjY+XQovTGVuZ3RoIDIyCi9GaWx0ZXIgL0ZsYXRl RGVjb2RlCj4+CnN0cmVhbQp42mMUVDJxVVJzqSjRnCXEAAATZwL7CmVuZHN0 cmVhbQplbmRvYmoKCjEyOTUgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1 YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTEyOTUKL1dpZHRoIDI1Ci9IZWlnaHQg MgovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAv RGV2aWNlUkdCIDYgPDVlYzY2NTU1ZTA2NjRmZGE2MDQ2ZDA1NzU2ZTE2N2Y3 ZTlhYmVjZGVhMz5dCi9MZW5ndGggMzIKL0ZpbHRlciAvRmxhdGVEZWNvZGUK Pj4Kc3RyZWFtCnjaY1RSUjY2VlJSFBFUZggQFFICMgVFHJUMEgArcAOOCmVu ZHN0cmVhbQplbmRvYmoKCjEyOTYgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QK L1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTEyOTYKL1dpZHRoIDI3Ci9IZWln aHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhl ZCAvRGV2aWNlUkdCIDYgPGY3ZTlhYmUxZDU5YjVlYzY2NTU2ZTE2NzU1ZTA2 NjRmZGE2MDQ2ZDA1Nz5dCi9MZW5ndGggMjIKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjaYxAyNnFxcTY2cQ1NEmAAABNMArgKZW5kc3RyZWFt CmVuZG9iagoKMTI5NyAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlw ZSAvSW1hZ2UKL05hbWUgL0ltMTI5NwovV2lkdGggMjkKL0hlaWdodCA2Ci9C aXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZp Y2VSR0IgMTQgPGY3ZTlhYmVjZGVhM2UxZDU5YmQ1Yzg5MzVlYzY2NTU1ZTA2 NjU2ZTE2NzRmZGE2MDQ2ZDA1N2M2Yjk4OGFmYTM3ODVlOWI1OTNjYzI0Yzkx ODk2NTMzYmE0Mz5dCi9MZW5ndGggODcKL0ZpbHRlciAvRmxhdGVEZWNvZGUK Pj4Kc3RyZWFtCnjaYxAyCU1LDQsNLa9omSTAwKi5aks5CHT07FqpyMBoufbu lvaOjo5ze++uNARz797evXv33bsgLoPyrFV3weDWqskKDAyMyjNnrQKBmZMV GRgAHMsqqAplbmRzdHJlYW0KZW5kb2JqCgoxMjk4IDAgb2JqCjw8Ci9UeXBl IC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xMjk4Ci9XaWR0 aCAyNwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFj ZSBbL0luZGV4ZWQgL0RldmljZVJHQiA0IDxmN2U5YWJlY2RlYTNlMWQ1OWJk NWM4OTNjNmI5ODg+XQovTGVuZ3RoIDIyCi9GaWx0ZXIgL0ZsYXRlRGVjb2Rl Cj4+CnN0cmVhbQp42mNgFFI2NnFxMTZWEmRgAAANLgG/CmVuZHN0cmVhbQpl bmRvYmoKCjEyOTkgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTEyOTkKL1dpZHRoIDIzCi9IZWlnaHQgMQovQml0 c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNl UkdCIDEgPGY3ZTlhYmVjZGVhMz5dCi9MZW5ndGggMTQKL0ZpbHRlciAvRmxh dGVEZWNvZGUKPj4Kc3RyZWFtCnjaYxANDQ1gAAADYgEQCmVuZHN0cmVhbQpl bmRvYmoKCjEzMDAgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTEzMDAKL1dpZHRoIDgKL0hlaWdodCAxCi9CaXRz UGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VS R0IgMiA8ZWJkZGE0YjRiZmExOTVhN2ExPl0KL0xlbmd0aCAxMAovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTWgIAANoAvwplbmRzdHJlYW0K ZW5kb2JqCgoxMzAxIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBl IC9JbWFnZQovTmFtZSAvSW0xMzAxCi9XaWR0aCAxNAovSGVpZ2h0IDEKL0Jp dHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rldmlj ZVJHQiA4IDxmN2U4YWI5NWE3YTE3NjhjYjk4MzkzZTU5MmEzZmY4NDk4ZmY3 NDhhZmQ2NDdhZjE2NTc5YzE+XQovTGVuZ3RoIDE1Ci9GaWx0ZXIgL0ZsYXRl RGVjb2RlCj4+CnN0cmVhbQp42mNUdnENqxAAAAVKAYwKZW5kc3RyZWFtCmVu ZG9iagoKMTMwMiAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAv SW1hZ2UKL05hbWUgL0ltMTMwMgovV2lkdGggMTYKL0hlaWdodCAxCi9CaXRz UGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VS R0IgOCA8OTVhN2ExNzY4YWQyYTViM2ZmOTJhM2ZmODQ5OGZmNzQ4YWZkNmE4 MGY2NjQ3YWYxNTc2YWNkPl0KL0xlbmd0aCAxNgovRmlsdGVyIC9GbGF0ZURl Y29kZQo+PgpzdHJlYW0KeNpjVFJSMnFNbwAABWEByAplbmRzdHJlYW0KZW5k b2JqCgoxMzAzIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9J bWFnZQovTmFtZSAvSW0xMzAzCi9XaWR0aCAyMAovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiA5IDxmN2U4YWI3NjhjYjk5MmEzZmZhNWIzZmZiYmM1ZmM4NDk4ZmY3NDhh ZmQ2YTgwZjY2NDdhZjE2NTc5YzE+XQovTGVuZ3RoIDE4Ci9GaWx0ZXIgL0Zs YXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUNnFxNgpL75gAAAuEAucKZW5kc3Ry ZWFtCmVuZG9iagoKMTMwNCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3Vi dHlwZSAvSW1hZ2UKL05hbWUgL0ltMTMwNAovV2lkdGggMjIKL0hlaWdodCAx Ci9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9E ZXZpY2VSR0IgMTAgPGViZGRhNDc2OGFkMjkyYTNmZmE1YjNmZmJiYzVmY2Q4 ZGVmZTg0OThmZjc0OGFmZDZhODBmNjY0N2FmMTY1NzljMT5dCi9MZW5ndGgg MTkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1R2cQ1xNkrv nLkAAA/hA6AKZW5kc3RyZWFtCmVuZG9iagoKMTMwNSAwIG9iago8PAovVHlw ZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTMwNQovV2lk dGggMjQKL0hlaWdodCAyCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3Bh Y2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMTEgPGY3ZThhYjc2OGFkMjkyYTNm ZmE1YjNmZmJiYzVmY2Q4ZGVmZTg0OThmZjc0OGFmZDZhODBmNjY0N2FmMTY1 NzljMTc2OGNiOT5dCi9MZW5ndGggMzIKL0ZpbHRlciAvRmxhdGVEZWNvZGUK Pj4Kc3RyZWFtCnjaY1Q2CQ0NcVarmDljwTZll9DQUBej9M4Z1QBf5gieCmVu ZHN0cmVhbQplbmRvYmoKCjEzMDYgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QK L1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTEzMDYKL1dpZHRoIDI2Ci9IZWln aHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhl ZCAvRGV2aWNlUkdCIDExIDw5NWE3YTE3NDhhZmQ4NDk4ZmY5MmEzZmZhNWIz ZmZiYmM1ZmM3Mjc5NzlkOGRlZmU1NzY0OTYyYzMzNTk0MzRkODM2YTgwZjY+ XQovTGVuZ3RoIDIxCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4 2mNUdg1IYy8NMZKYtVEAABVoA5UKZW5kc3RyZWFtCmVuZG9iagoKMTMwNyAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltMTMwNwovV2lkdGggMjgKL0hlaWdodCAzCi9CaXRzUGVyQ29tcG9uZW50 IDgKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMTkgPGY3ZThh YjY1NzljMTc0OGFmZDg0OThmZjkyYTNmZmE1YjNmZjc2OGNiOTE4MWMyZjAw MDAwMDlhYTJjY2JiYzVmYzZhODBmNjY0N2FmMTc2OGFkMjk1YTdhMTgzOTNl NTU3NmFjZDQzNGQ4MzU3NjQ5NjJjMzM1OT5dCi9MZW5ndGggNjkKL0ZpbHRl ciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaHcxbDoAgDERR6IMOpYLo/vdq cb5ucpIplVi0GXLW3VV4GCyIrjJH2jpwtKusO+sYzxqJG3jcX2Drxv8QxNw+ Yn8CggplbmRzdHJlYW0KZW5kb2JqCgoxMzA4IDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xMzA4Ci9XaWR0aCAz MAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiAxMyA8ZjdlOGFiNTc2YWNkNjQ3YWYxNmE4 MGY2NzQ4YWZkODQ5OGZmMTgxYzJmMDAwMDAwYmJjNWZjOWFhMmNjOTJhM2Zm MmMzMzU5ODM5M2U1ZWJkZGE0Pl0KL0xlbmd0aCAyMwovRmlsdGVyIC9GbGF0 ZURlY29kZQo+PgpzdHJlYW0KeNpjVHZNz+iYXra6vLzMJPQsACrZBjMKZW5k c3RyZWFtCmVuZG9iagoKMTMwOSAwIG9iago8PAovVHlwZSAvWE9iamVjdAov U3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTMwOQovV2lkdGggMzAKL0hlaWdo dCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVk IC9EZXZpY2VSR0IgMTMgPGI0YmZhMTY0N2FmMTZhODBmNjc0OGFmZDJjMzM1 OTQzNGQ4M2E1YjNmZmJiYzVmYzlhYTJjYzAwMDAwMDE4MWMyZjkyYTNmZjU3 NmFjZDg0OThmZj5dCi9MZW5ndGggMjMKL0ZpbHRlciAvRmxhdGVEZWNvZGUK Pj4Kc3RyZWFtCnjaYxQydglL75y1WfDkLOW7GwAmrQZCCmVuZHN0cmVhbQpl bmRvYmoKCjEzMTAgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTEzMTAKL1dpZHRoIDMwCi9IZWlnaHQgMQovQml0 c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNl UkdCIDExIDw5NWE3YTE2NDdhZjE2YTgwZjY3NDhhZmQ4NDk4ZmY5MmEzZmZh NWIzZmY1NzY0OTYwMDAwMDAyYzMzNTk1NzZhY2QxODFjMmY+XQovTGVuZ3Ro IDIzCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMUVDYJTavo dDZa0a3sGgAAHx4EhgplbmRzdHJlYW0KZW5kb2JqCgoxMzExIDAgb2JqCjw8 Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xMzEx Ci9XaWR0aCAzMAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29s b3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA5IDw5NWE3YTE2YTgwZjY2 NDdhZjE3NDhhZmQ4NDk4ZmY1NzY0OTYwMDAwMDA1NzZhY2QxODFjMmY5MmEz ZmY+XQovTGVuZ3RoIDIzCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVh bQp42mNUUjR2cU1LNRQqyzDxnAAAGdYD+gplbmRzdHJlYW0KZW5kb2JqCgox MzEyIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQov TmFtZSAvSW0xMzEyCi9XaWR0aCAzMAovSGVpZ2h0IDEKL0JpdHNQZXJDb21w b25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxMCA8 OTVhN2ExNmE4MGY2NjQ3YWYxNzQ4YWZkNDM0ZDgzMDAwMDAwMmMzMzU5NTc2 YWNkMTgxYzJmODQ5OGZmOTJhM2ZmPl0KL0xlbmd0aCAyMwovRmlsdGVyIC9G bGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVFISNHYNTRZUKo2wXLUAABcDBAoK ZW5kc3RyZWFtCmVuZG9iagoKMTMxMyAwIG9iago8PAovVHlwZSAvWE9iamVj dAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTMxMwovV2lkdGggMzAKL0hl aWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRl eGVkIC9EZXZpY2VSR0IgOSA8OTVhN2ExNzQ4YWZkNmE4MGY2NjQ3YWYxMmMz MzU5MDAwMDAwNTc2YWNkMTgxYzJmODQ5OGZmOTJhM2ZmPl0KL0xlbmd0aCAy MwovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVDY2MgkNUTI2 Tg3vmDkBABnPBFwKZW5kc3RyZWFtCmVuZG9iagoKMTMxNCAwIG9iago8PAov VHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTMxNAov V2lkdGggMzAKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgOSA8YjRiZmExNzQ4YWZkNmE4 MGY2NjQ3YWYxNTc2YWNkMTgxYzJmMDAwMDAwNTc2NDk2ODQ5OGZmOTJhM2Zm Pl0KL0xlbmd0aCAyMwovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0K eNpjFDI2CUstNjY2ckvtnDkBABxIBJ4KZW5kc3RyZWFtCmVuZG9iagoKMTMx NSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05h bWUgL0ltMTMxNQovV2lkdGggMzAKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9u ZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMTIgPGY3 ZThhYjc2OGFkMjc0OGFmZDZhODBmNjY0N2FmMTE4MWMyZjAwMDAwMDJjMzM1 OTU3NmFjZDg0OThmZjkyYTNmZjgzOTNlNWViZGRhND5dCi9MZW5ndGggMjMK L0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1Qydk2rcHFxMW5L nbVqDwAggQVkCmVuZHN0cmVhbQplbmRvYmoKCjEzMTYgMCBvYmoKPDwKL1R5 cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTEzMTYKL1dp ZHRoIDI4Ci9IZWlnaHQgMwovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNw YWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEyIDw3NjhjYjk4NDk4ZmY3NDhh ZmQ2YTgwZjY0MzRkODMwMDAwMDAxODFjMmY1NzZhY2Q2NTc5YzE5MmEzZmY5 NWE3YTFmN2U4YWI3NjhhZDI+XQovTGVuZ3RoIDQyCi9GaWx0ZXIgL0ZsYXRl RGVjb2RlCj4+CnN0cmVhbQp42mNUMglNLy8vNtYIzZw5YaGQWigQJCuBeLP2 CIJ5SYIyQN5pACbwDnoKZW5kc3RyZWFtCmVuZG9iagoKMTMxNyAwIG9iago8 PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTMx NwovV2lkdGggMjYKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0Nv bG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNiA8OTVhN2ExOTJhM2Zm ODQ5OGZmNjU3OWMxNTc2NDk2NDM0ZDgzODM5M2U1Pl0KL0xlbmd0aCAyMQov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjFDJxCQ0NUVJMcRZU AAAR0wKlCmVuZHN0cmVhbQplbmRvYmoKCjEzMTggMCBvYmoKPDwKL1R5cGUg L1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTEzMTgKL1dpZHRo IDI0Ci9IZWlnaHQgMgovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNl IFsvSW5kZXhlZCAvRGV2aWNlUkdCIDUgPDc2OGNiOTkyYTNmZjg0OThmZmY3 ZThhYjc2OGFkMmViZGRhND5dCi9MZW5ndGggMjQKL0ZpbHRlciAvRmxhdGVE ZWNvZGUKPj4Kc3RyZWFtCnjaYxQUUlJSUhQEAgUTQRgQcgUAGlMCNAplbmRz dHJlYW0KZW5kb2JqCgoxMzE5IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9T dWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xMzE5Ci9XaWR0aCAyNgovSGVpZ2h0 IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQg L0RldmljZVJHQiA1IDxmN2U4YWJkNWQxYTE3NjhhZDI5MmEzZmY4NDk4ZmY2 NTc5YzE+XQovTGVuZ3RoIDE1Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0 cmVhbQp42mMQMoYCl0AGAA5HAkAKZW5kc3RyZWFtCmVuZG9iagoKMTMyMCAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltMTMyMAovV2lkdGggMjgKL0hlaWdodCA2Ci9CaXRzUGVyQ29tcG9uZW50 IDgKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMTYgPGY3ZThh YmViZGRhNGUxZDI5YWQyYzQ5MDc2OGNiOTkyYTNmZjg0OThmZjY1NzljMWMw YjM4NGFlYTM3ODcyNzk3OTc2OGFkMjllOTM2YzkwODc2MzgzOTNlNTZhODBm NjU3NjQ5Nj5dCi9MZW5ndGggODgKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4K c3RyZWFtCnjaTc1LDoAwCARQWpSfoL3/aQXUxFkRXjIDMCZu+z9ExDIHQJGo HT8gNhUsHEkeYXxS52KL8MSy2ZZqttYyq/s1qE51b++/u1YnwLOIkv5FBHsN bljjBGIKZW5kc3RyZWFtCmVuZG9iagoKMTMyMSAwIG9iago8PAovVHlwZSAv WE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTMyMQovV2lkdGgg MjYKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2Ug Wy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8ZjdlOGFiZWJkZGE0ZTFkMjlhZDJj NDkwPl0KL0xlbmd0aCAxNQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl YW0KeNpjjPr//1cIAwAOtwOoCmVuZHN0cmVhbQplbmRvYmoKCjEzMjIgMCBv YmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9J bTEzMjIKL1dpZHRoIDIyCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAy Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEgPGY3ZThhYmVi ZGRhND5dCi9MZW5ndGggMTQKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3Ry ZWFtCnjaYxANDXVgAAADQgEACmVuZHN0cmVhbQplbmRvYmoKCjEzMjMgMCBv YmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9J bTEzMjMKL1dpZHRoIDcKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQK L0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNCA8ZjllOGFiZDNj NDk0Y2RiMWEyYzdhMmFiZWRkZGEzPl0KL0xlbmd0aCAxMgovRmlsdGVyIC9G bGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVDZ2AAABFwCYCmVuZHN0cmVhbQpl bmRvYmoKCjEzMjQgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTEzMjQKL1dpZHRoIDEzCi9IZWlnaHQgMQovQml0 c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNl UkdCIDkgPGY5ZThhYmNkYjFhMmNhODdiMmVlN2ZkMmVjNzljZmViNzBjY2U5 NjZjOGNhNTNhYmNhNmNhZWM3YTJhYj5dCi9MZW5ndGggMTUKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1Q2dk3vZAAABToBjQplbmRzdHJl YW0KZW5kb2JqCgoxMzI1IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0 eXBlIC9JbWFnZQovTmFtZSAvSW0xMzI1Ci9XaWR0aCAxNQovSGVpZ2h0IDEK L0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rl dmljZVJHQiA5IDxjZGIxYTJjYTg3YjJmMDk2ZDllZTgwZDNlZTdmZDJlYjcw Y2NlNzU3YzNlNzRiYmZlNTQyYmNjYTUzYWI+XQovTGVuZ3RoIDE2Ci9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUUlJ2Te9kAAAF1AGeCmVu ZHN0cmVhbQplbmRvYmoKCjEzMjYgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QK L1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTEzMjYKL1dpZHRoIDE5Ci9IZWln aHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhl ZCAvRGV2aWNlUkdCIDggPGY5ZThhYmNhODdiMmVlODBkM2YwOTZkOWY0YjBl M2U5NjZjOGU3NTdjM2U1NDJiY2NhNmNhZT5dCi9MZW5ndGggMTgKL0ZpbHRl ciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1Q2cXE2CiuvYAAACwQCVwpl bmRzdHJlYW0KZW5kb2JqCgoxMzI3IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0 Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xMzI3Ci9XaWR0aCAyMQovSGVp Z2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4 ZWQgL0RldmljZVJHQiAxMCA8ZWRkZGEzY2E4N2IyZWU3ZmQyZjA5NmQ5ZjRi MGUzZjdkMmVlZTk2NmM4ZTc1N2MzZTc0YmJmZTU0MmJjY2E2Y2FlPl0KL0xl bmd0aCAxOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVHZx dXE2q5g5iwEAD1sDFgplbmRzdHJlYW0KZW5kb2JqCgoxMzI4IDAgb2JqCjw8 Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xMzI4 Ci9XaWR0aCAyMwovSGVpZ2h0IDIKL0JpdHNQZXJDb21wb25lbnQgNAovQ29s b3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxMiA8ZjllOGFiY2E2Y2Fl ZWM3OWNmZWU4MGQzZjA5NmQ5ZjRiMGUzZjdkMmVlZWI3MGNjZTk2NmM4ZTc0 YmJmZTU0MmJjY2E4N2IyZTc1N2MzPl0KL0xlbmd0aCAzMwovRmlsdGVyIC9G bGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVHZNS0sNqZi1aiLDDpXQtLS0EI1T q+ZsAABrWAnbCmVuZHN0cmVhbQplbmRvYmoKCjEzMjkgMCBvYmoKPDwKL1R5 cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTEzMjkKL1dp ZHRoIDI1Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNw YWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEyIDxjZGIxYTJlNzU3YzNlOTY2 YzhlZTdmZDJmMDk2ZDlmNGIwZTNjN2EyYWJmN2QyZWVjYTg3YjJjYTZjYWVj YTUzYWJjNjNkYTNlNTQyYmM+XQovTGVuZ3RoIDIxCi9GaWx0ZXIgL0ZsYXRl RGVjb2RlCj4+CnN0cmVhbQp42mNUdk1LLy/tXLX7jBADAB83BO8KZW5kc3Ry ZWFtCmVuZG9iagoKMTMzMCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3Vi dHlwZSAvSW1hZ2UKL05hbWUgL0ltMTMzMAovV2lkdGggMjcKL0hlaWdodCAz Ci9CaXRzUGVyQ29tcG9uZW50IDgKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9E ZXZpY2VSR0IgMTcgPGY5ZThhYmNhNmNhZWU3NTdjM2U5NjZjOGVlN2ZkMmNh ODdiMjY4MjY1NzAwMDAwMDJlMTIyNzZjNDg2M2Y3ZDJlZWM3YTJhYmNkYjFh MmU3NGJiZmViNzBjY2U1NDJiYzhhNDI3OGYwOTZkOT5dCi9MZW5ndGggNjUK L0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaLYxLEoAwCMUKTz6l FfH+lxUds0xmMohxiJqZz4hlL+6uoLFPRvpnbIbYjyM3XYxqu6S73FWl2g9F ygNYNwJXCmVuZHN0cmVhbQplbmRvYmoKCjEzMzEgMCBvYmoKPDwKL1R5cGUg L1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTEzMzEKL1dpZHRo IDI5Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNl IFsvSW5kZXhlZCAvRGV2aWNlUkdCIDE0IDxmOWU4YWJjYTUzYWJlNTQyYmNl NzRiYmZlNzU3YzMyZTEyMjcwMDAwMDBmMDk2ZDlmNGIwZTM5YTZkODI2YzQ4 NjNlZTgwZDNlOTY2YzhlYjcwY2NlYzc5Y2Y+XQovTGVuZ3RoIDIzCi9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUdk2t6ExbvsdZNdXnHgMA KTgFkAplbmRzdHJlYW0KZW5kb2JqCgoxMzMyIDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xMzMyCi9XaWR0aCAy OQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiAxNCA8ZDNjNDk0ZTU0MmJjZTc0YmJmNjgy NjU3MmUxMjI3NmM0ODYzZWU4MGQzZjA5NmQ5OWE2ZDgyMDAwMDAwZWM3OWNm ZTc1N2MzYzYzZGEzZTk2NmM4ZWI3MGNjPl0KL0xlbmd0aCAyMwovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjFFR2Ta+YGbZa0XLO3lcMACRI BZEKZW5kc3RyZWFtCmVuZG9iagoKMTMzMyAwIG9iago8PAovVHlwZSAvWE9i amVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTMzMwovV2lkdGggMjkK L0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9J bmRleGVkIC9EZXZpY2VSR0IgMTIgPGNkYjFhMmU1NDJiY2U3NGJiZmU3NTdj M2ViNzBjY2VjNzljZmVlODBkMzY4MjY1NzAwMDAwMDhhNDI3OGU5NjZjOGE4 M2E4Y2VlN2ZkMj5dCi9MZW5ndGggMjMKL0ZpbHRlciAvRmxhdGVEZWNvZGUK Pj4Kc3RyZWFtCnjaYxRUNglL75i6WLujeEkMAwAi+gUNCmVuZHN0cmVhbQpl bmRvYmoKCjEzMzQgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTEzMzQKL1dpZHRoIDI5Ci9IZWlnaHQgMQovQml0 c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNl UkdCIDEyIDxjN2EyYWJlNTQyYmNlNzRiYmZlNzU3YzNlOTY2YzhlYjcwY2M2 YzQ4NjMwMDAwMDBjYTZjYWUyZTEyMjdjYTUzYWJlYzc5Y2ZlZTdmZDI+XQov TGVuZ3RoIDIzCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMU FDJ2TS9vMZIsX+y6hwEAHMAEZQplbmRzdHJlYW0KZW5kb2JqCgoxMzM1IDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW0xMzM1Ci9XaWR0aCAyOQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg NAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxMiA8YzdhMmFi ZTc0YmJmZTU0MmJjZTc1N2MzNjgyNjU3MDAwMDAwOGE0Mjc4YTgzYThjZTk2 NmM4ZWI3MGNjZWM3OWNmZWU3ZmQyZWU4MGQzPl0KL0xlbmd0aCAyMwovRmls dGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVFISNAkNMxYqDbGYtYcB ABeyA9IKZW5kc3RyZWFtCmVuZG9iagoKMTMzNiAwIG9iago8PAovVHlwZSAv WE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTMzNgovV2lkdGgg MjkKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2Ug Wy9JbmRleGVkIC9EZXZpY2VSR0IgMTEgPGNkYjFhMmU3NTdjM2U3NGJiZmU1 NDJiY2M2M2RhMzJlMTIyNzAwMDAwMGE4M2E4Y2U5NjZjOGViNzBjY2VjNzlj ZmVlN2ZkMj5dCi9MZW5ndGggMjMKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4K c3RyZWFtCnjaY1Q2NglLK1IyDkuRmLWbAQAc0AQ2CmVuZHN0cmVhbQplbmRv YmoKCjEzMzcgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0lt YWdlCi9OYW1lIC9JbTEzMzcKL1dpZHRoIDI5Ci9IZWlnaHQgMQovQml0c1Bl ckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdC IDExIDxkM2M0OTRlNzU3YzNlNzRiYmZlNTQyYmNjNjNkYTMyZTEyMjcwMDAw MDBlOTY2YzhlYjcwY2NlYzc5Y2ZlZTdmZDJlZTgwZDM+XQovTGVuZ3RoIDIz Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMUMnZNCzE2NkkL rJi1iwEAHIEEYwplbmRzdHJlYW0KZW5kb2JqCgoxMzM4IDAgb2JqCjw8Ci9U eXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xMzM4Ci9X aWR0aCAyOQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JT cGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxMyA8ZjllOGFiZTk2NmM4ZTc1 N2MzZTc0YmJmYzYzZGEzMmUxMjI3MDAwMDAwNjgyNjU3ZTU0MmJjOGE0Mjc4 ZWI3MGNjZWM3OWNmZWU3ZmQyZWRkZGEzPl0KL0xlbmd0aCAyMwovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVDIJS+/o6GhPm7j6zOkLACvL Bz0KZW5kc3RyZWFtCmVuZG9iagoKMTMzOSAwIG9iago8PAovVHlwZSAvWE9i amVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTMzOQovV2lkdGggMjcK L0hlaWdodCAzCi9CaXRzUGVyQ29tcG9uZW50IDgKL0NvbG9yU3BhY2UgWy9J bmRleGVkIC9EZXZpY2VSR0IgMTYgPGNhODdiMmU5NjZjOGU3NTdjMzY4MjY1 NzAwMDAwMDJlMTIyN2E4M2E4Y2M2M2RhM2U1NDJiY2U3NGJiZmNhNTNhYmVi NzBjY2VjNzljZmVlN2ZkMmVlODBkM2NkYjFhMmY5ZThhYj5dCi9MZW5ndGgg NjMKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaPczRDoAwCENR KKDOgtv/f60jJt635iQVBcw9ju68RrjfZNZTMqm655cNhIdmS84lpP0E7IOs Fq4XUJYCKwplbmRzdHJlYW0KZW5kb2JqCgoxMzQwIDAgb2JqCjw8Ci9UeXBl IC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xMzQwCi9XaWR0 aCAyNQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFj ZSBbL0luZGV4ZWQgL0RldmljZVJHQiA4IDxjZGIxYTJlYzc5Y2ZlYjcwY2Nj YTZjYWVjYTUzYWJhODNhOGNlOTY2YzhlZTdmZDJlZTgwZDM+XQovTGVuZ3Ro IDIxCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMUMnEJDXVL Da5oF2IAABT7A0UKZW5kc3RyZWFtCmVuZG9iagoKMTM0MSAwIG9iago8PAov VHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTM0MQov V2lkdGggMjMKL0hlaWdodCAyCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNyA8Y2E4N2IyZWU3ZmQyZWM3 OWNmZWI3MGNjZWU4MGQzZjllOGFiY2E2Y2FlZWRkZGEzPl0KL0xlbmd0aCAy OQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVDIGAUURQWWG AEEhJSUlRRFHZbMCAClWA6QKZW5kc3RyZWFtCmVuZG9iagoKMTM0MiAwIG9i ago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0lt MTM0MgovV2lkdGggMjUKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQK L0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgOCA8ZjllOGFiZTFk MjliY2E4N2IyZWU4MGQzZWU3ZmQyZWM3OWNmZWI3MGNjZTk2NmM4Y2E2Y2Fl Pl0KL0xlbmd0aCAyMQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0K eNpjEDI2cXFxNnENqxBgAAAQ6AKcCmVuZHN0cmVhbQplbmRvYmoKCjEzNDMg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTEzNDMKL1dpZHRoIDI3Ci9IZWlnaHQgNgovQml0c1BlckNvbXBvbmVu dCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDE0IDxmOWU4 YWJlZGRkYTNlMWQyOWJkM2M0OTRjYTg3YjJlZTdmZDJlZTgwZDNlYzc5Y2Zl YjcwY2NlOTY2YzhjYTZjYWViZGIxODJhY2EwNzY5NDg5Njc5YTZkODI+XQov TGVuZ3RoIDg3Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMQ MglNSw0LLe+cZSTAwKi851Z5eXlF56w3mxUZGK3P3n3V0TFz1tu7pw3BvLv3 3r27exfEY1DefeYuCNw5vVmBAajReveZM2dO7zZWZGAAAG9IKR4KZW5kc3Ry ZWFtCmVuZG9iagoKMTM0NCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3Vi dHlwZSAvSW1hZ2UKL05hbWUgL0ltMTM0NAovV2lkdGggMjUKL0hlaWdodCAx Ci9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9E ZXZpY2VSR0IgMyA8ZjllOGFiZWRkZGEzZTFkMjliZDNjNDk0Pl0KL0xlbmd0 aCAxNQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjjPr//2UA AwAOfAOTCmVuZHN0cmVhbQplbmRvYmoKCjEzNDUgMCBvYmoKPDwKL1R5cGUg L1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTEzNDUKL1dpZHRo IDIxCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNl IFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEgPGY5ZThhYmVkZGRhMz5dCi9MZW5n dGggMTQKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYxANDWVg AAACwgDACmVuZHN0cmVhbQplbmRvYmoKCjEzNDYgMCBvYmoKPDwKL1R5cGUg L1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTEzNDYKL1dpZHRo IDgKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2Ug Wy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8ZWNkZGE0ZDFjNDkzYjFhODllYzRi OThkPl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl YW0KeNqTWgMAAOIAxwplbmRzdHJlYW0KZW5kb2JqCgoxMzQ3IDAgb2JqCjw8 Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xMzQ3 Ci9XaWR0aCAxNAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29s b3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxMCA8ZjhlOGFiYjFhODll YTY4NWI0YjU3ZmNlY2Y4YmVlY2M4NGVjYzc3YWVhYmY3MWUyYjU2OGQ3OWY1 ZGJkOTk3NmFhPl0KL0xlbmd0aCAxNQovRmlsdGVyIC9GbGF0ZURlY29kZQo+ PgpzdHJlYW0KeNpjVHYJq5glAAAGOAHhCmVuZHN0cmVhbQplbmRvYmoKCjEz NDggMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9O YW1lIC9JbTEzNDgKL1dpZHRoIDE2Ci9IZWlnaHQgMQovQml0c1BlckNvbXBv bmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDggPGIx YTg5ZWI1N2ZjZWQ1OWJlZmNmOGJlZWM3N2FlYWJmNzFlMmI1NjhkN2FiNWNj ZTlmNWRiZD5dCi9MZW5ndGggMTYKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4K c3RyZWFtCnjaY1RSUjIJS28AAAWUAdkKZW5kc3RyZWFtCmVuZG9iagoKMTM0 OSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05h bWUgL0ltMTM0OQovV2lkdGggMjAKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9u ZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgOSA8Zjhl OGFiYTY4NWI0Y2Y4YmVlZDU5YmVmZGRhZGYzYzc3YWVhYmY3MWUyYjU2OGQ3 YWI1Y2NlOTk3NmFhPl0KL0xlbmd0aCAxOAovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNpjVHZxcTEKq+iYAAAMPQMJCmVuZHN0cmVhbQplbmRv YmoKCjEzNTAgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0lt YWdlCi9OYW1lIC9JbTEzNTAKL1dpZHRoIDIyCi9IZWlnaHQgMQovQml0c1Bl ckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdC IDExIDxlY2RkYTRhNjg1YjRjZjhiZWVkNTliZWZkZGFkZjNlNWMwZjZjYzg0 ZWNjNzdhZWFiZjcxZTJiNTY4ZDdhYjVjY2U5OTc2YWE+XQovTGVuZ3RoIDE5 Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUdg0NdTGrmLVq AwARNAP6CmVuZHN0cmVhbQplbmRvYmoKCjEzNTEgMCBvYmoKPDwKL1R5cGUg L1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTEzNTEKL1dpZHRo IDI0Ci9IZWlnaHQgMgovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNl IFsvSW5kZXhlZCAvRGV2aWNlUkdCIDExIDxmOGU4YWI5OTc2YWFjYzg0ZWNk NTliZWZkZGFkZjNlNWMwZjZlZmRiZjljZjhiZWVjNzdhZWFiZjcxZTJiNTY4 ZDdhYjVjY2U+XQovTGVuZ3RoIDMxCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+ CnN0cmVhbQp42mNUdg1LS3WumLV7t4CEsmtaWmqIEZC9EABkkwlOCmVuZHN0 cmVhbQplbmRvYmoKCjEzNTIgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1 YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTEzNTIKL1dpZHRoIDI2Ci9IZWlnaHQg MQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAv RGV2aWNlUkdCIDEzIDxiMWE4OWViNTY4ZDdjNzdhZWFjZjhiZWVkNTliZWZi NTdmY2U5OTc2YWFlZmRiZjllNWMwZjZkZGFkZjM3NDQ0OGE5ZjVkYmRhYjVj Y2ViZjcxZTI+XQovTGVuZ3RoIDIxCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+ CnN0cmVhbQp42mNUdk1jL6+YIrVqz8ELABsYBWsKZW5kc3RyZWFtCmVuZG9i agoKMTM1MyAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1h Z2UKL05hbWUgL0ltMTM1MwovV2lkdGggMjgKL0hlaWdodCAzCi9CaXRzUGVy Q29tcG9uZW50IDgKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0Ig MjAgPGY4ZThhYjlmNWRiZGI1NjhkN2M3N2FlYWI1N2ZjZTQ2MmM1MTAwMDAw MGM0YjBjZWVmZGJmOWU1YzBmNmQ1OWJlZjFjMTEyMTc0NDQ4YWFiNWNjZWJm NzFlMmIxYTg5ZWRkYWRmMzhmNTNhYTk5NzZhYTdkNmE3Y2E2ODViND5dCi9M ZW5ndGggNjgKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaHYkJ EsAgCAMVBUTwqO3/39q0zITZZFOmUllwrK1Z/9Fj0Kxp4aO7I2r7U0C5aJZ1 BoVIdMV624HJA8hwzwtkwAKUCmVuZHN0cmVhbQplbmRvYmoKCjEzNTQgMCBv YmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9J bTEzNTQKL1dpZHRoIDMwCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0 Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDE0IDxmOGU4YWI5 ZjVkYmRhYjVjY2ViNTY4ZDc0NjJjNTEwMDAwMDBiNTdmY2VkNTliZWZkZGFk ZjNhNjg1YjQ4ZjUzYWE3NDQ0OGFiZjcxZTJjNzdhZWFlY2RkYTQ+XQovTGVu Z3RoIDIzCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUdg2r mBrSErpYaffis3kAKUsGWAplbmRzdHJlYW0KZW5kb2JqCgoxMzU1IDAgb2Jq Cjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0x MzU1Ci9XaWR0aCAzMAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAov Q29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxMyA8ZDFjNDkzYWI1 Y2NlOGY1M2FhNzQ0NDhhY2M4NGVjY2Y4YmVlZDU5YmVmN2Q2YTdjMDAwMDAw MWMxMTIxYjU2OGQ3OWY1ZGJkYmY3MWUyYzc3YWVhPl0KL0xlbmd0aCAyMwov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjFFRWCatozuxcbSS4 5ooDACGzBUsKZW5kc3RyZWFtCmVuZG9iagoKMTM1NiAwIG9iago8PAovVHlw ZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTM1NgovV2lk dGggMzAKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3Bh Y2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMTMgPGIxYTg5ZWFiNWNjZWI1Njhk N2JmNzFlMjlmNWRiZDc0NDQ4YTFjMTEyMTAwMDAwMGI1N2ZjZWNjODRlYzQ2 MmM1MThmNTNhYWM3N2FlYWNmOGJlZT5dCi9MZW5ndGggMjMKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYxQUMnZNz5hWtrw8W/nkBQAhnQW9 CmVuZHN0cmVhbQplbmRvYmoKCjEzNTcgMCBvYmoKPDwKL1R5cGUgL1hPYmpl Y3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTEzNTcKL1dpZHRoIDMwCi9I ZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5k ZXhlZCAvRGV2aWNlUkdCIDEwIDxiMWE4OWVhYjVjY2ViNTY4ZDc4ZjUzYWEw MDAwMDA3NDQ0OGFjNzdhZWE5ZjVkYmRiZjcxZTJjYzg0ZWNjZjhiZWU+XQov TGVuZ3RoIDIxCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMU FFJ2cQlTcQGCiswFABYGA9sKZW5kc3RyZWFtCmVuZG9iagoKMTM1OCAwIG9i ago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0lt MTM1OAovV2lkdGggMzAKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQK L0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMTAgPGIxYTg5ZWI1 NjhkN2FiNWNjZThmNTNhYTFjMTEyMTAwMDAwMDc0NDQ4YTQ2MmM1MWM3N2Fl YWNjODRlY2NmOGJlZT5dCi9MZW5ndGggMjMKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjaY1RSUnYJDVYNdUsPrZi1AAAaMwSDCmVuZHN0cmVh bQplbmRvYmoKCjEzNTkgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5 cGUgL0ltYWdlCi9OYW1lIC9JbTEzNTkKL1dpZHRoIDMwCi9IZWlnaHQgMQov Qml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2 aWNlUkdCIDEwIDxiMWE4OWViNTY4ZDdhYjVjY2U5ZjVkYmQ0NjJjNTEwMDAw MDAxYzExMjE4ZjUzYWFjNzdhZWFjYzg0ZWNjZjhiZWU+XQovTGVuZ3RoIDIz Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUUlJSdg0zDS1S Ts2YtQAAGHsETAplbmRzdHJlYW0KZW5kb2JqCgoxMzYwIDAgb2JqCjw8Ci9U eXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xMzYwCi9X aWR0aCAzMAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JT cGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA5IDxkMWM0OTNiNTY4ZDdhYjVj Y2U4ZjUzYWE3NDQ0OGExYzExMjEwMDAwMDBiZjcxZTJjZjhiZWVjYzg0ZWM+ XQovTGVuZ3RoIDIzCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4 2mMUMjFSUk0zTVUSDAvvmAAAFh0DuQplbmRzdHJlYW0KZW5kb2JqCgoxMzYx IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFt ZSAvSW0xMzYxCi9XaWR0aCAzMAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25l bnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxMiA8Zjhl OGFiYjU2OGQ3YmY3MWUyMWMxMTIxMDAwMDAwYWI1Y2NlOWY1ZGJkOGY1M2Fh NDYyYzUxY2M4NGVjY2Y4YmVlYjU3ZmNlZWNkZGE0Pl0KL0xlbmd0aCAyMwov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVDQxDU12qXAOFDSx XLUHABxQBHgKZW5kc3RyZWFtCmVuZG9iagoKMTM2MiAwIG9iago8PAovVHlw ZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTM2MgovV2lk dGggMjgKL0hlaWdodCAzCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3Bh Y2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMTUgPGE2ODViNGJmNzFlMjQ2MmM1 MTAwMDAwMDc0NDQ4YWFiNWNjZTFjMTEyMWI1NjhkN2NmOGJlZWIxYTg5ZWM3 N2FlYThmNTNhYTlmNWRiZGI1N2ZjZWNjODRlY2Y4ZThhYj5dCi9MZW5ndGgg NTEKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYxQydg0xTnU2 KXQ26miYtdrYSNnY/ZixkrFtx8u/q5yNjY3KpZONzXb03QcAHwsPJQplbmRz dHJlYW0KZW5kb2JqCgoxMzYzIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9T dWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xMzYzCi9XaWR0aCAyNgovSGVpZ2h0 IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQg L0RldmljZVJHQiAxMCA8YzRiOThkY2M4NGVjYzc3YWVhYjU2OGQ3NzQ0NDhh NDYyYzUxOWY1ZGJkYmY3MWUyYjU3ZmNlY2Y4YmVlYjFhODllPl0KL0xlbmd0 aCAyMQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjFDIJdSsv V3YN6ZyoBQAWUQPRCmVuZHN0cmVhbQplbmRvYmoKCjEzNjQgMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTEzNjQK L1dpZHRoIDI0Ci9IZWlnaHQgMgovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xv clNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDYgPGE2ODViNGNmOGJlZWNj ODRlY2M3N2FlYWY4ZThhYjk5NzZhYWVjZGRhND5dCi9MZW5ndGggMzAKL0Zp bHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1RSNjY2NlISFBQycBAU UlJSUgQylcMAJ0UDLwplbmRzdHJlYW0KZW5kb2JqCgoxMzY1IDAgb2JqCjw8 Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xMzY1 Ci9XaWR0aCAyNgovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29s b3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA2IDxmOGU4YWJkZmQxOWFh Njg1YjRjZjhiZWVjYzg0ZWNjNzdhZWE5OTc2YWE+XQovTGVuZ3RoIDE2Ci9G aWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMQMoYAl9BEBgAO3gJy CmVuZHN0cmVhbQplbmRvYmoKCjEzNjYgMCBvYmoKPDwKL1R5cGUgL1hPYmpl Y3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTEzNjYKL1dpZHRoIDI4Ci9I ZWlnaHQgNgovQml0c1BlckNvbXBvbmVudCA4Ci9Db2xvclNwYWNlIFsvSW5k ZXhlZCAvRGV2aWNlUkdCIDE4IDxmOGU4YWJlY2RkYTRkZmQxOWFkMWM0OTNh Njg1YjRjZjhiZWVjYzg0ZWNjNzdhZWFiZjcxZTI5OTc2YWFjNGI5OGRiMWE1 Nzk4OTdiODFiNTdmY2U5ZjVkYmQ5YzkxNmI4ZTg0NjI3ZDZhN2NiNTY4ZDc+ XQovTGVuZ3RoIDkyCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4 2kWNSw6AMAgFKWg/oNJ6/8P6StM4K2AygSixHOdPzqXUppyIoNTsuvMG5rnM QiZR895Hq2VS3zZ6d1NJq3NI6GBO7qsjRgi7/LzDIGOi+Ciq8BssEtUHp7MF cgplbmRzdHJlYW0KZW5kb2JqCgoxMzY3IDAgb2JqCjw8Ci9UeXBlIC9YT2Jq ZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xMzY3Ci9XaWR0aCAyNgov SGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0lu ZGV4ZWQgL0RldmljZVJHQiAzIDxmOGU4YWJlY2RkYTRkZmQxOWFkMWM0OTM+ XQovTGVuZ3RoIDE1Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4 2mOM+v//VwgDAA63A6gKZW5kc3RyZWFtCmVuZG9iagoKMTM2OCAwIG9iago8 PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTM2 OAovV2lkdGggMjIKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0Nv bG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8ZjhlOGFiZWNkZGE0 Pl0KL0xlbmd0aCAxNAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0K eNpjEA0NdWAAAANCAQAKZW5kc3RyZWFtCmVuZG9iagoKMTM2OSAwIG9iago8 PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTM2 OQovV2lkdGggOAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29s b3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDxmOGU5YWNkNmUxYjFj OGRiYjU+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0 cmVhbQp42pNaAgAA2gC/CmVuZHN0cmVhbQplbmRvYmoKCjEzNzAgMCBvYmoK PDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTEz NzAKL1dpZHRoIDE0Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9D b2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDggPGY4ZTlhY2M4ZGJi NWMzZDVjYWQzZDhkYmQ4ZGNlMGNkZDNkNmM2Y2RkMWJmYzZjYWI3Y2JiZT5d Ci9MZW5ndGggMTUKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja Y1R2MQ2rEAAABQoBfAplbmRzdHJlYW0KZW5kb2JqCgoxMzcxIDAgb2JqCjw8 Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xMzcx Ci9XaWR0aCAxNgovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29s b3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA3IDxjOGRiYjVkM2Q4ZGJk ZWUxZTRkOGRjZTBjZGQzZDZjNmNkZDFiZmM2Y2FiY2M0Yzk+XQovTGVuZ3Ro IDE2Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUUlIydE0v AAAFRQG1CmVuZHN0cmVhbQplbmRvYmoKCjEzNzIgMCBvYmoKPDwKL1R5cGUg L1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTEzNzIKL1dpZHRo IDIwCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNl IFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEwIDxmOGU5YWNjM2Q1Y2FkOGRjZTBk ZWUxZTRlNWU5ZWFkM2Q4ZGJjZGQzZDZjM2NhY2ViZmM2Y2FiY2M0YzliN2Ni YmU+XQovTGVuZ3RoIDE4Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVh bQp42mNUdnFxMQqrmLkAAAxvAyoKZW5kc3RyZWFtCmVuZG9iagoKMTM3MyAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltMTM3MwovV2lkdGggMjIKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50 IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgOSA8ZjhlOWFj YzNkNWNhZDhkY2UwZGVlMWU0ZTVlOWVhZWRlZmYxY2RkM2Q2YzZjZGQxYmZj NmNhYmNjNGM5Pl0KL0xlbmd0aCAxOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+ PgpzdHJlYW0KeNpjVHYNDXUxSu+c2QAAEFcDkwplbmRzdHJlYW0KZW5kb2Jq CgoxMzc0IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFn ZQovTmFtZSAvSW0xMzc0Ci9XaWR0aCAyNAovSGVpZ2h0IDIKL0JpdHNQZXJD b21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAx MiA8ZjhlOWFjYzNkNWNhZDNkOGRiZGVlMWU0ZTVlOWVhZWRlZmYxZjZmN2Y4 ZDhkY2UwY2RkM2Q2YzNjYWNlYmNjNGM5YmZjNmNhYjdjYmJlPl0KL0xlbmd0 aCAzMwovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVHYNS0t1 KepctXrCCWXXtLS0EKPOXasnAgBvoAoWCmVuZHN0cmVhbQplbmRvYmoKCjEz NzUgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9O YW1lIC9JbTEzNzUKL1dpZHRoIDI2Ci9IZWlnaHQgMQovQml0c1BlckNvbXBv bmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDE0IDxj OGRiYjVjNmNkZDFjZGQzZDZkOGRjZTBkZWUxZTQ5ZWE1YTFhYWIwYjBmNmY3 ZjhlZGVmZjFlNWU5ZWE4MTg1ODhiNGJhYmRiY2M0YzliZmM2Y2FjM2NhY2U+ XQovTGVuZ3RoIDIxCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4 2mNUdgpNKa+YkrVqzz0FAB6sBXEKZW5kc3RyZWFtCmVuZG9iagoKMTM3NiAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltMTM3NgovV2lkdGggMjgKL0hlaWdodCAzCi9CaXRzUGVyQ29tcG9uZW50 IDgKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMTkgPGY4ZTlh Y2JjYzRjOWM2Y2RkMWNkZDNkNmQzZDhkYjgxODU4ODIwMjEyMjAwMDAwMGY2 ZjdmOGVkZWZmMTRkNGY1MGJmYzZjYWMzY2FjZWM4ZGJiNTllYTVhMWU1ZTll YWI3Y2JiZWI0YmFiZGRlZTFlNGMzZDVjYT5dCi9MZW5ndGggNjcKL0ZpbHRl ciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaLYpbEoAgDAPBtpQ+ANH739Xo +JHM7iSlHsTSVLVJ78auH0YSlYGWV5Fpy3+UJB5nzQ2NC4dmgZob6NjuB2Ae AoQKZW5kc3RyZWFtCmVuZG9iagoKMTM3NyAwIG9iago8PAovVHlwZSAvWE9i amVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTM3NwovV2lkdGggMzAK L0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9J bmRleGVkIC9EZXZpY2VSR0IgMTIgPGY4ZTlhY2JjYzRjOWJmYzZjYTgxODU4 ODAwMDAwMGU1ZTllYWRlZTFlNDIwMjEyMjllYTVhMTRkNGY1MGM2Y2RkMWNk ZDNkNmQzZDhkYj5dCi9MZW5ndGggMjMKL0ZpbHRlciAvRmxhdGVEZWNvZGUK Pj4Kc3RyZWFtCnjaYxQycQ5Nd89wmaVYUrTnAAAfyQVXCmVuZHN0cmVhbQpl bmRvYmoKCjEzNzggMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTEzNzgKL1dpZHRoIDMwCi9IZWlnaHQgMQovQml0 c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNl UkdCIDE0IDxkNmUxYjFiY2M0YzliZmM2Y2FhYWIwYjA4MTg1ODhkZWUxZTRj NmNkZDEyMDIxMjIwMDAwMDBiNGJhYmQ0ZDRmNTBjM2NhY2VjZGQzZDZkM2Q4 ZGJkOGRjZTA+XQovTGVuZ3RoIDIzCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+ CnN0cmVhbQp42mMUMnEKTW+P7FgtWbHs7AMAJI0GPQplbmRzdHJlYW0KZW5k b2JqCgoxMzc5IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9J bWFnZQovTmFtZSAvSW0xMzc5Ci9XaWR0aCAzMAovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiAxMiA8YzhkYmI1YmNjNGM5YmZjNmNhYzNjYWNlY2RkM2Q2YWFiMGIwOWVh NWExNGQ0ZjUwMDAwMDAwODE4NTg4ZDhkY2UwZDNkOGRiMjAyMTIyPl0KL0xl bmd0aCAyMwovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjFFR2 CavoXF3RPqdjivcCACceBh4KZW5kc3RyZWFtCmVuZG9iagoKMTM4MCAwIG9i ago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0lt MTM4MAovV2lkdGggMzAKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQK L0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMTEgPGM4ZGJiNWJm YzZjYWJjYzRjOWMzY2FjZWM2Y2RkMTIwMjEyMjAwMDAwMDRkNGY1MGQzZDhk YmNkZDNkNmI0YmFiZGQ4ZGNlMD5dCi9MZW5ndGggMjMKL0ZpbHRlciAvRmxh dGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1RSNAlLq5i5NC0t3bNjAwAj4QWfCmVu ZHN0cmVhbQplbmRvYmoKCjEzODEgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QK L1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTEzODEKL1dpZHRoIDMwCi9IZWln aHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhl ZCAvRGV2aWNlUkdCIDkgPGM4ZGJiNWJmYzZjYWJjYzRjOTRkNGY1MDIwMjEy MjAwMDAwMGM2Y2RkMWNkZDNkNmQzZDhkYmQ4ZGNlMD5dCi9MZW5ndGggMjMK L0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1RSEjQJDU4yDXEN Ne+cAAAYaAQICmVuZHN0cmVhbQplbmRvYmoKCjEzODIgMCBvYmoKPDwKL1R5 cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTEzODIKL1dp ZHRoIDMwCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNw YWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDExIDxjOGRiYjVjM2NhY2ViZmM2 Y2FiY2M0YzliNGJhYmQ4MTg1ODgwMDAwMDBhYWIwYjAyMDIxMjI5ZWE1YTFk M2Q4ZGJkOGRjZTA+XQovTGVuZ3RoIDIzCi9GaWx0ZXIgL0ZsYXRlRGVjb2Rl Cj4+CnN0cmVhbQp42mNUNjY2CUsrTWu3bEtfvQEAID0FXgplbmRzdHJlYW0K ZW5kb2JqCgoxMzgzIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBl IC9JbWFnZQovTmFtZSAvSW0xMzgzCi9XaWR0aCAzMAovSGVpZ2h0IDEKL0Jp dHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rldmlj ZVJHQiAxMCA8ZDZlMWIxYzZjZGQxYzNjYWNlYmZjNmNhOWVhNWExODE4NTg4 YjRiYWJkYmNjNGM5NGQ0ZjUwMDAwMDAwZDhkY2UwPl0KL0xlbmd0aCAyMwov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVHYNK6+YGTEz2Khz 6qoFAChxBiYKZW5kc3RyZWFtCmVuZG9iagoKMTM4NCAwIG9iago8PAovVHlw ZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTM4NAovV2lk dGggMzAKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3Bh Y2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgOSA8ZjhlOWFjYzZjZGQxYzNjYWNl NGQ0ZjUwMDAwMDAwOWVhNWExYmNjNGM5ODE4NTg4ZDhkY2UwZDNkOGRiPl0K L0xlbmd0aCAyMwovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpj FDJxTUt2KXYpEjRx75gAAB1YBGcKZW5kc3RyZWFtCmVuZG9iagoKMTM4NSAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltMTM4NQovV2lkdGggMjgKL0hlaWdodCAzCi9CaXRzUGVyQ29tcG9uZW50 IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMTUgPGMzZDVj YWNkZDNkNmM2Y2RkMTgxODU4ODAwMDAwMDRkNGY1MGJjYzRjOTllYTVhMTIw MjEyMmI0YmFiZGQ4ZGNlMGM4ZGJiNWQzZDhkYmJmYzZjYWY4ZTlhY2FhYjBi MD5dCi9MZW5ndGggNTEKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFt CnjaY1R2CUtvcQ9xTZrhMmvBHtkWjwiX2BKX1hbXVacfHvzh4uI6SbnFxSVw jRwAYWYRXgplbmRzdHJlYW0KZW5kb2JqCgoxMzg2IDAgb2JqCjw8Ci9UeXBl IC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xMzg2Ci9XaWR0 aCAyNgovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFj ZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxMCA8ZDZlMWIxZDNkOGRiYzNjYWNl ODE4NTg4NGQ0ZjUwYzZjZGQxY2RkM2Q2YjRiYWJkOWVhNWExZDhkY2UwYzhk YmI1Pl0KL0xlbmd0aCAyMQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl YW0KeNpjFFR2cQ5LSzdx6ZwoBQAUOQOMCmVuZHN0cmVhbQplbmRvYmoKCjEz ODcgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9O YW1lIC9JbTEzODcKL1dpZHRoIDI0Ci9IZWlnaHQgMgovQml0c1BlckNvbXBv bmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDQgPGMz ZDVjYWQ4ZGNlMGQzZDhkYmNkZDNkNmY4ZTlhYz5dCi9MZW5ndGggMjkKL0Zp bHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1RSUjZWUlISFBQycBIU ArIUgUxlFgAjQgKtCmVuZHN0cmVhbQplbmRvYmoKCjEzODggMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTEzODgK L1dpZHRoIDI2Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xv clNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDUgPGY4ZTlhY2VjZGRhM2Qz ZDhkYmQ4ZGNlMGNkZDNkNmMzY2FjZT5dCi9MZW5ndGggMTYKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYxAyhgAllUAGAA2jAg8KZW5kc3Ry ZWFtCmVuZG9iagoKMTM4OSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3Vi dHlwZSAvSW1hZ2UKL05hbWUgL0ltMTM4OQovV2lkdGggMjgKL0hlaWdodCA2 Ci9CaXRzUGVyQ29tcG9uZW50IDgKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9E ZXZpY2VSR0IgMTkgPGY4ZTlhY2VjZGRhM2UyZDM5YmQ0YzY5MmMzZDVjYWQ4 ZGNlMGQzZDhkYmNkZDNkNmI3Y2JiZWM2Yjk4OGJhYWQ4MGFkYTE3NmFhYjBi MGMzY2FjZTllYTVhMTljOTY3MjkxODg2NWJmYzZjYWM2Y2RkMWJjYzRjOT5d Ci9MZW5ndGggOTUKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja RY5REoAgCERRSloosbr/XUNt6n0x+wZYopR5WX9KKSIb50QUCmq7lA+Ro5qi y8Rq3lo9ZXLdtTU35eHQXeA1eEdDd5Q5jrrPsOceW+BMND4yoGovqsCs8gCb tAVRCmVuZHN0cmVhbQplbmRvYmoKCjEzOTAgMCBvYmoKPDwKL1R5cGUgL1hP YmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTEzOTAKL1dpZHRoIDI2 Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsv SW5kZXhlZCAvRGV2aWNlUkdCIDMgPGY4ZTlhY2VjZGRhM2UyZDM5YmQ0YzY5 Mj5dCi9MZW5ndGggMTUKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFt CnjaY4z+//9fCAMADskDrQplbmRzdHJlYW0KZW5kb2JqCgoxMzkxIDAgb2Jq Cjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0x MzkxCi9XaWR0aCAyMgovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgov Q29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxIDxmOGU5YWNlY2Rk YTM+XQovTGVuZ3RoIDE0Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVh bQp42mMQDQ11YAAAA0IBAAplbmRzdHJlYW0KZW5kb2JqCgoxMzkyIDAgb2Jq Cjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0x MzkyCi9XaWR0aCA4Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9D b2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPGY5ZThhOWRmZDY5 NGQxY2U3YT5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4K c3RyZWFtCnjak1oCAADaAL8KZW5kc3RyZWFtCmVuZG9iagoKMTM5MyAwIG9i ago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0lt MTM5MwovV2lkdGggMTQKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQK L0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgOSA8ZjllOGE5ZDFj ZTdhZDViYzU0ZTFiNjNlZjNiYTJhZWZiNjI2ZWFiMTIxZTNhYTFiZGJhMjEz Y2JhOTNiPl0KL0xlbmd0aCAxNQovRmlsdGVyIC9GbGF0ZURlY29kZQo+Pgpz dHJlYW0KeNpjVHYNq+gUAAAGGwHRCmVuZHN0cmVhbQplbmRvYmoKCjEzOTQg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTEzOTQKL1dpZHRoIDE2Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVu dCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDkgPGQxY2U3 YWQ1YmM1NGZjYzQzNGYzYmEyYWVhYjEyMWUzYWExYmRiYTIxM2QzOWIwZWNm OTYwNmNiYTkzYj5dCi9MZW5ndGggMTYKL0ZpbHRlciAvRmxhdGVEZWNvZGUK Pj4Kc3RyZWFtCnjaY1RSUjIJq5gAAAXGAfoKZW5kc3RyZWFtCmVuZG9iagoK MTM5NSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UK L05hbWUgL0ltMTM5NQovV2lkdGggMjAKL0hlaWdodCAxCi9CaXRzUGVyQ29t cG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMTEg PGY5ZThhOWQ1YmM1NGYzYmEyYWZjYzQzNGZmY2U1MmZmZDk3YWVhYjEyMWUz YWExYmRiYTIxM2QzOWIwZWNmOTYwNmNiYTkzYj5dCi9MZW5ndGggMTgKL0Zp bHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1R2CXExSu9ctQEADYgD fQplbmRzdHJlYW0KZW5kb2JqCgoxMzk2IDAgb2JqCjw8Ci9UeXBlIC9YT2Jq ZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xMzk2Ci9XaWR0aCAyMgov SGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0lu ZGV4ZWQgL0RldmljZVJHQiAxMSA8ZjllOGE5ZDViYzU0ZjNiYTJhZmNjNDM0 ZmZjZTUyZmZkOTdhZWZiNjI2ZTNhYTFiZGJhMjEzZDM5YjBlY2Y5NjA2Y2Jh OTNiPl0KL0xlbmd0aCAxOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl YW0KeNpjVHYNDQ0xq5i1agMAEZQECgplbmRzdHJlYW0KZW5kb2JqCgoxMzk3 IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFt ZSAvSW0xMzk3Ci9XaWR0aCAyMwovSGVpZ2h0IDIKL0JpdHNQZXJDb21wb25l bnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxMyA8ZDVi YzU0ZWZiNjI2ZmNjNDM0ZmZjZTUyZmZkOTdhZjllOGE5ZjNiYTJhZWFiMTIx ZTNhYTFiZGJhMjEzY2Y5NjA2ZDM5YjBlY2JhOTNiZmZlZWM0Pl0KL0xlbmd0 aCAzMwovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVHYJDXVW q5i1ak9Ao7Lr3ashRhKzV+1kAABqzQl7CmVuZHN0cmVhbQplbmRvYmoKCjEz OTggMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9O YW1lIC9JbTEzOTgKL1dpZHRoIDI1Ci9IZWlnaHQgMQovQml0c1BlckNvbXBv bmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDE1IDxk MWNlN2FlM2FhMWJmM2JhMmFmY2M0MzRmZmNlNTJmZmQ5N2FiYmFkN2Q5YTkw NmFjOWJjOGNmZmVlYzRmOWU4YTllMWI2M2VkMzliMGViNjg3MGZjZjk2MDZk YmEyMTM+XQovTGVuZ3RoIDIxCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0 cmVhbQp42mNUdk2vmBV95u7dex8ZACVJBpMKZW5kc3RyZWFtCmVuZG9iagoK MTM5OSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UK L05hbWUgL0ltMTM5OQovV2lkdGggMjcKL0hlaWdodCAzCi9CaXRzUGVyQ29t cG9uZW50IDgKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMjIg PGY5ZThhOWNiYTkzYmUzYWExYmVmYjYyNmZjYzQzNGZmY2U1MmJiYWQ3ZDAw MDAwMDY2NGYxNWZmZWVjNGZmZDk3YTQ0MzMwODk1NmUwZGRiYTIxM2UxYjYz ZWQxY2U3YWQzOWIwZTFjMTUwNGVhYjEyMWNmOTYwNmYzYmEyYWI2ODcwZmQ1 YmM1ND5dCi9MZW5ndGggNjQKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3Ry ZWFtCnjaRclHEoAwDARBWYQVi3Ai/P+pWMWBOU5L0mleVgC2CXd8+aFZSg2K ZUK2n3pJp/bLMZ6RucE8ugc9L2C8AtIKZW5kc3RyZWFtCmVuZG9iagoKMTQw MCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05h bWUgL0ltMTQwMAovV2lkdGggMjkKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9u ZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMTQgPGY5 ZThhOWQzOWIwZWNmOTYwNmRiYTIxM2UzYWExYjFjMTUwNDk1NmUwZDAwMDAw MDY2NGYxNWZmZDk3YWZmY2U1MmNiYTkzYmI2ODcwZmVhYjEyMWUxYjYzZT5d Ci9MZW5ndGggMjMKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja Y1R2Dk2vmLW9xlBJ0eQeAwAlugTvCmVuZHN0cmVhbQplbmRvYmoKCjE0MDEg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTE0MDEKL1dpZHRoIDI5Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVu dCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEzIDxkZmQ2 OTRjZjk2MDZkYmEyMTNlM2FhMWI2NjRmMTUwMDAwMDA5NTZlMGRiNjg3MGZm ZmNlNTJmY2M0MzQxYzE1MDRkMzliMGVlYWIxMjFmM2JhMmE+XQovTGVuZ3Ro IDIzCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMUMgkrDeks XZ6WuEn5LAMAJjMFdQplbmRzdHJlYW0KZW5kb2JqCgoxNDAyIDAgb2JqCjw8 Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNDAy Ci9XaWR0aCAyOQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29s b3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxMyA8ZDFjZTdhY2Y5NjA2 ZDM5YjBlYjY4NzBmMDAwMDAwMWMxNTA0ZTNhYTFiNjY0ZjE1ZjNiYTJhOTU2 ZTBkNDQzMzA4ZGJhMjEzZWFiMTIxZWZiNjI2Pl0KL0xlbmd0aCAyMwovRmls dGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjFDIJM3HvmOLq4mWdc4MB AB79BIcKZW5kc3RyZWFtCmVuZG9iagoKMTQwMyAwIG9iago8PAovVHlwZSAv WE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTQwMwovV2lkdGgg MjkKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2Ug Wy9JbmRleGVkIC9EZXZpY2VSR0IgMTIgPGQxY2U3YWQzOWIwZWNmOTYwNjQ0 MzMwODAwMDAwMDk1NmUwZGUzYWExYjY2NGYxNWVhYjEyMTFjMTUwNGI2ODcw ZmVmYjYyNmYzYmEyYT5dCi9MZW5ndGggMjMKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjaY1QyCQtx7yhxcXGZlbGHAQAhUATPCmVuZHN0cmVh bQplbmRvYmoKCjE0MDQgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5 cGUgL0ltYWdlCi9OYW1lIC9JbTE0MDQKL1dpZHRoIDI5Ci9IZWlnaHQgMQov Qml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2 aWNlUkdCIDEzIDxkMWNlN2FkMzliMGVjZjk2MDY5NTZlMGQwMDAwMDA0NDMz MDhkYmEyMTM2NjRmMTVlM2FhMWIxYzE1MDRiNjg3MGZlYWIxMjFlZmI2MjZm M2JhMmE+XQovTGVuZ3RoIDIzCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0 cmVhbQp42mNUdhUzcW+rnL54ivueswwAI9IFmAplbmRzdHJlYW0KZW5kb2Jq CgoxNDA1IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFn ZQovTmFtZSAvSW0xNDA1Ci9XaWR0aCAyOQovSGVpZ2h0IDEKL0JpdHNQZXJD b21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAx MiA8ZDFjZTdhZGJhMjEzZDM5YjBlMWMxNTA0MDAwMDAwNjY0ZjE1OTU2ZTBk NDQzMzA4Y2Y5NjA2YjY4NzBmZWFiMTIxZWZiNjI2ZjNiYTJhPl0KL0xlbmd0 aCAyMwovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVHZNC3HP 6JzRkeK++gwDACakBZ4KZW5kc3RyZWFtCmVuZG9iagoKMTQwNiAwIG9iago8 PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTQw NgovV2lkdGggMjkKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0Nv bG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgOSA8ZGZkNjk0ZTNhYTFi ZGJhMjEzMWMxNTA0MDAwMDAwOTU2ZTBkY2Y5NjA2ZDM5YjBlZWFiMTIxZjNi YTJhPl0KL0xlbmd0aCAyMQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl YW0KeNpjVHYBAte0tPJk586ZDAAfOQSFCmVuZHN0cmVhbQplbmRvYmoKCjE0 MDcgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9O YW1lIC9JbTE0MDcKL1dpZHRoIDI5Ci9IZWlnaHQgMQovQml0c1BlckNvbXBv bmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDExIDxm OWU4YTllMWI2M2VkYmEyMTM0NDMzMDgxYzE1MDQwMDAwMDA5NTZlMGQ2NjRm MTVkMzliMGViNjg3MGZlZmI2MjZmM2JhMmE+XQovTGVuZ3RoIDIzCi9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUdg0NDQ0rrmiaGrx6IwMA JQgFcAplbmRzdHJlYW0KZW5kb2JqCgoxNDA4IDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNDA4Ci9XaWR0aCAy NwovSGVpZ2h0IDMKL0JpdHNQZXJDb21wb25lbnQgOAovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiAxNiA8ZDViYzU0ZTNhYTFiZDM5YjBlY2Y5 NjA2YjY4NzBmOTU2ZTBkMDAwMDAwNDQzMzA4ZGJhMjEzNjY0ZjE1ZjNiYTJh ZWZiNjI2ZDFjZTdhZWFiMTIxMWMxNTA0ZjllOGE5ZTFiNjNlPl0KL0xlbmd0 aCA2MgovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoVyskBACEM AkCTRRJv+692kQcPhmL+AahkACSR2cja+yhzWWb6I3eNO0JlonnuMuEjPTQr G5J7flAtAjYKZW5kc3RyZWFtCmVuZG9iagoKMTQwOSAwIG9iago8PAovVHlw ZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTQwOQovV2lk dGggMjUKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3Bh Y2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgOSA8ZDFjZTdhZWZiNjI2ZWFiMTIx ZTNhYTFiZDM5YjBlOTU2ZTBkYjY4NzBmNjY0ZjE1NDQzMzA4ZjNiYTJhPl0K L0xlbmd0aCAyMQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpj VDJ2DTM2Sm8PminEAAAU1QNCCmVuZHN0cmVhbQplbmRvYmoKCjE0MTAgMCBv YmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9J bTE0MTAKL1dpZHRoIDIzCi9IZWlnaHQgMgovQml0c1BlckNvbXBvbmVudCA0 Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDUgPGVmYjYyNmVh YjEyMWYzYmEyYWQ1YmM1NGUxYjYzZWY5ZThhOT5dCi9MZW5ndGggMjkKL0Zp bHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY2AQBAIGJiUFRgMjBQYg YFJSYhQJAAARmwG3CmVuZHN0cmVhbQplbmRvYmoKCjE0MTEgMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE0MTEK L1dpZHRoIDI1Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xv clNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDggPGY5ZThhOWVjZGNhMmQ1 YmM1NGYzYmEyYWVmYjYyNmVhYjEyMWUzYWExYmNiYTkzYmRmZDY5ND5dCi9M ZW5ndGggMTcKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1Q2 BgMT1/QGBgAQNAK3CmVuZHN0cmVhbQplbmRvYmoKCjE0MTIgMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE0MTIK L1dpZHRoIDI3Ci9IZWlnaHQgNgovQml0c1BlckNvbXBvbmVudCA4Ci9Db2xv clNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDE2IDxmOWU4YTlkZmQ2OTRk N2M4OTNkNWJjNTRmM2JhMmFlZmI2MjZlYWIxMjFlM2FhMWJjYmE5M2JjOWJj OGNlY2RjYTJiYmFkN2RhY2ExNzVlMWI2M2VhNzljNTY5YTkwNmE4Zjg2NjI+ XQovTGVuZ3RoIDkyCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4 2j3OWQ7AIAgEUKRFZVG4/2mLSzpfMC8hABR83j9EVGvrXAQAhNVs0E32rU/T baLmEbOPWlefEOGmuIjN03KfmTNdAlwX/fCq3fLeFpCCzJp8osqM+4sPlCkF eQplbmRzdHJlYW0KZW5kb2JqCgoxNDEzIDAgb2JqCjw8Ci9UeXBlIC9YT2Jq ZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNDEzCi9XaWR0aCAyNQov SGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0lu ZGV4ZWQgL0RldmljZVJHQiA0IDxmOWU4YTllY2RjYTJkZmQ2OTRkN2M4OTNj OWJjOGM+XQovTGVuZ3RoIDIxCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0 cmVhbQp42mMQFDI2cXExNlYUZGAAAAxVAasKZW5kc3RyZWFtCmVuZG9iagoK MTQxNCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UK L05hbWUgL0ltMTQxNAovV2lkdGggMjIKL0hlaWdodCAxCi9CaXRzUGVyQ29t cG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8 ZjllOGE5ZWNkY2EyPl0KL0xlbmd0aCAxNAovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNpjEA0NdWAAAANCAQAKZW5kc3RyZWFtCmVuZG9iagoK MTQxNiAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UK L05hbWUgL0ltMTQxNgovV2lkdGggMTYKL0hlaWdodCAxNgovQml0c1BlckNv bXBvbmVudCAxCi9JbWFnZU1hc2sgdHJ1ZQovRGVjb2RlIFswIDFdCi9EZWNv ZGVQYXJtcyA8PCAvSyAtMSAvQ29sdW1ucyAxNiA+PgovTGVuZ3RoIDEwNAov RmlsdGVyIC9DQ0lUVEZheERlY29kZQo+PgpzdHJlYW0KJqiOiOiOiOiOiOgl iIiIi5Q5hzDggsREcococococococEEsREREXKHMOUOUOCCWIiIuUOUOUOUO UOUOCCWIiIiLlDmHMOCCxERyhyhyhyhyhyhwQSxERERcocw5Q5Q4IJYiIiwA QAQKZW5kc3RyZWFtCmVuZG9iagoKMTQxNSAwIG9iago8PAovVHlwZSAvUGF0 dGVybgovUGF0dGVyblR5cGUgMQovUGFpbnRUeXBlIDEKL1RpbGluZ1R5cGUg MQovQkJveCBbMCAwIDEgMV0KL1hTdGVwIDEuMDAxCi9ZU3RlcCAxLjAwMQov TWF0cml4IFsxLjUgMCAwIDEuNSAwIDBdCi9SZXNvdXJjZXMgPDwgL1Byb2NT ZXQgWy9QREYgL0ltYWdlQ10gL1hPYmplY3QgPDwgL0ltMTQxNiAxNDE2IDAg UiA+PiA+PgovTGVuZ3RoIDMwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0 cmVhbQp42jPQM7O0UDBAIovSufQ9cw1NDM0UXPK5AG0WBuEKZW5kc3RyZWFt CmVuZG9iagoKMTQxOCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlw ZSAvSW1hZ2UKL05hbWUgL0ltMTQxOAovV2lkdGggMTYKL0hlaWdodCAxNgov Qml0c1BlckNvbXBvbmVudCAxCi9JbWFnZU1hc2sgdHJ1ZQovRGVjb2RlIFsw IDFdCi9EZWNvZGVQYXJtcyA8PCAvSyAtMSAvQ29sdW1ucyAxNiA+PgovTGVu Z3RoIDk5Ci9GaWx0ZXIgL0NDSVRURmF4RGVjb2RlCj4+CnN0cmVhbQojojoj ojojojoEEqERERHOOYcw4SxERsococococococJUIiIiNlDmHKHKHCVCIiNl DlDlDlDlDlDhKhERERzjmHMOEsREbKHKHKHKHKHKHCVCIiIjZQ5hyhyhwlQi IjABABAKZW5kc3RyZWFtCmVuZG9iagoKMTQxNyAwIG9iago8PAovVHlwZSAv UGF0dGVybgovUGF0dGVyblR5cGUgMQovUGFpbnRUeXBlIDEKL1RpbGluZ1R5 cGUgMQovQkJveCBbMCAwIDEgMV0KL1hTdGVwIDEuMDAxCi9ZU3RlcCAxLjAw MQovTWF0cml4IFsxLjUgMCAwIDEuNSAwIDBdCi9SZXNvdXJjZXMgPDwgL1By b2NTZXQgWy9QREYgL0ltYWdlQ10gL1hPYmplY3QgPDwgL0ltMTQxOCAxNDE4 IDAgUiA+PiA+PgovTGVuZ3RoIDMwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+ CnN0cmVhbQp42jPQM7O0UDBAIovSufQ9cw1NDC0UXPK5AG0gBuMKZW5kc3Ry ZWFtCmVuZG9iagoKMTQyMCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3Vi dHlwZSAvSW1hZ2UKL05hbWUgL0ltMTQyMAovV2lkdGggMTYKL0hlaWdodCAx NgovQml0c1BlckNvbXBvbmVudCAxCi9JbWFnZU1hc2sgdHJ1ZQovRGVjb2Rl IFswIDFdCi9EZWNvZGVQYXJtcyA8PCAvSyAtMSAvQ29sdW1ucyAxNiA+Pgov TGVuZ3RoIDEwMQovRmlsdGVyIC9DQ0lUVEZheERlY29kZQo+PgpzdHJlYW0K JqiOiOiOiOiOiOgliIiIi5hzDmHWIi5Q5Q5Q5Q5Q5Q4IJYiIiIuUOUOYcoco dYiIi5Q5Q5Q5Q5Q5Q4IJYiIiIuYcw5h1iIuUOUOUOUOUOUOCCWIiIiLlDlDm HKHKHWIiIsAEAEAKZW5kc3RyZWFtCmVuZG9iagoKMTQxOSAwIG9iago8PAov VHlwZSAvUGF0dGVybgovUGF0dGVyblR5cGUgMQovUGFpbnRUeXBlIDEKL1Rp bGluZ1R5cGUgMQovQkJveCBbMCAwIDEgMV0KL1hTdGVwIDEuMDAxCi9ZU3Rl cCAxLjAwMQovTWF0cml4IFsxLjUgMCAwIDEuNSAwIDBdCi9SZXNvdXJjZXMg PDwgL1Byb2NTZXQgWy9QREYgL0ltYWdlQ10gL1hPYmplY3QgPDwgL0ltMTQy MCAxNDIwIDAgUiA+PiA+PgovTGVuZ3RoIDMwCi9GaWx0ZXIgL0ZsYXRlRGVj b2RlCj4+CnN0cmVhbQp42jPQM7O0UDBAIovSufQ9cw1NjAwUXPK5AGz+BtwK ZW5kc3RyZWFtCmVuZG9iagoKMTQyMiAwIG9iago8PAovVHlwZSAvWE9iamVj dAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTQyMgovV2lkdGggMTYKL0hl aWdodCAxNgovQml0c1BlckNvbXBvbmVudCAxCi9JbWFnZU1hc2sgdHJ1ZQov RGVjb2RlIFswIDFdCi9EZWNvZGVQYXJtcyA8PCAvSyAtMSAvQ29sdW1ucyAx NiA+PgovTGVuZ3RoIDk3Ci9GaWx0ZXIgL0NDSVRURmF4RGVjb2RlCj4+CnN0 cmVhbQojojojojojojoEEqERERGzDmHMPQiNlDlDlDlDlDlDhKhERERsococ w5Q5Q9CIiNlDlDlDlDlDlDhKhERERsw5hzD0IjZQ5Q5Q5Q5Q5Q4SoREREbKH KHMOUOUPQiIjABABCmVuZHN0cmVhbQplbmRvYmoKCjE0MjEgMCBvYmoKPDwK L1R5cGUgL1BhdHRlcm4KL1BhdHRlcm5UeXBlIDEKL1BhaW50VHlwZSAxCi9U aWxpbmdUeXBlIDEKL0JCb3ggWzAgMCAxIDFdCi9YU3RlcCAxLjAwMQovWVN0 ZXAgMS4wMDEKL01hdHJpeCBbMS41IDAgMCAxLjUgMCAwXQovUmVzb3VyY2Vz IDw8IC9Qcm9jU2V0IFsvUERGIC9JbWFnZUNdIC9YT2JqZWN0IDw8IC9JbTE0 MjIgMTQyMiAwIFIgPj4gPj4KL0xlbmd0aCAzMAovRmlsdGVyIC9GbGF0ZURl Y29kZQo+PgpzdHJlYW0KeNoz0DOztFAwQCKL0rn0PXMNTYyMFFzyuQBtCAbe CmVuZHN0cmVhbQplbmRvYmoKCjE0MjQgMCBvYmoKPDwKL1R5cGUgL1hPYmpl Y3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE0MjQKL1dpZHRoIDE2Ci9I ZWlnaHQgMTYKL0JpdHNQZXJDb21wb25lbnQgMQovSW1hZ2VNYXNrIHRydWUK L0RlY29kZSBbMCAxXQovRGVjb2RlUGFybXMgPDwgL0sgLTEgL0NvbHVtbnMg MTYgPj4KL0xlbmd0aCAxMDcKL0ZpbHRlciAvQ0NJVFRGYXhEZWNvZGUKPj4K c3RyZWFtCiaojojojojojojoJYiIiIuUOYcw4ILERHKHKHKHKHKHKHBBLERE RFyhyhyhzDlDggsRERHKHKHKHKHKHKHBBLERERFyhzDmHBBYiI5Q5Q5Q5Q5Q 5Q4IJYiIiIuUOUOUOYcocEFiIiIwAQAQCmVuZHN0cmVhbQplbmRvYmoKCjE0 MjMgMCBvYmoKPDwKL1R5cGUgL1BhdHRlcm4KL1BhdHRlcm5UeXBlIDEKL1Bh aW50VHlwZSAxCi9UaWxpbmdUeXBlIDEKL0JCb3ggWzAgMCAxIDFdCi9YU3Rl cCAxLjAwMQovWVN0ZXAgMS4wMDEKL01hdHJpeCBbMS41IDAgMCAxLjUgMCAw XQovUmVzb3VyY2VzIDw8IC9Qcm9jU2V0IFsvUERGIC9JbWFnZUNdIC9YT2Jq ZWN0IDw8IC9JbTE0MjQgMTQyNCAwIFIgPj4gPj4KL0xlbmd0aCAzMAovRmls dGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoz0DOztFAwQCKL0rn0PXMN TYxMFFzyuQBtEgbgCmVuZHN0cmVhbQplbmRvYmoKCjE0MjYgMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE0MjYK L1dpZHRoIDE2Ci9IZWlnaHQgMTYKL0JpdHNQZXJDb21wb25lbnQgMQovSW1h Z2VNYXNrIHRydWUKL0RlY29kZSBbMCAxXQovRGVjb2RlUGFybXMgPDwgL0sg LTEgL0NvbHVtbnMgMTYgPj4KL0xlbmd0aCAxMDIKL0ZpbHRlciAvQ0NJVFRG YXhEZWNvZGUKPj4Kc3RyZWFtCiOiOiOiOiOiOgQSoREREc45hzDhLERGyhyh yhyhyhyhwlQiIiI5xyhyhzDlDhLERERsococococococJUIiIiOccw5hwliI jZQ5Q5Q5Q5Q5Q4SoREREc45Q5Q5hyhwliIiIwAQAQAplbmRzdHJlYW0KZW5k b2JqCgoxNDI1IDAgb2JqCjw8Ci9UeXBlIC9QYXR0ZXJuCi9QYXR0ZXJuVHlw ZSAxCi9QYWludFR5cGUgMQovVGlsaW5nVHlwZSAxCi9CQm94IFswIDAgMSAx XQovWFN0ZXAgMS4wMDEKL1lTdGVwIDEuMDAxCi9NYXRyaXggWzEuNSAwIDAg MS41IDAgMF0KL1Jlc291cmNlcyA8PCAvUHJvY1NldCBbL1BERiAvSW1hZ2VD XSAvWE9iamVjdCA8PCAvSW0xNDI2IDE0MjYgMCBSID4+ID4+Ci9MZW5ndGgg MzAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaM9Azs7RQMEAi i9K59D1zDU2MzBRc8rkAbRwG4gplbmRzdHJlYW0KZW5kb2JqCgoxNDI4IDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW0xNDI4Ci9XaWR0aCAxNgovSGVpZ2h0IDE2Ci9CaXRzUGVyQ29tcG9uZW50 IDEKL0ltYWdlTWFzayB0cnVlCi9EZWNvZGUgWzAgMV0KL0RlY29kZVBhcm1z IDw8IC9LIC0xIC9Db2x1bW5zIDE2ID4+Ci9MZW5ndGggMTAxCi9GaWx0ZXIg L0NDSVRURmF4RGVjb2RlCj4+CnN0cmVhbQomqI6I6I6I6I6I6CWIiIiLmHMO YdYiLlDlDlDlDlDlDggliIiIi5hyhyhzDggliIiLlDlDlDlDlDlDggliIiIi 5hzDmHWIi5Q5Q5Q5Q5Q5Q4IJYiIiIuYcococw4IJYiIiwAQAQAplbmRzdHJl YW0KZW5kb2JqCgoxNDI3IDAgb2JqCjw8Ci9UeXBlIC9QYXR0ZXJuCi9QYXR0 ZXJuVHlwZSAxCi9QYWludFR5cGUgMQovVGlsaW5nVHlwZSAxCi9CQm94IFsw IDAgMSAxXQovWFN0ZXAgMS4wMDEKL1lTdGVwIDEuMDAxCi9NYXRyaXggWzEu NSAwIDAgMS41IDAgMF0KL1Jlc291cmNlcyA8PCAvUHJvY1NldCBbL1BERiAv SW1hZ2VDXSAvWE9iamVjdCA8PCAvSW0xNDI4IDE0MjggMCBSID4+ID4+Ci9M ZW5ndGggMzAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaM9Az s7RQMEAii9K59D1zDU2MLBRc8rkAbSYG5AplbmRzdHJlYW0KZW5kb2JqCgox NDMwIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQov TmFtZSAvSW0xNDMwCi9XaWR0aCAxNgovSGVpZ2h0IDE2Ci9CaXRzUGVyQ29t cG9uZW50IDEKL0ltYWdlTWFzayB0cnVlCi9EZWNvZGUgWzAgMV0KL0RlY29k ZVBhcm1zIDw8IC9LIC0xIC9Db2x1bW5zIDE2ID4+Ci9MZW5ndGggOTYKL0Zp bHRlciAvQ0NJVFRGYXhEZWNvZGUKPj4Kc3RyZWFtCiOiOiOiOiOiOgQSoRER EbMOYcw9CI2UOUOUOUOUOUOEqERERGzDlDlDmHCVCIiNlDlDlDlDlDlDhKhE RERsw5hzD0IjZQ5Q5Q5Q5Q5Q4SoREREbMOUOUOYcJUIiIwAQAQplbmRzdHJl YW0KZW5kb2JqCgoxNDI5IDAgb2JqCjw8Ci9UeXBlIC9QYXR0ZXJuCi9QYXR0 ZXJuVHlwZSAxCi9QYWludFR5cGUgMQovVGlsaW5nVHlwZSAxCi9CQm94IFsw IDAgMSAxXQovWFN0ZXAgMS4wMDEKL1lTdGVwIDEuMDAxCi9NYXRyaXggWzEu NSAwIDAgMS41IDAgMF0KL1Jlc291cmNlcyA8PCAvUHJvY1NldCBbL1BERiAv SW1hZ2VDXSAvWE9iamVjdCA8PCAvSW0xNDMwIDE0MzAgMCBSID4+ID4+Ci9M ZW5ndGggMzAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaM9Az s7RQMEAii9K59D1zDU2MDRRc8rkAbQQG3QplbmRzdHJlYW0KZW5kb2JqCgox NDMxIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQov TmFtZSAvSW0xNDMxCi9XaWR0aCAxMTQKL0hlaWdodCA3OAovQml0c1BlckNv bXBvbmVudCA4Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDQw IDxmZmZmZmZmMWYxZjFlYWVhZWFmOGY4ZjhlM2UzZTM4Njg2ODZjYmNiY2Jj MGMwYzA5Njk2OTY4MDgwODA3Nzc3NzdkN2Q3ZDdiMmIyYjI2NjY2NjZkZGRk ZGQ5OTk5OTkxYzFjMWMyMjIyMjIwNDA0MDQzOTM5MzljY2NjY2MwYzBjMGMx NjE2MTYzMzMzMzNhMGEwYTQ0MjQyNDIwODA4MDgyOTI5MjkxMTExMTE1NTU1 NTU0ZDRkNGRjY2ZmZmZmZmNjY2M5OTk5NjZjY2NjOTk5OWNjY2NmZjY2Y2M2 Njk5OTljY2NjZmY5OTk5Y2NmZmNjZmY+XQovTGVuZ3RoIDk0NwovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNrtlotu2zoMhinZni+xooSRcmtX O3J9dt7/CUfq4jppMAwYNgyD1MKibvz4k7IRgNz+mSZA8kPwv/Rjtn3n13gg 2QQe+IWwg5eK5IP+CxqGIxIKv5uGPMsjAcFf2s7L0Q4+ZXr6iMQqPCECGEQR o+NBEYJYFJRFGKUYxVpjIaovdSOh7WrYtEI0vSg7JZquL7u23QBsVCUrWus6 AVW/7Whn2zWS+k1fiY5pdaeU1DWIqimhrDS0QCNq7RaKbVfQubus7nSzhwJR Q78TsG+hRhQHVMYi0jltj8I20CNKOHQbFDtEPEkErKu9QI7/fKTFi4Lyavui sShQvrQs8ZVI9RXg1N1Vcn9uXgCORKwtwEtFHZ1HtUXLxN4iHHsmCji0NQIF gpct9XV7kcjF7694leRVcog9HgHh1HIoSMQNeqcrjeLlrE+klIm0eKjAIMIh EoUgxbAnorUCLkxEtPZSIuzq9it1lNUz4lXQQcHEM+4Ai1PFxCsRtxTpPRF2 Z00aLZ49kYLbEOOEijrWyMTjOWi8UBhMxJPgrLYH6shFTzOCDpLGHjTtx+LA WQVLxC+fNMJeN4Eo6iMtNqK2dvvm62g5qxizaiW8qa2Vlqr2xlntKyKKSJSH SkjLdbwe5WtJI7rOO66jLeC0JhYPdaTFeHNSHdcaOxPqeKCb8+rryK9JILZQ clI015FzTGI4YoOQiZmYiZmYiZn47xL5Vwf9snokFrzlNRMzMRP/KDF/5TIx EzMxEzMxEzMxE/82Ym6/rZkhGoPhFuYWazBjssY050dPrJ8Fqlu0tG+OrEnr Sb9rXr35Sba8cfP+vW3CRn3TJp1PcKdvLk4arc0DcVI6Gv6AIZ/GbxpmAwNh Bxj0SP6c9+pClCR38Fuo6ehAq+TbuEm5IH9Syf+KGDX+F1aIZkKw5H0IAepv ADcTog+BJwHhGdMewol4sh2F8JQYZ5x7JE4L0fn5JSx3RxyWtK7yN7ko2k2P WXXqPWU1HBtgXNRGZ0wI1jcf1qhCHe81coihjc4pt07zp5tjWOePNPKy+QiL 8qf5yD3RzAtaaS6CVuMzoqNE+1y7VR2DNd5pHFeJiBk172virFQUFSe8RvNM 5+DUnJx93NVVVpn27j6yuhDDkfkHRPP55nikv696vqX3cabeW/R0zr+FJljB 1ziGd0JP9FnQ8SKohTi74X8I8qbnxCj92TfHOD2GsprJkf9UMT07L/RGf8sX JBWSjFRSM8/uT3w5h1/4COaW2337DiF+D3IKZW5kc3RyZWFtCmVuZG9iagoK MTQzMyAwIG9iagpbCjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAK MCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDc3OCA3NzgKMjUwIDMzMyA0 MDggNTAwIDUwMCA4MzMgNzc4IDE4MCAzMzMgMzMzIDUwMCA1NjQgMjUwIDMz MyAyNTAgMjc4CjUwMCA1MDAgNTAwIDUwMCA1MDAgNTAwIDUwMCA1MDAgNTAw IDUwMCAyNzggMjc4IDU2NCA1NjQgNTY0IDQ0NAo5MjEgNzIyIDY2NyA2Njcg NzIyIDYxMSA1NTYgNzIyIDcyMiAzMzMgMzg5IDcyMiA2MTEgODg5IDcyMiA3 MjIKNTU2IDcyMiA2NjcgNTU2IDYxMSA3MjIgNzIyIDk0NCA3MjIgNzIyIDYx MSAzMzMgMjc4IDMzMyA0NjkgNTAwCjMzMyA0NDQgNTAwIDQ0NCA1MDAgNDQ0 IDMzMyA1MDAgNTAwIDI3OCAyNzggNTAwIDI3OCA3NzggNTAwIDUwMAo1MDAg NTAwIDMzMyAzODkgMjc4IDUwMCA1MDAgNzIyIDUwMCA1MDAgNDQ0IDQ4MCAy MDAgNDgwIDU0MSA3NzgKNTAwIDc3OCAzMzMgNTAwIDQ0NCAxMDAwIDUwMCA1 MDAgMzMzIDEwMDAgNTU2IDMzMyA4ODkgNzc4IDYxMSA3NzgKNzc4IDMzMyAz MzMgNDQ0IDQ0NCAzNTAgNTAwIDEwMDAgMzMzIDk4MCAzODkgMzMzIDcyMiA3 NzggNDQ0IDcyMgoyNTAgMzMzIDUwMCA1MDAgNTAwIDUwMCAyMDAgNTAwIDMz MyA3NjAgMjc2IDUwMCA1NjQgMzMzIDc2MCA1MDAKNDAwIDU0OSAzMDAgMzAw IDMzMyA1NzYgNDUzIDI1MCAzMzMgMzAwIDMxMCA1MDAgNzUwIDc1MCA3NTAg NDQ0CjcyMiA3MjIgNzIyIDcyMiA3MjIgNzIyIDg4OSA2NjcgNjExIDYxMSA2 MTEgNjExIDMzMyAzMzMgMzMzIDMzMwo3MjIgNzIyIDcyMiA3MjIgNzIyIDcy MiA3MjIgNTY0IDcyMiA3MjIgNzIyIDcyMiA3MjIgNzIyIDU1NiA1MDAKNDQ0 IDQ0NCA0NDQgNDQ0IDQ0NCA0NDQgNjY3IDQ0NCA0NDQgNDQ0IDQ0NCA0NDQg Mjc4IDI3OCAyNzggMjc4CjUwMCA1MDAgNTAwIDUwMCA1MDAgNTAwIDUwMCA1 NDkgNTAwIDUwMCA1MDAgNTAwIDUwMCA1MDAgNTAwIDUwMApdCmVuZG9iagoK MTQzNiAwIG9iagpbCjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAK MCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDc1MCA3NTAKMjUwIDI2MCA1 NTIgNjY3IDQ2OSA4MzMgODAyIDI4MSAzNTQgMzU0IDQ5MCA2NjcgMjYwIDMz MyAyNjAgNTUyCjQ2OSAzOTYgNDY5IDQ2OSA0NjkgNDY5IDQ2OSA0NjkgNDY5 IDQ2OSAyNjAgMjYwIDY2NyA2NjcgNjY3IDQxNwo5MjcgNjU2IDY3NyA2Nzcg NzgxIDcwOCA2MTUgNzI5IDg2NSAzOTYgMzc1IDY3NyA2MzUgOTE3IDg0NCA3 OTIKNjE1IDc5MiA2OTggNTEwIDY4OCA3NjAgNjY3IDg5NiA2ODggNjU2IDY2 NyAzNjUgNTUyIDM2NSA1ODMgNTAwCjMzMyA0NzkgNTUyIDQ2OSA1NTIgNDY5 IDMwMiA1NDIgNTUyIDI4MSAyNjAgNTMxIDI2MCA4NDQgNTUyIDUyMQo1NTIg NTUyIDM0NCA0MTcgMzEzIDU1MiA0NTggNzA4IDUwMCA0NjkgNDY5IDM5NiA1 NDIgMzk2IDY2NyA3NTAKNDY5IDc1MCAyNTAgNzA4IDQ5MCAxMDAwIDUwMCA1 MDAgMzMzIDEwMzEgNTEwIDI4MSA5OTAgNzUwIDY2NyA3NTAKNzUwIDI1MCAy NTAgNDkwIDQ5MCAzNTQgNTAwIDEwMDAgMzMzIDEwMDAgNDE3IDI4MSA3Mjkg NzUwIDQ2OSA2NTYKMjUwIDI2MCA0NjkgNjc3IDY4OCA2NTYgNTQyIDUwMCAz MzMgNzUwIDMwMiA0NTggNjY3IDMzMyA3NTAgNTAwCjM5NiA2NjcgMzEzIDMx MyAzMzMgNDU4IDU0MiAzMzMgMzMzIDMxMyAzMzMgNDU4IDgzMyA4MzMgODMz IDQxNwo2NTYgNjU2IDY1NiA2NTYgNjU2IDY1NiA5MTcgNjc3IDcwOCA3MDgg NzA4IDcwOCAzOTYgMzk2IDM5NiAzOTYKNzgxIDg0NCA3OTIgNzkyIDc5MiA3 OTIgNzkyIDY2NyA3OTIgNzYwIDc2MCA3NjAgNzYwIDY1NiA2MTUgNTQyCjQ3 OSA0NzkgNDc5IDQ3OSA0NzkgNDc5IDY5OCA0NjkgNDY5IDQ2OSA0NjkgNDY5 IDI4MSAyODEgMjgxIDI4MQo1MjEgNTUyIDUyMSA1MjEgNTIxIDUyMSA1MjEg NjY3IDUyMSA1NTIgNTUyIDU1MiA1NTIgNDY5IDU1MiA0NjkKXQplbmRvYmoK CjE0MzkgMCBvYmoKWwowIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAw CjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCA3NzggNzc4CjI1MCAzMzMg NTU1IDUwMCA1MDAgMTAwMCA4MzMgMjc4IDMzMyAzMzMgNTAwIDU3MCAyNTAg MzMzIDI1MCAyNzgKNTAwIDUwMCA1MDAgNTAwIDUwMCA1MDAgNTAwIDUwMCA1 MDAgNTAwIDMzMyAzMzMgNTcwIDU3MCA1NzAgNTAwCjkzMCA3MjIgNjY3IDcy MiA3MjIgNjY3IDYxMSA3NzggNzc4IDM4OSA1MDAgNzc4IDY2NyA5NDQgNzIy IDc3OAo2MTEgNzc4IDcyMiA1NTYgNjY3IDcyMiA3MjIgMTAwMCA3MjIgNzIy IDY2NyAzMzMgMjc4IDMzMyA1ODEgNTAwCjMzMyA1MDAgNTU2IDQ0NCA1NTYg NDQ0IDMzMyA1MDAgNTU2IDI3OCAzMzMgNTU2IDI3OCA4MzMgNTU2IDUwMAo1 NTYgNTU2IDQ0NCAzODkgMzMzIDU1NiA1MDAgNzIyIDUwMCA1MDAgNDQ0IDM5 NCAyMjAgMzk0IDUyMCA3NzgKNTAwIDc3OCAzMzMgNTAwIDUwMCAxMDAwIDUw MCA1MDAgMzMzIDEwMDAgNTU2IDMzMyAxMDAwIDc3OCA2NjcgNzc4Cjc3OCAz MzMgMzMzIDUwMCA1MDAgMzUwIDUwMCAxMDAwIDMzMyAxMDAwIDM4OSAzMzMg NzIyIDc3OCA0NDQgNzIyCjI1MCAzMzMgNTAwIDUwMCA1MDAgNTAwIDIyMCA1 MDAgMzMzIDc0NyAzMDAgNTAwIDU3MCAzMzMgNzQ3IDUwMAo0MDAgNTQ5IDMw MCAzMDAgMzMzIDU3NiA1NDAgMjUwIDMzMyAzMDAgMzMwIDUwMCA3NTAgNzUw IDc1MCA1MDAKNzIyIDcyMiA3MjIgNzIyIDcyMiA3MjIgMTAwMCA3MjIgNjY3 IDY2NyA2NjcgNjY3IDM4OSAzODkgMzg5IDM4OQo3MjIgNzIyIDc3OCA3Nzgg Nzc4IDc3OCA3NzggNTcwIDc3OCA3MjIgNzIyIDcyMiA3MjIgNzIyIDYxMSA1 NTYKNTAwIDUwMCA1MDAgNTAwIDUwMCA1MDAgNzIyIDQ0NCA0NDQgNDQ0IDQ0 NCA0NDQgMjc4IDI3OCAyNzggMjc4CjUwMCA1NTYgNTAwIDUwMCA1MDAgNTAw IDUwMCA1NDkgNTAwIDU1NiA1NTYgNTU2IDU1NiA1MDAgNTU2IDUwMApdCmVu ZG9iagoKMTQ0MiAwIG9iagpbCjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg MCAwIDAKMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDc1MCA3NTAKMjc4 IDMzMyA0NzQgNTU2IDU1NiA4ODkgNzIyIDIzOCAzMzMgMzMzIDM4OSA1ODQg Mjc4IDMzMyAyNzggMjc4CjU1NiA1NTYgNTU2IDU1NiA1NTYgNTU2IDU1NiA1 NTYgNTU2IDU1NiAzMzMgMzMzIDU4NCA1ODQgNTg0IDYxMQo5NzUgNzIyIDcy MiA3MjIgNzIyIDY2NyA2MTEgNzc4IDcyMiAyNzggNTU2IDcyMiA2MTEgODMz IDcyMiA3NzgKNjY3IDc3OCA3MjIgNjY3IDYxMSA3MjIgNjY3IDk0NCA2Njcg NjY3IDYxMSAzMzMgMjc4IDMzMyA1ODQgNTU2CjMzMyA1NTYgNjExIDU1NiA2 MTEgNTU2IDMzMyA2MTEgNjExIDI3OCAyNzggNTU2IDI3OCA4ODkgNjExIDYx MQo2MTEgNjExIDM4OSA1NTYgMzMzIDYxMSA1NTYgNzc4IDU1NiA1NTYgNTAw IDM4OSAyODAgMzg5IDU4NCA3NTAKNTU2IDc1MCAyNzggNTU2IDUwMCAxMDAw IDU1NiA1NTYgMzMzIDEwMDAgNjY3IDMzMyAxMDAwIDc1MCA2MTEgNzUwCjc1 MCAyNzggMjc4IDUwMCA1MDAgMzUwIDU1NiAxMDAwIDMzMyAxMDAwIDU1NiAz MzMgOTQ0IDc1MCA1MDAgNjY3CjI3OCAzMzMgNTU2IDU1NiA1NTYgNTU2IDI4 MCA1NTYgMzMzIDczNyAzNzAgNTU2IDU4NCAzMzMgNzM3IDU1Mgo0MDAgNTQ5 IDMzMyAzMzMgMzMzIDU3NiA1NTYgMjc4IDMzMyAzMzMgMzY1IDU1NiA4MzQg ODM0IDgzNCA2MTEKNzIyIDcyMiA3MjIgNzIyIDcyMiA3MjIgMTAwMCA3MjIg NjY3IDY2NyA2NjcgNjY3IDI3OCAyNzggMjc4IDI3OAo3MjIgNzIyIDc3OCA3 NzggNzc4IDc3OCA3NzggNTg0IDc3OCA3MjIgNzIyIDcyMiA3MjIgNjY3IDY2 NyA2MTEKNTU2IDU1NiA1NTYgNTU2IDU1NiA1NTYgODg5IDU1NiA1NTYgNTU2 IDU1NiA1NTYgMjc4IDI3OCAyNzggMjc4CjYxMSA2MTEgNjExIDYxMSA2MTEg NjExIDYxMSA1NDkgNjExIDYxMSA2MTEgNjExIDYxMSA1NTYgNjExIDU1Ngpd CmVuZG9iagoKMTQ0NSAwIG9iagpbCjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAw IDAgMCAwIDAKMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDc1MCA3NTAK MjUwIDIxOSA0MDYgNjY3IDQ0OCA4MjMgNzI5IDE3NyAyOTIgMjkyIDQyNyA2 NjcgMjE5IDMxMyAyMTkgNTAwCjQ2OSA0NjkgNDY5IDQ2OSA0NjkgNDY5IDQ2 OSA0NjkgNDY5IDQ2OSAyMTkgMjE5IDY2NyA2NjcgNjY3IDM2NQo5MTcgNjc3 IDYxNSA2MzUgNzcxIDY1NiA1NjMgNzcxIDc2MCAzNTQgMzMzIDc0MCA1NzMg ODMzIDc3MSA3ODEKNTYzIDc3MSA2MjUgNDc5IDYxNSA3MDggNjc3IDg4NSA2 OTggNjU2IDY1NiAyNzEgNTAwIDI3MSA1MDAgNTAwCjMzMyA0MDYgNTEwIDQx NyA1MDAgNDE3IDMyMyA0NDggNTEwIDIyOSAyMjkgNDY5IDIyOSA3NzEgNTEw IDUxMAo1MTAgNDkwIDMzMyAzNjUgMjkyIDQ5MCA0NjkgNjY3IDQ1OCA0MTcg NDI3IDQ3OSA1MDAgNDc5IDY2NyA3NTAKNDY5IDc1MCAyMTkgNjE1IDQ0OCAx MDAwIDQyNyA0MjcgMzMzIDEwMjEgNDc5IDE5OCA5MzggNzUwIDY1NiA3NTAK NzUwIDIxOSAyMTkgNDQ4IDQ0OCAzNTQgNTAwIDEwMDAgMzMzIDk3OSAzNjUg MTk4IDY5OCA3NTAgNDI3IDY1NgoyNTAgMjE5IDQxNyA1NzMgNjc3IDY1NiA1 MDAgNDI3IDMzMyA3NjAgMjYwIDM2NSA2NjcgMzEzIDc2MCA1MDAKMzk2IDY2 NyAzMTMgMzEzIDMzMyA1MDAgNDQ4IDMzMyAzMzMgMzEzIDMzMyAzNjUgODEz IDgxMyA4MjMgMzY1CjY3NyA2NzcgNjc3IDY3NyA2NzcgNjc3IDg1NCA2MzUg NjU2IDY1NiA2NTYgNjU2IDM1NCAzNTQgMzU0IDM1NAo3NzEgNzcxIDc4MSA3 ODEgNzgxIDc4MSA3ODEgNjY3IDc4MSA3MDggNzA4IDcwOCA3MDggNjU2IDU2 MyA1MDAKNDA2IDQwNiA0MDYgNDA2IDQwNiA0MDYgNTgzIDQxNyA0MTcgNDE3 IDQxNyA0MTcgMjI5IDIyOSAyMjkgMjI5CjUyMSA1MTAgNTEwIDUxMCA1MTAg NTEwIDUxMCA1NDkgNTEwIDQ5MCA0OTAgNDkwIDQ5MCA0MTcgNTEwIDQxNwpd CmVuZG9iagoKMTQ0OCAwIG9iagpbCjAgNDg2IDQ4NiA0ODYgNDg2IDQ4NiA0 ODYgNDg2IDQ4NiA0ODYgNDg2IDQ4NiA0ODYgMCA0ODYgNDg2CjQ4NiA0ODYg NDg2IDQ4NiA0ODYgNDg2IDQ4NiA0ODYgNDg2IDQ4NiA0ODYgNDg2IDQ4NiA0 ODYgNDg2IDQ4NgoyMzkgMzA1IDM2NCA1NTIgNDM1IDgyMSA3MjYgMjAzIDM4 NiAzODYgNDQwIDU1MiAyODYgMzUwIDI4NiA0MDMKNTc3IDM2NSA0ODUgNDU3 IDUyMyA0NjcgNTQ4IDQ3MiA1MzUgNTQ2IDI4NiAyODYgNTUyIDU1MiA1NTIg NDU0Cjg4MSA2NjkgNjYxIDY2MCA3OTAgNjAyIDU2MyA3NDAgODI4IDM5MSAz NjMgNzMxIDU3NyA5MzUgNzU2IDgyOQo2NDIgODI4IDcwNSA1MjcgNjIxIDc2 NyA2NjMgOTgxIDY4NiA2MTcgNTg5IDM1NSA0MDMgMzU1IDU1MiA1MDAKNDEw IDUzNiA2MDkgNDg0IDYyMCA1MzggMzU0IDU0NSA2MzcgMzMyIDMxNCA2MDkg MzI5IDkzNiA2NDAgNTk5CjYxMSA2MDUgNDM0IDQ1NyAzOTAgNjI3IDUxOCA3 NjMgNTM0IDUxMiA1MDggMzYxIDM1MyAzNjEgNTUyIDQ4Ngo1MTYgNDg2IDI0 MCA1NTIgNDE2IDc1MiA1NTMgNjAyIDQxMCAxMTkxIDUyNyAzMTIgOTg5IDQ4 NiA1ODkgNDg2CjQ4NiAyMjUgMjI1IDM5NiAzOTYgMzEzIDUwMCAxMDAwIDQx MCA2OTQgNDU3IDMxMiA4ODYgNDg2IDUwOCA2MTcKMjM5IDI3NSA0NTQgNTI5 IDU1OCA1MjUgMzYyIDU2MyA0MTAgNzk2IDM1MyA1MTcgNTUyIDM1MCA0MTQg NDEwCjM0MyA1NTIgMzYwIDM2MCA0MTAgNjE5IDYwMCAyODYgNDEwIDM2MCAz ODYgNTE3IDgyNCA4MjQgODI0IDQ0Nwo2NjkgNjY5IDY2OSA2NjkgNjY5IDY2 OSA5MjYgNjYwIDYwMiA2MDIgNjAyIDYwMiAzOTEgMzkxIDM5MSAzOTEKNzY2 IDc1NiA4MjkgODI5IDgyOSA4MjkgODI5IDU1MiA4MjkgNzY3IDc2NyA3Njcg NzY3IDYxNyA2NDcgNjc3CjUzNiA1MzYgNTM2IDUzNiA1MzYgNTM2IDgwMSA0 ODQgNTM4IDUzOCA1MzggNTM4IDMzMiAzMzIgMzMyIDMzMgo2MDMgNjQwIDU5 OSA1OTkgNTk5IDU5OSA1OTkgNTUyIDU5OSA2MjcgNjI3IDYyNyA2MjcgNTEy IDYwOSA1MTIKXQplbmRvYmoKCjE0NTEgMCBvYmoKWwowIDAgMCAwIDAgMCAw IDAgMCAwIDAgMCAwIDAgMCAwCjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAg MCA3NTAgNzUwCjI3OCAyNzggMzU1IDU1NiA1NTYgODg5IDY2NyAxOTEgMzMz IDMzMyAzODkgNTg0IDI3OCAzMzMgMjc4IDI3OAo1NTYgNTU2IDU1NiA1NTYg NTU2IDU1NiA1NTYgNTU2IDU1NiA1NTYgMjc4IDI3OCA1ODQgNTg0IDU4NCA1 NTYKMTAxNSA2NjcgNjY3IDcyMiA3MjIgNjY3IDYxMSA3NzggNzIyIDI3OCA1 MDAgNjY3IDU1NiA4MzMgNzIyIDc3OAo2NjcgNzc4IDcyMiA2NjcgNjExIDcy MiA2NjcgOTQ0IDY2NyA2NjcgNjExIDI3OCAyNzggMjc4IDQ2OSA1NTYKMzMz IDU1NiA1NTYgNTAwIDU1NiA1NTYgMjc4IDU1NiA1NTYgMjIyIDIyMiA1MDAg MjIyIDgzMyA1NTYgNTU2CjU1NiA1NTYgMzMzIDUwMCAyNzggNTU2IDUwMCA3 MjIgNTAwIDUwMCA1MDAgMzM0IDI2MCAzMzQgNTg0IDc1MAo1NTYgNzUwIDIy MiA1NTYgMzMzIDEwMDAgNTU2IDU1NiAzMzMgMTAwMCA2NjcgMzMzIDEwMDAg NzUwIDYxMSA3NTAKNzUwIDIyMiAyMjIgMzMzIDMzMyAzNTAgNTU2IDEwMDAg MzMzIDEwMDAgNTAwIDMzMyA5NDQgNzUwIDUwMCA2NjcKMjc4IDMzMyA1NTYg NTU2IDU1NiA1NTYgMjYwIDU1NiAzMzMgNzM3IDM3MCA1NTYgNTg0IDMzMyA3 MzcgNTUyCjQwMCA1NDkgMzMzIDMzMyAzMzMgNTc2IDUzNyAyNzggMzMzIDMz MyAzNjUgNTU2IDgzNCA4MzQgODM0IDYxMQo2NjcgNjY3IDY2NyA2NjcgNjY3 IDY2NyAxMDAwIDcyMiA2NjcgNjY3IDY2NyA2NjcgMjc4IDI3OCAyNzggMjc4 CjcyMiA3MjIgNzc4IDc3OCA3NzggNzc4IDc3OCA1ODQgNzc4IDcyMiA3MjIg NzIyIDcyMiA2NjcgNjY3IDYxMQo1NTYgNTU2IDU1NiA1NTYgNTU2IDU1NiA4 ODkgNTAwIDU1NiA1NTYgNTU2IDU1NiAyNzggMjc4IDI3OCAyNzgKNTU2IDU1 NiA1NTYgNTU2IDU1NiA1NTYgNTU2IDU0OSA2MTEgNTU2IDU1NiA1NTYgNTU2 IDUwMCA1NTYgNTAwCl0KZW5kb2JqCgoxNDU0IDAgb2JqClsKMCAwIDAgMCAw IDAgMCAwIDAgMCAwIDAgMCAwIDAgMAowIDAgMCAwIDAgMCAwIDAgMCAwIDAg MCAwIDAgNzUwIDc1MAozNDAgMzYwIDQyMCA2MDAgNjYwIDk0MCA4MDAgMjQw IDMyMCAzMjAgNDYwIDYwMCAzNDAgMzYwIDM0MCA2MDAKNjYwIDY2MCA2NjAg NjYwIDY2MCA2NjAgNjYwIDY2MCA2NjAgNjYwIDM0MCAzNDAgNjAwIDYwMCA2 MDAgNjYwCjgyMCA3MjAgNzIwIDc0MCA3ODAgNzIwIDY4MCA3ODAgODIwIDQw MCA2NDAgODAwIDY0MCA5NDAgNzQwIDgwMAo2NjAgODAwIDc4MCA2NjAgNzAw IDc0MCA3MjAgOTQwIDc4MCA3MDAgNjQwIDMwMCA2MDAgMzAwIDYwMCA1MDAK NDAwIDU4MCA2MDAgNTgwIDY0MCA1ODAgMzgwIDU4MCA2ODAgMzYwIDM0MCA2 NjAgMzQwIDEwMDAgNjgwIDYyMAo2NDAgNjIwIDQ2MCA1MjAgNDYwIDY2MCA2 MDAgODAwIDYwMCA2MjAgNTYwIDMyMCA2MDAgMzIwIDYwMCA3NTAKNjYwIDc1 MCAzMjAgNjYwIDU0MCAxMDAwIDQ0MCAzODAgNTAwIDEzNjAgNjYwIDIyMCAx MjIwIDc1MCA2NDAgNzUwCjc1MCAzMjAgMzIwIDU0MCA1NDAgNDYwIDUwMCAx MDAwIDQ4MCA5ODAgNTIwIDIyMCA5NDAgNzUwIDU2MCA3MDAKMzQwIDM2MCA2 NjAgNjYwIDYwMCA2NjAgNjAwIDYwMCA1MDAgNzQwIDQwMCA0MDAgNjAwIDM2 MCA3NDAgNTAwCjQwMCA1NDkgMzk2IDM5NiA0MDAgNTc2IDgwMCAzMjAgMzYw IDM5NiA0MDAgNDAwIDk5MCA5OTAgOTkwIDY2MAo3MjAgNzIwIDcyMCA3MjAg NzIwIDcyMCAxMTQwIDc0MCA3MjAgNzIwIDcyMCA3MjAgNDAwIDQwMCA0MDAg NDAwCjc4MCA3NDAgODAwIDgwMCA4MDAgODAwIDgwMCA2MDAgODAwIDc0MCA3 NDAgNzQwIDc0MCA3MDAgNjYwIDY2MAo1ODAgNTgwIDU4MCA1ODAgNTgwIDU4 MCA4ODAgNTgwIDU4MCA1ODAgNTgwIDU4MCAzNjAgMzYwIDM2MCAzNjAKNjIw IDY4MCA2MjAgNjIwIDYyMCA2MjAgNjIwIDU0OSA2MjAgNjYwIDY2MCA2NjAg NjYwIDYyMCA2NDAgNjIwCl0KZW5kb2JqCgoxNDU3IDAgb2JqClsKMCAwIDAg MCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMAowIDAgMCAwIDAgMCAwIDAgMCAw IDAgMCAwIDAgNzUwIDc1MAozMjAgMzAwIDM4MCA2MDAgNjIwIDkwMCA4MDAg MjIwIDMwMCAzMDAgNDQwIDYwMCAzMjAgNDAwIDMyMCA2MDAKNjIwIDYyMCA2 MjAgNjIwIDYyMCA2MjAgNjIwIDYyMCA2MjAgNjIwIDMyMCAzMjAgNjAwIDYw MCA2MDAgNTQwCjgyMCA2ODAgNzQwIDc0MCA4MDAgNzIwIDY0MCA4MDAgODAw IDM0MCA2MDAgNzIwIDYwMCA5MjAgNzQwIDgwMAo2MjAgODAwIDcyMCA2NjAg NjIwIDc4MCA3MDAgOTYwIDcyMCA2NDAgNjQwIDMwMCA2MDAgMzAwIDYwMCA1 MDAKMzQwIDU4MCA2MjAgNTIwIDYyMCA1MjAgMzIwIDU0MCA2NjAgMzAwIDMw MCA2MjAgMzAwIDk0MCA2NjAgNTYwCjYyMCA1ODAgNDQwIDUyMCAzODAgNjgw IDUyMCA3ODAgNTYwIDU0MCA0ODAgMjgwIDYwMCAyODAgNjAwIDc1MAo2MjAg NzUwIDIyMCA2MjAgNDAwIDEwMDAgNTQwIDU0MCA0MjAgMTI4MCA2NjAgMjQw IDEyNDAgNzUwIDY0MCA3NTAKNzUwIDIyMCAyMjAgNDAwIDQwMCA0NjAgNTAw IDEwMDAgNDQwIDk4MCA1MjAgMjQwIDkwMCA3NTAgNDgwIDY0MAozNDAgMzAw IDYyMCA2MjAgNjAwIDYyMCA2MDAgNTIwIDQyMCA3NDAgNDIwIDM2MCA2MDAg NDAwIDc0MCA1MDAKNDAwIDU0OSAzNzIgMzcyIDM0MCA1NzYgNjAwIDI2MCAz MjAgMzcyIDQyMCAzNjAgOTMwIDkzMCA5MzAgNTQwCjY4MCA2ODAgNjgwIDY4 MCA2ODAgNjgwIDEyNjAgNzQwIDcyMCA3MjAgNzIwIDcyMCAzNDAgMzQwIDM0 MCAzNDAKODAwIDc0MCA4MDAgODAwIDgwMCA4MDAgODAwIDYwMCA4MDAgNzgw IDc4MCA3ODAgNzgwIDY0MCA2MjAgNjYwCjU4MCA1ODAgNTgwIDU4MCA1ODAg NTgwIDg2MCA1MjAgNTIwIDUyMCA1MjAgNTIwIDMwMCAzMDAgMzAwIDMwMAo1 NjAgNjYwIDU2MCA1NjAgNTYwIDU2MCA1NjAgNTQ5IDU2MCA2ODAgNjgwIDY4 MCA2ODAgNTQwIDYyMCA1NDAKXQplbmRvYmoKCjE0NjAgMCBvYmoKWwowIDAg MCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwCjAgMCAwIDAgMCAwIDAgMCAw IDAgMCAwIDAgMCA2NTggNjU4CjIyMCAzMzUgNDIyIDYxOCA1NDMgOTc2IDc0 MCAyNTEgNDA4IDQwOCA0NTMgNTkyIDIzMiAzMzcgMjMyIDUwNQo1OTIgNTky IDU5MiA1OTIgNTkyIDU5MiA1OTIgNTkyIDU5MiA1OTIgMjgwIDI4MCA1OTIg NTkyIDU5MiA0NTIKOTIxIDY1MiA2NTEgNTczIDcwNSA1NzggNTUxIDY0NiA3 MjIgMzUwIDM0MSA2ODIgNTUxIDg0NiA2NzkgNjk1CjYxNCA2OTUgNjYyIDUx MyA2MzkgNjc2IDYzNCA5NjEgNjE5IDYwNCA1NjYgMzY4IDUwNSAzNjggNTky IDM3MQoyODUgNTM1IDU5MSA0NjkgNTk3IDUzMSAzMjYgNTIwIDU5NyAzMTQg MzAyIDU5MiAzMDggODkwIDYwNCA1NjkKNTk3IDU5MSA0NjEgNDU5IDM2NSA1 OTcgNTMxIDc5OCA1MjUgNTMxIDQ3OSAzOTMgMzIwIDM5MyA1OTIgNjU4CjY0 MCA2NTggMjMyIDU5NyAzOTUgNzcyIDUxNyA1MTcgMjg1IDEzODAgNTEzIDMy MSA5NTIgNjU4IDU2NiA2NTgKNjU4IDIzNSAyMzUgMzk4IDM5OCA0NDMgNTAw IDEwMDAgMjg1IDY4NCA0NTkgMzIxIDg1NyA2NTggNDc5IDYwNAoyMjAgMzM1 IDQ2OSA1NTYgNTg3IDY0MSAzMjAgNTMzIDI4NSA4NTEgNDIwIDUyMiA1OTIg MzM3IDg1MSAyODUKMzc4IDU5MiA0MzcgNDM3IDI4NSA2MDUgNTg4IDI3NiAy ODUgNDM3IDQzNiA1MjIgOTQxIDk3NiA5NDEgNDUyCjY1MiA2NTIgNjUyIDY1 MiA2NTIgNjUyIDg4MCA1NzMgNTc4IDU3OCA1NzggNTc4IDM1MCAzNTAgMzUw IDM1MAo3MDkgNjc5IDY5NSA2OTUgNjk1IDY5NSA2OTUgNTkyIDY5NSA2NzYg Njc2IDY3NiA2NzYgNjA0IDYxNyA2NzcKNTM1IDUzNSA1MzUgNTM1IDUzNSA1 MzUgNzk0IDQ2OSA1MzEgNTMxIDUzMSA1MzEgMzE0IDMxNCAzMTQgMzE0CjU3 MiA2MDQgNTY5IDU2OSA1NjkgNTY5IDU2OSA1OTIgNTY5IDU5NyA1OTcgNTk3 IDU5NyA1MzEgNTkxIDUzMQpdCmVuZG9iagoKMTQ2MyAwIG9iagpbCjAgMCAw IDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAKMCAwIDAgMCAwIDAgMCAwIDAg MCAwIDAgMCAwIDEwMDEgMTAwMQozMzQgMzM0IDUwMSA2NjEgNjY4IDEwMDEg ODkwIDI3OSAzOTAgMzkwIDU1NyA2NjEgMzM0IDMzNCAzMzQgMjc5CjY2OCA2 NjggNjY4IDY2OCA2NjggNjY4IDY2OCA2NjggNjY4IDY2OCAzMzQgMzM0IDY2 MSA2NjEgNjYxIDYxMgo3NDEgNzc5IDc3OSA3NzkgNzc5IDcyMyA2NjggODM0 IDgzNCAzOTAgNjY4IDgzNCA2NjggOTQ1IDgzNCA4MzQKNzIzIDgzNCA3Nzkg NzIzIDcyMyA4MzQgNzc5IDEwMDEgNzc5IDc3OSA3MjMgMzkwIDI3OSAzOTAg NjYxIDUwMQozMzQgNjY4IDY2OCA2NjggNjY4IDY2OCAzOTAgNjY4IDY2OCAz MzQgMzM0IDY2OCAzMzQgMTAwMSA2NjggNjY4CjY2OCA2NjggNDQ1IDYxMiA0 NDUgNjY4IDYxMiA5NDUgNjY4IDYxMiA1NTcgMzkwIDI3OSAzOTAgNjYxIDEw MDEKMTAwMSAxMDAxIDI3OSA2NjggNTAxIDEwMDEgNjY4IDY2OCAzMzQgMTQ1 OSA3MjMgMzM0IDEwMDEgMTAwMSA3MjMgMTAwMQoxMDAxIDI3OSAyNzkgNTAx IDUwMSA1MDEgNTAxIDEwMDEgMzM0IDk1MSA2MTIgMzM0IDEwMDEgMTAwMSA1 NTcgNzc5CjMzNCAzMzQgNjY4IDY2OCA2NjEgNjY4IDI3OSA2NjggMzM0IDgw MSA0MDEgNjY4IDY2MSAzMzQgODAxIDUwMQo0MDEgNjYxIDQwMSA0MDEgMzM0 IDY2OCA4NTEgMzM0IDMzNCA0MDEgNDAxIDY2OCAxMDAxIDEwMDEgMTAwMSA2 MTIKNzc5IDc3OSA3NzkgNzc5IDc3OSA3NzkgMTAwMSA3NzkgNzIzIDcyMyA3 MjMgNzIzIDM5MCAzOTAgMzkwIDM5MAo3NzkgODM0IDgzNCA4MzQgODM0IDgz NCA4MzQgNjYxIDgzNCA4MzQgODM0IDgzNCA4MzQgNzc5IDcyMyA2NjgKNjY4 IDY2OCA2NjggNjY4IDY2OCA2NjggMTAwMSA2NjggNjY4IDY2OCA2NjggNjY4 IDMzNCAzMzQgMzM0IDMzNAo2NjggNjY4IDY2OCA2NjggNjY4IDY2OCA2Njgg NjYxIDY2OCA2NjggNjY4IDY2OCA2NjggNjEyIDY2OCA2MTIKXQplbmRvYmoK CjE0NjYgMCBvYmoKWwowIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAw CjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCA3NTEgNzUxCjMzNCAzMzQg NTAxIDY2MSA2NjggMTAwMSA4OTAgMjc5IDM5MCAzOTAgNTU3IDY2MSAzMzQg MzM0IDMzNCAyNzkKNjY4IDY2OCA2NjggNjY4IDY2OCA2NjggNjY4IDY2OCA2 NjggNjY4IDMzNCAzMzQgNjYxIDY2MSA2NjEgNjEyCjc0MSA3NzkgNzc5IDc3 OSA3NzkgNzIzIDY2OCA4MzQgODM0IDM5MCA2NjggODM0IDY2OCA5NDUgODM0 IDgzNAo3MjMgODM0IDc3OSA3MjMgNzIzIDgzNCA3NzkgMTAwMSA3NzkgNzc5 IDcyMyAzOTAgMjc5IDM5MCA2NjEgNTAxCjMzNCA2NjggNjY4IDY2OCA2Njgg NjY4IDM5MCA2NjggNjY4IDMzNCAzMzQgNjY4IDMzNCAxMDAxIDY2OCA2NjgK NjY4IDY2OCA0NDUgNjEyIDQ0NSA2NjggNjEyIDk0NSA2NjggNjEyIDU1NyAz OTAgMjc5IDM5MCA2NjEgNzUxCjY2OCA3NTEgMjc5IDY2OCA1MDEgMTAwMSA2 NjggNjY4IDMzNCAxMDAxIDcyMyAzMzQgMTAwMSA3NTEgNzIzIDc1MQo3NTEg Mjc5IDI3OSA1MDEgNTAxIDUwMSA1MDEgMTAwMSAzMzQgOTUxIDYxMiAzMzQg MTAwMSA3NTEgNTU3IDc3OQozMzQgMzM0IDY2OCA2NjggNjYxIDY2OCAyNzkg NjY4IDMzNCA4MDEgNDAxIDY2OCA2NjEgMzM0IDgwMSA1MDEKNDAxIDY2MSA0 MDEgNDAxIDMzNCA2NjggODUxIDMzNCAzMzQgNDAxIDQwMSA2NjggMTAwMSAx MDAxIDEwMDEgNjEyCjc3OSA3NzkgNzc5IDc3OSA3NzkgNzc5IDEwMDEgNzc5 IDcyMyA3MjMgNzIzIDcyMyAzOTAgMzkwIDM5MCAzOTAKNzc5IDgzNCA4MzQg ODM0IDgzNCA4MzQgODM0IDY2MSA4MzQgODM0IDgzNCA4MzQgODM0IDc3OSA3 MjMgNjY4CjY2OCA2NjggNjY4IDY2OCA2NjggNjY4IDEwMDEgNjY4IDY2OCA2 NjggNjY4IDY2OCAzMzQgMzM0IDMzNCAzMzQKNjY4IDY2OCA2NjggNjY4IDY2 OCA2NjggNjY4IDY2MSA2NjggNjY4IDY2OCA2NjggNjY4IDYxMiA2NjggNjEy Cl0KZW5kb2JqCgoxNDY4IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0 eXBlIC9JbWFnZQovTmFtZSAvSW0xNDY4Ci9XaWR0aCAyOQovSGVpZ2h0IDMK L0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rl dmljZVJHQiAxMyA8ZGNkZWUzZDJkNGRhZDJjYWQxYzdjYWM4YzdjYWQxYzdi ZmM4ODg4Mjg3NDg1MDUwNTM1MDUwNTM1MDU5NDg0NTUwNWQ1MDU5Njg2NDZj NWQ2NDZjPl0KL0xlbmd0aCA1MQovRmlsdGVyIC9GbGF0ZURlY29kZQo+Pgpz dHJlYW0KeNpjFBQUFFJSNjY2MTY2NjVIb++Y0dne1dGxo6Nj5ooDWZUdM4CM CiDZ2VlxAQBMCBLLCmVuZHN0cmVhbQplbmRvYmoKCjE0NjkgMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE0NjkK L1dpZHRoIDIKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8ODg4Mjg3NDg0NTUwPl0K L0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hMA AAARABEKZW5kc3RyZWFtCmVuZG9iagoKMTQ3MCAwIG9iago8PAovVHlwZSAv WE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTQ3MAovV2lkdGgg MwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiAyIDw1MzUwNTA0ODQ1NTA2ODY0NmM+XQov TGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjakwAA ABkAGQplbmRzdHJlYW0KZW5kb2JqCgoxNDcxIDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNDcxCi9XaWR0aCAy Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsv SW5kZXhlZCAvRGV2aWNlUkdCIDEgPDdkODI4NzQ4NDU1MD5dCi9MZW5ndGgg OQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTAAAAEQARCmVu ZHN0cmVhbQplbmRvYmoKCjE0NzIgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QK L1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE0NzIKL1dpZHRoIDMKL0hlaWdo dCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVk IC9EZXZpY2VSR0IgMiA8NTM1MDU5NDg0NTUwNjg1YTYzPl0KL0xlbmd0aCA5 Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42pMAAAAZABkKZW5k c3RyZWFtCmVuZG9iagoKMTQ3MyAwIG9iago8PAovVHlwZSAvWE9iamVjdAov U3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTQ3MwovV2lkdGggMwovSGVpZ2h0 IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQg L0RldmljZVJHQiAyIDw1MzUwNTk1MzUwNTA2ODVhNjM+XQovTGVuZ3RoIDkK L0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjakwAAABkAGQplbmRz dHJlYW0KZW5kb2JqCgoxNDc0IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9T dWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNDc0Ci9XaWR0aCAyCi9IZWlnaHQg MQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAv RGV2aWNlUkdCIDEgPDg4ODI4NzQ4NTA1MD5dCi9MZW5ndGggOQovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTAAAAEQARCmVuZHN0cmVhbQpl bmRvYmoKCjE0NzUgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTE0NzUKL1dpZHRoIDEKL0hlaWdodCAxCi9CaXRz UGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VS R0IgMCA8YTdhMWUzPl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2Rl Cj4+CnN0cmVhbQp42mMAAAABAAEKZW5kc3RyZWFtCmVuZG9iagoKMTQ3NiAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltMTQ3NgovV2lkdGggMQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg MgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAwIDw5ZDhkZGE+ XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja YwAAAAEAAQplbmRzdHJlYW0KZW5kb2JqCgoxNDc3IDAgb2JqCjw8Ci9UeXBl IC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNDc3Ci9XaWR0 aCAzCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNl IFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPDVkNTA1OTUzNTA1MDY4NjQ2Yz5d Ci9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqT AAAAGQAZCmVuZHN0cmVhbQplbmRvYmoKCjE0NzggMCBvYmoKPDwKL1R5cGUg L1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE0NzgKL1dpZHRo IDEKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2Ug Wy9JbmRleGVkIC9EZXZpY2VSR0IgMCA8YjJhMWUzPl0KL0xlbmd0aCA5Ci9G aWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMAAAABAAEKZW5kc3Ry ZWFtCmVuZG9iagoKMTQ3OSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3Vi dHlwZSAvSW1hZ2UKL05hbWUgL0ltMTQ3OQovV2lkdGggMQovSGVpZ2h0IDEK L0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rl dmljZVJHQiAwIDw5ZDhkZTM+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVE ZWNvZGUKPj4Kc3RyZWFtCnjaYwAAAAEAAQplbmRzdHJlYW0KZW5kb2JqCgox NDgwIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQov TmFtZSAvSW0xNDgwCi9XaWR0aCAxCi9IZWlnaHQgMQovQml0c1BlckNvbXBv bmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDAgPDky ODJkYT5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl YW0KeNpjAAAAAQABCmVuZHN0cmVhbQplbmRvYmoKCjE0ODEgMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE0ODEK L1dpZHRoIDEKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMCA8YjJhYmY2Pl0KL0xlbmd0 aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMAAAABAAEK ZW5kc3RyZWFtCmVuZG9iagoKMTQ4MiAwIG9iago8PAovVHlwZSAvWE9iamVj dAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTQ4MgovV2lkdGggMwovSGVp Z2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4 ZWQgL0RldmljZVJHQiAyIDw1ZDUwNTk1MzUwNTA1ZDVhNmM+XQovTGVuZ3Ro IDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjakwAAABkAGQpl bmRzdHJlYW0KZW5kb2JqCgoxNDgzIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0 Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNDgzCi9XaWR0aCAyCi9IZWln aHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhl ZCAvRGV2aWNlUkdCIDEgPDg4OGQ4NzVkNTA1OT5dCi9MZW5ndGggOQovRmls dGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTAAAAEQARCmVuZHN0cmVh bQplbmRvYmoKCjE0ODQgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5 cGUgL0ltYWdlCi9OYW1lIC9JbTE0ODQKL1dpZHRoIDEKL0hlaWdodCAxCi9C aXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZp Y2VSR0IgMCA8OWQ4MmUzPl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVj b2RlCj4+CnN0cmVhbQp42mMAAAABAAEKZW5kc3RyZWFtCmVuZG9iagoKMTQ4 NSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05h bWUgL0ltMTQ4NQovV2lkdGggMgovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25l bnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxIDw5Mjhk OWE1MzUwNTA+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4K c3RyZWFtCnjaEwAAABEAEQplbmRzdHJlYW0KZW5kb2JqCgoxNDg2IDAgb2Jq Cjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0x NDg2Ci9XaWR0aCAyCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9D b2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEgPGIyYTFlMzlkOGRk YT5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0K eNoTAAAAEQARCmVuZHN0cmVhbQplbmRvYmoKCjE0ODcgMCBvYmoKPDwKL1R5 cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE0ODcKL1dp ZHRoIDEKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3Bh Y2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMCA8OWQ4MmRhPl0KL0xlbmd0aCA5 Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMAAAABAAEKZW5k c3RyZWFtCmVuZG9iagoKMTQ4OCAwIG9iago8PAovVHlwZSAvWE9iamVjdAov U3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTQ4OAovV2lkdGggMQovSGVpZ2h0 IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQg L0RldmljZVJHQiAwIDxiY2I1ZWQ+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxh dGVEZWNvZGUKPj4Kc3RyZWFtCnjaYwAAAAEAAQplbmRzdHJlYW0KZW5kb2Jq CgoxNDg5IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFn ZQovTmFtZSAvSW0xNDg5Ci9XaWR0aCAyCi9IZWlnaHQgMQovQml0c1BlckNv bXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEg PDg4OGQ4NzUzNTA1MD5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNoTAAAAEQARCmVuZHN0cmVhbQplbmRvYmoKCjE0OTAg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTE0OTAKL1dpZHRoIDIKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50 IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8ODg4Mjg3 NTM1MDUwPl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0 cmVhbQp42hMAAAARABEKZW5kc3RyZWFtCmVuZG9iagoKMTQ5MSAwIG9iago8 PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTQ5 MQovV2lkdGggMgovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29s b3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxIDxiMmExZTNhNzk3ZTM+ XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja EwAAABEAEQplbmRzdHJlYW0KZW5kb2JqCgoxNDkyIDAgb2JqCjw8Ci9UeXBl IC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNDkyCi9XaWR0 aCAzCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNl IFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPDVkNWE2YzUzNTA1OTY4NjQ2Yz5d Ci9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqT AAAAGQAZCmVuZHN0cmVhbQplbmRvYmoKCjE0OTMgMCBvYmoKPDwKL1R5cGUg L1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE0OTMKL1dpZHRo IDIKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2Ug Wy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8ODg4ZDkxNTM1MDUwPl0KL0xlbmd0 aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hMAAAARABEK ZW5kc3RyZWFtCmVuZG9iagoKMTQ5NCAwIG9iago8PAovVHlwZSAvWE9iamVj dAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTQ5NAovV2lkdGggMQovSGVp Z2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4 ZWQgL0RldmljZVJHQiAwIDw1MzgyNDc+XQovTGVuZ3RoIDkKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYwAAAAEAAQplbmRzdHJlYW0KZW5k b2JqCgoxNDk1IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9J bWFnZQovTmFtZSAvSW0xNDk1Ci9XaWR0aCAxCi9IZWlnaHQgMQovQml0c1Bl ckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdC IDAgPDUzOTczZT5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+ PgpzdHJlYW0KeNpjAAAAAQABCmVuZHN0cmVhbQplbmRvYmoKCjE0OTYgMCBv YmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9J bTE0OTYKL1dpZHRoIDEKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIK L0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMCA8NWQ4ZDQ3Pl0K L0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMA AAABAAEKZW5kc3RyZWFtCmVuZG9iagoKMTQ5NyAwIG9iago8PAovVHlwZSAv WE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTQ5NwovV2lkdGgg MQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiAwIDxjN2I1ZWQ+XQovTGVuZ3RoIDkKL0Zp bHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYwAAAAEAAQplbmRzdHJl YW0KZW5kb2JqCgoxNDk4IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0 eXBlIC9JbWFnZQovTmFtZSAvSW0xNDk4Ci9XaWR0aCAzCi9IZWlnaHQgMQov Qml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2 aWNlUkdCIDIgPDVkNWE2YzQ4NTA1MDY4NjQ2Yz5dCi9MZW5ndGggOQovRmls dGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTAAAAGQAZCmVuZHN0cmVh bQplbmRvYmoKCjE0OTkgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5 cGUgL0ltYWdlCi9OYW1lIC9JbTE0OTkKL1dpZHRoIDIKL0hlaWdodCAxCi9C aXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZp Y2VSR0IgMSA8ODg4ZDg3NDg1MDUwPl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0Zs YXRlRGVjb2RlCj4+CnN0cmVhbQp42hMAAAARABEKZW5kc3RyZWFtCmVuZG9i agoKMTUwMCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1h Z2UKL05hbWUgL0ltMTUwMAovV2lkdGggMQovSGVpZ2h0IDEKL0JpdHNQZXJD b21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAw IDxjN2JmZWQ+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4K c3RyZWFtCnjaYwAAAAEAAQplbmRzdHJlYW0KZW5kb2JqCgoxNTAxIDAgb2Jq Cjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0x NTAxCi9XaWR0aCAyCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9D b2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEgPGIyYTFlMzVkODI1 MD5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0K eNoTAAAAEQARCmVuZHN0cmVhbQplbmRvYmoKCjE1MDIgMCBvYmoKPDwKL1R5 cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE1MDIKL1dp ZHRoIDEKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3Bh Y2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMCA8NWQ5NzNlPl0KL0xlbmd0aCA5 Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMAAAABAAEKZW5k c3RyZWFtCmVuZG9iagoKMTUwMyAwIG9iago8PAovVHlwZSAvWE9iamVjdAov U3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTUwMwovV2lkdGggMQovSGVpZ2h0 IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQg L0RldmljZVJHQiAwIDw2OGExNDc+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxh dGVEZWNvZGUKPj4Kc3RyZWFtCnjaYwAAAAEAAQplbmRzdHJlYW0KZW5kb2Jq CgoxNTA0IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFn ZQovTmFtZSAvSW0xNTA0Ci9XaWR0aCAxCi9IZWlnaHQgMQovQml0c1BlckNv bXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDAg PDcyYTE2Mz5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+Pgpz dHJlYW0KeNpjAAAAAQABCmVuZHN0cmVhbQplbmRvYmoKCjE1MDUgMCBvYmoK PDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE1 MDUKL1dpZHRoIDMKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0Nv bG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8NWQ1YTZjNTM1MDU5 Pl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4 2hMAAAARABEKZW5kc3RyZWFtCmVuZG9iagoKMTUwNiAwIG9iago8PAovVHlw ZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTUwNgovV2lk dGggMgovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFj ZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxIDw5MjhkOWE0ODUwNTA+XQovTGVu Z3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaEwAAABEA EQplbmRzdHJlYW0KZW5kb2JqCgoxNTA3IDAgb2JqCjw8Ci9UeXBlIC9YT2Jq ZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNTA3Ci9XaWR0aCAyCi9I ZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5k ZXhlZCAvRGV2aWNlUkdCIDEgPGE3YWJkMTUzOTczZT5dCi9MZW5ndGggOQov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTAAAAEQARCmVuZHN0 cmVhbQplbmRvYmoKCjE1MDggMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1 YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE1MDgKL1dpZHRoIDUKL0hlaWdodCAx Ci9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9E ZXZpY2VSR0IgNCA8NjhhMTQ3ZTdmMmVkNzJhYjU5ZTdkZWUzYTdhYmI1Pl0K L0xlbmd0aCAxMQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpj VHYAAACMAGUKZW5kc3RyZWFtCmVuZG9iagoKMTUwOSAwIG9iago8PAovVHlw ZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTUwOQovV2lk dGggMwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFj ZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxIDw1ZDVhNmM1MzUwNTA+XQovTGVu Z3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaEwAAABEA EQplbmRzdHJlYW0KZW5kb2JqCgoxNTEwIDAgb2JqCjw8Ci9UeXBlIC9YT2Jq ZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNTEwCi9XaWR0aCAyCi9I ZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5k ZXhlZCAvRGV2aWNlUkdCIDEgPDUzOGQzZTUzOTczZT5dCi9MZW5ndGggOQov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTAAAAEQARCmVuZHN0 cmVhbQplbmRvYmoKCjE1MTEgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1 YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE1MTEKL1dpZHRoIDQKL0hlaWdodCAx Ci9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9E ZXZpY2VSR0IgMyA8NzJhMTU5ZGNlOGUzODhiNTc1ZTdmMmVkPl0KL0xlbmd0 aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42pMGAAAcABwK ZW5kc3RyZWFtCmVuZG9iagoKMTUxMiAwIG9iago8PAovVHlwZSAvWE9iamVj dAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTUxMgovV2lkdGggNAovSGVp Z2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4 ZWQgL0RldmljZVJHQiAzIDw3MmExNjNkY2U4ZGE4OGI1NzVkMmRlYzg+XQov TGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjakwYA ABwAHAplbmRzdHJlYW0KZW5kb2JqCgoxNTEzIDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNTEzCi9XaWR0aCAz Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsv SW5kZXhlZCAvRGV2aWNlUkdCIDEgPDVkNWE2YzQ4NTA1MD5dCi9MZW5ndGgg OQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTAAAAEQARCmVu ZHN0cmVhbQplbmRvYmoKCjE1MTQgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QK L1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE1MTQKL1dpZHRoIDEKL0hlaWdo dCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVk IC9EZXZpY2VSR0IgMCA8ZDJjYWVkPl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0Zs YXRlRGVjb2RlCj4+CnN0cmVhbQp42mMAAAABAAEKZW5kc3RyZWFtCmVuZG9i agoKMTUxNSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1h Z2UKL05hbWUgL0ltMTUxNQovV2lkdGggMQovSGVpZ2h0IDEKL0JpdHNQZXJD b21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAw IDw1MzhkM2U+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4K c3RyZWFtCnjaYwAAAAEAAQplbmRzdHJlYW0KZW5kb2JqCgoxNTE2IDAgb2Jq Cjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0x NTE2Ci9XaWR0aCA0Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9D b2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMgPDcyYTE1OWRjZThl Mzg4YjU3NWM3ZGVjOD5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNqTBgAAHAAcCmVuZHN0cmVhbQplbmRvYmoKCjE1MTcg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTE1MTcKL1dpZHRoIDIKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50 IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8OTI4ZDlh NDg0NTUwPl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0 cmVhbQp42hMAAAARABEKZW5kc3RyZWFtCmVuZG9iagoKMTUxOCAwIG9iago8 PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTUx OAovV2lkdGggMQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29s b3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAwIDxiY2Q0YWM+XQovTGVu Z3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYwAAAAEA AQplbmRzdHJlYW0KZW5kb2JqCgoxNTE5IDAgb2JqCjw8Ci9UeXBlIC9YT2Jq ZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNTE5Ci9XaWR0aCAxCi9I ZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5k ZXhlZCAvRGV2aWNlUkdCIDAgPGM3MzEzNT5dCi9MZW5ndGggOQovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjAAAAAQABCmVuZHN0cmVhbQpl bmRvYmoKCjE1MjAgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTE1MjAKL1dpZHRoIDEKL0hlaWdodCAxCi9CaXRz UGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VS R0IgMCA8ZjEzMTM1Pl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2Rl Cj4+CnN0cmVhbQp42mMAAAABAAEKZW5kc3RyZWFtCmVuZG9iagoKMTUyMSAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltMTUyMQovV2lkdGggNwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg NAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA2IDxmZmRlZTNj NzMxMzVlN2RlZTM3MmExNTlkY2U4ZGE3ZGFiNmNjN2RlYzg+XQovTGVuZ3Ro IDEyCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUdk0AAAFb AMoKZW5kc3RyZWFtCmVuZG9iagoKMTUyMiAwIG9iago8PAovVHlwZSAvWE9i amVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTUyMgovV2lkdGggMwov SGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0lu ZGV4ZWQgL0RldmljZVJHQiAyIDw2ODY0NmM1MzUwNTA1ZDVhNmM+XQovTGVu Z3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjakwAAABkA GQplbmRzdHJlYW0KZW5kb2JqCgoxNTIzIDAgb2JqCjw8Ci9UeXBlIC9YT2Jq ZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNTIzCi9XaWR0aCAxCi9I ZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5k ZXhlZCAvRGV2aWNlUkdCIDAgPDdkYWI2Mz5dCi9MZW5ndGggOQovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjAAAAAQABCmVuZHN0cmVhbQpl bmRvYmoKCjE1MjQgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTE1MjQKL1dpZHRoIDE0Ci9IZWlnaHQgMQovQml0 c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNl UkdCIDExIDw1Mzk3M2U4ODUwMzVmY2RlZGFmYzMxMzVmY2U4ZWRmMTNiM2Vm ZmQ0ZGFmY2Q0ZGFjNzMxMzVkY2U4ZGE4OGI1NzVjN2RlYmY+XQovTGVuZ3Ro IDE1Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUdnUz71wN AAWzAhsKZW5kc3RyZWFtCmVuZG9iagoKMTUyNSAwIG9iago8PAovVHlwZSAv WE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTUyNQovV2lkdGgg MwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiAyIDw1ZDY0NmM1MzUwNTk1ZDVhNmM+XQov TGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjakwAA ABkAGQplbmRzdHJlYW0KZW5kb2JqCgoxNTI2IDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNTI2Ci9XaWR0aCA0 Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsv SW5kZXhlZCAvRGV2aWNlUkdCIDIgPDVkOGQ0N2ZjMzEzNWZmZGVlMz5dCi9M ZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTBAAA GgAaCmVuZHN0cmVhbQplbmRvYmoKCjE1MjcgMCBvYmoKPDwKL1R5cGUgL1hP YmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE1MjcKL1dpZHRoIDkK L0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9J bmRleGVkIC9EZXZpY2VSR0IgNyA8ZmMzMTM1ZmZlOGVkZmNkNGRhZmM0NTQ3 ZmNjYWQxZmNhYmI1ODg4ZDU5ZDJkZWM4Pl0KL0xlbmd0aCAxMwovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVHYIKwAAAnIBKwplbmRzdHJl YW0KZW5kb2JqCgoxNTI4IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0 eXBlIC9JbWFnZQovTmFtZSAvSW0xNTI4Ci9XaWR0aCAxCi9IZWlnaHQgMQov Qml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2 aWNlUkdCIDAgPDVkOTc0Nz5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURl Y29kZQo+PgpzdHJlYW0KeNpjAAAAAQABCmVuZHN0cmVhbQplbmRvYmoKCjE1 MjkgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9O YW1lIC9JbTE1MjkKL1dpZHRoIDQKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9u ZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8Yzcz MTM1ZmMzMTM1ZmZkZWUzPl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVj b2RlCj4+CnN0cmVhbQp42pMEAAAaABoKZW5kc3RyZWFtCmVuZG9iagoKMTUz MCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05h bWUgL0ltMTUzMAovV2lkdGggOQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25l bnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA1IDxmMTMx MzVmY2RlZGFmY2NhZDFmY2FiYmZmYzMxMzVkMmRlYzg+XQovTGVuZ3RoIDEz Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMUUDAJAAABYgC2 CmVuZHN0cmVhbQplbmRvYmoKCjE1MzEgMCBvYmoKPDwKL1R5cGUgL1hPYmpl Y3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE1MzEKL1dpZHRoIDMKL0hl aWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRl eGVkIC9EZXZpY2VSR0IgMiA8Njg2NDZjNTM1MDU5NWQ1YTZjPl0KL0xlbmd0 aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42pMAAAAZABkK ZW5kc3RyZWFtCmVuZG9iagoKMTUzMiAwIG9iago8PAovVHlwZSAvWE9iamVj dAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTUzMgovV2lkdGggNgovSGVp Z2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4 ZWQgL0RldmljZVJHQiA0IDw3MmExNTlmY2I1YjVmYzMxMzVmY2RlZGFmMTMx MzU+XQovTGVuZ3RoIDExCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVh bQp42mNUMgEAAH4AWAplbmRzdHJlYW0KZW5kb2JqCgoxNTMzIDAgb2JqCjw8 Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNTMz Ci9XaWR0aCA3Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xv clNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDUgPGZjZDRkYWZjM2IzZWZj Y2FkMWZjMzEzNWZjYWJiNWZjOTc5YT5dCi9MZW5ndGggMTIKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1R2DgAAAUcAuAplbmRzdHJlYW0K ZW5kb2JqCgoxNTM0IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBl IC9JbWFnZQovTmFtZSAvSW0xNTM0Ci9XaWR0aCA2Ci9IZWlnaHQgMQovQml0 c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNl UkdCIDQgPDg4YWI2Y2ZjYjViNWZjMzEzNWZjZGVkYWYxMzEzNT5dCi9MZW5n dGggMTEKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1QyAQAA fgBYCmVuZHN0cmVhbQplbmRvYmoKCjE1MzUgMCBvYmoKPDwKL1R5cGUgL1hP YmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE1MzUKL1dpZHRoIDkK L0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9J bmRleGVkIC9EZXZpY2VSR0IgNyA8ZTczMTM1ZTdkZWUzZmNkNGRhZjEzMTM1 ZmNjYWQxZmMzYjNlZmNhYmI1ZmM5NzlhPl0KL0xlbmd0aCAxMwovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVHZNLQAAAp8BPwplbmRzdHJl YW0KZW5kb2JqCgoxNTM2IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0 eXBlIC9JbWFnZQovTmFtZSAvSW0xNTM2Ci9XaWR0aCAzCi9IZWlnaHQgMQov Qml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2 aWNlUkdCIDIgPDVkNWE2YzUzNTA1OTVkNTA1OT5dCi9MZW5ndGggOQovRmls dGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTAAAAGQAZCmVuZHN0cmVh bQplbmRvYmoKCjE1MzcgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5 cGUgL0ltYWdlCi9OYW1lIC9JbTE1MzcKL1dpZHRoIDIKL0hlaWdodCAxCi9C aXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZp Y2VSR0IgMSA8OWQ5N2EzNTM1MDUwPl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0Zs YXRlRGVjb2RlCj4+CnN0cmVhbQp42hMAAAARABEKZW5kc3RyZWFtCmVuZG9i agoKMTUzOCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1h Z2UKL05hbWUgL0ltMTUzOAovV2lkdGggMTYKL0hlaWdodCAxCi9CaXRzUGVy Q29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0Ig MTIgPGZjOTc5YWZjYjViNWZjMzEzNWYxMzEzNWU3ZGVlMzUzMWQzNTFlMWQ2 YzI4MWQ1MDlkOTdhM2U3MzEzNWZjYWJiNWZjM2IzZWZjOGQ5MT5dCi9MZW5n dGggMTYKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1R2TUur mLUHAAmRAwQKZW5kc3RyZWFtCmVuZG9iagoKMTUzOSAwIG9iago8PAovVHlw ZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTUzOQovV2lk dGggMwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFj ZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDw2ODY0NmM1MzUwNTk1ZDUwNTk+ XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja kwAAABkAGQplbmRzdHJlYW0KZW5kb2JqCgoxNTQwIDAgb2JqCjw8Ci9UeXBl IC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNTQwCi9XaWR0 aCAyCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNl IFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEgPDlkOTdhMzQ4NTA1MD5dCi9MZW5n dGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTAAAAEQAR CmVuZHN0cmVhbQplbmRvYmoKCjE1NDEgMCBvYmoKPDwKL1R5cGUgL1hPYmpl Y3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE1NDEKL1dpZHRoIDE2Ci9I ZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5k ZXhlZCAvRGV2aWNlUkdCIDkgPGZjNDU0N2ZmYjViZmZjMzEzNTY4MWQzNTFl MWQ2YzEzMWQ2YzI4MWQ1MGE3YTFhM2YxMzEzNWZjOTc5YT5dCi9MZW5ndGgg MTYKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1R2DQ0NSe8E AAfzAlgKZW5kc3RyZWFtCmVuZG9iagoKMTU0MiAwIG9iago8PAovVHlwZSAv WE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTU0MgovV2lkdGgg MwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiAyIDw1ZDY0NmM0ODUwNTA1ZDUwNTk+XQov TGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjakwAA ABkAGQplbmRzdHJlYW0KZW5kb2JqCgoxNTQzIDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNTQzCi9XaWR0aCAy Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsv SW5kZXhlZCAvRGV2aWNlUkdCIDEgPDlkOTdhMzQ4NDU1MD5dCi9MZW5ndGgg OQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTAAAAEQARCmVu ZHN0cmVhbQplbmRvYmoKCjE1NDQgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QK L1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE1NDQKL1dpZHRoIDE2Ci9IZWln aHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhl ZCAvRGV2aWNlUkdCIDcgPGZjM2IzZWZjYjViNWYxMzEzNTFlMWQ2YzEzMWQ2 YzEzMWQ3NTdkMjczNWZjOGQ5MT5dCi9MZW5ndGggMTYKL0ZpbHRlciAvRmxh dGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1R2cXV1Nk4HAAagAdAKZW5kc3RyZWFt CmVuZG9iagoKMTU0NSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlw ZSAvSW1hZ2UKL05hbWUgL0ltMTU0NQovV2lkdGggMTYKL0hlaWdodCAxCi9C aXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZp Y2VSR0IgNiA8ZjEzYjNlZmNiNWI1MjgyNzZjMTMxZDZjMTMxZDc1MWUxZDZj ODg4Mjg3Pl0KL0xlbmd0aCAxNgovRmlsdGVyIC9GbGF0ZURlY29kZQo+Pgpz dHJlYW0KeNpjVHZ2NglxDgMABo4BzAplbmRzdHJlYW0KZW5kb2JqCgoxNTQ2 IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFt ZSAvSW0xNTQ2Ci9XaWR0aCA1Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVu dCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMgPDlkOTdh MzQ4NDU1MDUzNTA1MGE3YWJhYz5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxh dGVEZWNvZGUKPj4Kc3RyZWFtCnjakzoAAAD2ANsKZW5kc3RyZWFtCmVuZG9i agoKMTU0NyAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1h Z2UKL05hbWUgL0ltMTU0NwovV2lkdGggMTYKL0hlaWdodCAxCi9CaXRzUGVy Q29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0Ig NSA8ZmMzYjNlYTdhYmQxMTMxZDYzMTMxZDZjMTMxZDc1MWUxZDZjPl0KL0xl bmd0aCAxNgovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVDYx djY2dgUABYwBegplbmRzdHJlYW0KZW5kb2JqCgoxNTQ4IDAgb2JqCjw8Ci9U eXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNTQ4Ci9X aWR0aCA1Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNw YWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPDUzNTA1OTVkNTA1OTUzNTA1 MD5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFt CnjaE3IAAABmAFMKZW5kc3RyZWFtCmVuZG9iagoKMTU0OSAwIG9iago8PAov VHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTU0OQov V2lkdGggNQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JT cGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAzIDw5ZDk3YTM1MzUwNTA1MzQ1 NTBhN2FiYjU+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+ CnN0cmVhbQp42hM7AAAA7gDXCmVuZHN0cmVhbQplbmRvYmoKCjE1NTAgMCBv YmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9J bTE1NTAKL1dpZHRoIDE2Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0 Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDQgPGZjNTA1MDI4 Mjc2YzEzMWQ3NTEzMWQ2YzFlMjc3NT5dCi9MZW5ndGggMTYKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1Q2NjIxNjYCAAUyAVYKZW5kc3Ry ZWFtCmVuZG9iagoKMTU1MSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3Vi dHlwZSAvSW1hZ2UKL05hbWUgL0ltMTU1MQovV2lkdGggNQovSGVpZ2h0IDEK L0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rl dmljZVJHQiAyIDw1MzUwNTA1MzUwNTk1ZDVhNmM+XQovTGVuZ3RoIDEwCi9G aWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hNtAAAArACWCmVuZHN0 cmVhbQplbmRvYmoKCjE1NTIgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1 YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE1NTIKL1dpZHRoIDUKL0hlaWdodCAx Ci9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9E ZXZpY2VSR0IgMiA8YzdjYWQxYTdhMWEzZGNkNGRhPl0KL0xlbmd0aCAxMAov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTbQAAAKwAlgplbmRz dHJlYW0KZW5kb2JqCgoxNTUzIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9T dWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNTUzCi9XaWR0aCAxNgovSGVpZ2h0 IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQg L0RldmljZVJHQiAyIDxkMmNhZDExMzFkNzUxMzFkNmM+XQovTGVuZ3RoIDEy Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42pNalbYKAAPgAdUK ZW5kc3RyZWFtCmVuZG9iagoKMTU1NCAwIG9iago8PAovVHlwZSAvWE9iamVj dAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTU1NAovV2lkdGggNQovSGVp Z2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4 ZWQgL0RldmljZVJHQiAxIDxiMmI1YjViMmI1YmY+XQovTGVuZ3RoIDEwCi9G aWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNwAAAAQgBBCmVuZHN0 cmVhbQplbmRvYmoKCjE1NTUgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1 YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE1NTUKL1dpZHRoIDE2Ci9IZWlnaHQg MQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAv RGV2aWNlUkdCIDQgPDcyNzhhYzFlMjc3ZTEzMWQ2YzEzMWQ3NTEzMWQ2Mz5d Ci9MZW5ndGggMTYKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja Y1RSVnY2UlICAASHASMKZW5kc3RyZWFtCmVuZG9iagoKMTU1NiAwIG9iago8 PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTU1 NgovV2lkdGggMTcKL0hlaWdodCAyCi9CaXRzUGVyQ29tcG9uZW50IDQKL0Nv bG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNSA8NDg1MDkxMTMxZDZj MTMxZDc1ZTdlOGY2M2Q0NTg3ZGNkZWY2Pl0KL0xlbmd0aCAyMwovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjFBQUElQUEjRwFAQBIcEAAA5g AcQKZW5kc3RyZWFtCmVuZG9iagoKMTU1NyAwIG9iago8PAovVHlwZSAvWE9i amVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTU1NwovV2lkdGggMTYK L0hlaWdodCAzCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9J bmRleGVkIC9EZXZpY2VSR0IgOSA8NWQ2NGEzMzMzYjdlMTMxZDZjMTMxZDc1 MWUyNzZjODg4ZGI1MWUyNzc1MjgyNzZjZTdlOGVkMWUxZDZjPl0KL0xlbmd0 aCAyOAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVAIBI5Uw cyVlIDTuVDJSUjJWsgQALygEHQplbmRzdHJlYW0KZW5kb2JqCgoxNTU4IDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW0xNTU4Ci9XaWR0aCAxNQovSGVpZ2h0IDIKL0JpdHNQZXJDb21wb25lbnQg NAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA2IDwyODMxNzUx MzFkNmMxMzFkNzUxZTI3NmMxZTI3NzVkY2RlZjYzMzMxNzU+XQovTGVuZ3Ro IDI0Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMUEhQWUlR0 CBEUFBFSFEwAAA3uAfoKZW5kc3RyZWFtCmVuZG9iagoKMTU1OSAwIG9iago8 PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTU1 OQovV2lkdGggMTMKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0Nv bG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNCA8NzI3OGFjMTMxZDc1 MTMxZDZjMWUxZDZjMWUyNzZjPl0KL0xlbmd0aCAxMwovRmlsdGVyIC9GbGF0 ZURlY29kZQo+PgpzdHJlYW0KeNpjVAICYQcAAtgA3QplbmRzdHJlYW0KZW5k b2JqCgoxNTYwIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9J bWFnZQovTmFtZSAvSW0xNTYwCi9XaWR0aCAxMgovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiA0IDwxZTFkNmMxMzFkNzUxMzFkNmMxZTI3NzVlN2U4ZjY+XQovTGVuZ3Ro IDE0Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUUhJSMgEA AewArgplbmRzdHJlYW0KZW5kb2JqCgoxNTYxIDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNTYxCi9XaWR0aCAx MAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiA2IDxiY2JmZGExZTI3NzUxMzFkNzUxMzFk NmMxMzFkNjMxZTI3NmMzZDQ1ODc+XQovTGVuZ3RoIDEzCi9GaWx0ZXIgL0Zs YXRlRGVjb2RlCj4+CnN0cmVhbQp42mMUMnYOAwABxwDgCmVuZHN0cmVhbQpl bmRvYmoKCjE1NjIgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTE1NjIKL1dpZHRoIDYKL0hlaWdodCAxCi9CaXRz UGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VS R0IgNSA8YmNiZmRhM2QzYjg3MjgyNzZjMWUyNzZjMjgzMTc1Njg2ZWEzPl0K L0xlbmd0aCAxMQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpj VHYFAACRAGoKZW5kc3RyZWFtCmVuZG9iagoKMTU2MyAwIG9iago8PAovVHlw ZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTU2MwovV2lk dGggMwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFj ZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxIDxiY2JmYmZiY2I1Yzg+XQovTGVu Z3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYwEAAAUA BQplbmRzdHJlYW0KZW5kb2JqCgoxNTY0IDAgb2JqCjw8Ci9UeXBlIC9YT2Jq ZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNTY0Ci9XaWR0aCAzCi9I ZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5k ZXhlZCAvRGV2aWNlUkdCIDEgPGU3ZGVlM2RjZGVlMz5dCi9MZW5ndGggOQov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTAQAAFQAVCmVuZHN0 cmVhbQplbmRvYmoKCjE1NjUgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1 YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE1NjUKL1dpZHRoIDEKL0hlaWdodCAx Ci9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9E ZXZpY2VSR0IgMCA8N2Q4Mjg3Pl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRl RGVjb2RlCj4+CnN0cmVhbQp42mMAAAABAAEKZW5kc3RyZWFtCmVuZG9iagoK MTU2NiAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UK L05hbWUgL0ltMTU2NgovV2lkdGggNAovSGVpZ2h0IDEKL0JpdHNQZXJDb21w b25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAzIDw5 Mjk3OWE1ZDVhNmM1ZDY0NmNiMmI1YjU+XQovTGVuZ3RoIDkKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjakwYAABwAHAplbmRzdHJlYW0KZW5k b2JqCgoxNTY3IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9J bWFnZQovTmFtZSAvSW0xNTY3Ci9XaWR0aCA2Ci9IZWlnaHQgMQovQml0c1Bl ckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdC IDIgPDlkOTdhMzkyOTc5YWQyZDRkYT5dCi9MZW5ndGggMTAKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY0kAAABqAGUKZW5kc3RyZWFtCmVu ZG9iagoKMTU2OCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAv SW1hZ2UKL05hbWUgL0ltMTU2OAovV2lkdGggMgovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiAxIDw4ODgyODdkY2RlZTM+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVE ZWNvZGUKPj4Kc3RyZWFtCnjaEwAAABEAEQplbmRzdHJlYW0KZW5kb2JqCgox NTY5IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQov TmFtZSAvSW0xNTY5Ci9XaWR0aCAzCi9IZWlnaHQgMQovQml0c1BlckNvbXBv bmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEgPDY4 NjQ2YzVkNjQ2Yz5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+ PgpzdHJlYW0KeNoTAQAAFQAVCmVuZHN0cmVhbQplbmRvYmoKCjE1NzAgMCBv YmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9J bTE1NzAKL1dpZHRoIDMKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIK L0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8OWRhMWEzNWQ2 NDZjNzI2ZTc1Pl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+ CnN0cmVhbQp42pMAAAAZABkKZW5kc3RyZWFtCmVuZG9iagoKMTU3MSAwIG9i ago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0lt MTU3MQovV2lkdGggMwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgov Q29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDw2ODY0NmM1ZDVh NmNiMmI1YjU+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4K c3RyZWFtCnjakwAAABkAGQplbmRzdHJlYW0KZW5kb2JqCgoxNTcyIDAgb2Jq Cjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0x NTcyCi9XaWR0aCA2Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9D b2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPDVkNjQ2YzVkNWE2 YzcyNzg3ZT5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4K c3RyZWFtCnjaY1QAAAAkACIKZW5kc3RyZWFtCmVuZG9iagoKMTU3MyAwIG9i ago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0lt MTU3MwovV2lkdGggNAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgov Q29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAzIDxkY2RlZGE2ODY0 NmM1ZDY0NmNkMmQ0ZGE+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjakwYAABwAHAplbmRzdHJlYW0KZW5kb2JqCgoxNTc0 IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFt ZSAvSW0xNTc0Ci9XaWR0aCAzCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVu dCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEgPDY4NmU3 NTVkNWE2Yz5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+Pgpz dHJlYW0KeNoTAQAAFQAVCmVuZHN0cmVhbQplbmRvYmoKCjE1NzUgMCBvYmoK PDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE1 NzUKL1dpZHRoIDMKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0Nv bG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8NWQ1YTZjNzI2ZTc1 Pl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4 2mMBAAAFAAUKZW5kc3RyZWFtCmVuZG9iagoKMTU3NiAwIG9iago8PAovVHlw ZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTU3NgovV2lk dGggMgovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFj ZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxIDxiMmI1YjVjN2NhYzg+XQovTGVu Z3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaEwAAABEA EQplbmRzdHJlYW0KZW5kb2JqCgoxNTc3IDAgb2JqCjw8Ci9UeXBlIC9YT2Jq ZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNTc3Ci9XaWR0aCA2Ci9I ZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5k ZXhlZCAvRGV2aWNlUkdCIDEgPDVkNWE2YzVkNjQ2Yz5dCi9MZW5ndGggMTAK L0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYxQAAAAUABIKZW5k c3RyZWFtCmVuZG9iagoKMTU3OCAwIG9iago8PAovVHlwZSAvWE9iamVjdAov U3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTU3OAovV2lkdGggNAovSGVpZ2h0 IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQg L0RldmljZVJHQiAyIDxiY2JmYzg1ZDY0NmNkMmQ0ZGE+XQovTGVuZ3RoIDkK L0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaEwMAABcAFwplbmRz dHJlYW0KZW5kb2JqCgoxNTc5IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9T dWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNTc5Ci9XaWR0aCAzCi9IZWlnaHQg MQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAv RGV2aWNlUkdCIDIgPDY4NjQ3NTVkNjQ2YzVkNWE2Yz5dCi9MZW5ndGggOQov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTAAAAGQAZCmVuZHN0 cmVhbQplbmRvYmoKCjE1ODAgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1 YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE1ODAKL1dpZHRoIDMKL0hlaWdodCAx Ci9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9E ZXZpY2VSR0IgMSA8NWQ2NDZjNzI2ZTc1Pl0KL0xlbmd0aCA5Ci9GaWx0ZXIg L0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMBAAAFAAUKZW5kc3RyZWFtCmVu ZG9iagoKMTU4MSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAv SW1hZ2UKL05hbWUgL0ltMTU4MQovV2lkdGggMQovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiAwIDxlN2RlZTM+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUK Pj4Kc3RyZWFtCnjaYwAAAAEAAQplbmRzdHJlYW0KZW5kb2JqCgoxNTgyIDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW0xNTgyCi9XaWR0aCAzCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAy Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEgPGU3ZThlZGRj ZGVlMz5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl YW0KeNoTAAAAEQARCmVuZHN0cmVhbQplbmRvYmoKCjE1ODMgMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE1ODMK L1dpZHRoIDcKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNCA8NTM1YTYzNWQ1YTZjN2Q4 MjkxNWQ2NDZjZTdlOGVkPl0KL0xlbmd0aCAxMgovRmlsdGVyIC9GbGF0ZURl Y29kZQo+PgpzdHJlYW0KeNpjVBZ2AAAA1wB4CmVuZHN0cmVhbQplbmRvYmoK CjE1ODQgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdl Ci9OYW1lIC9JbTE1ODQKL1dpZHRoIDIKL0hlaWdodCAxCi9CaXRzUGVyQ29t cG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8 ZDJkNGRhZDJjYWQxPl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2Rl Cj4+CnN0cmVhbQp42hMAAAARABEKZW5kc3RyZWFtCmVuZG9iagoKMTU4NSAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltMTU4NQovV2lkdGggMwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg MgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDxkMmQ0ZGFi Y2JmYmZkY2Q0ZGE+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUK Pj4Kc3RyZWFtCnjakwAAABkAGQplbmRzdHJlYW0KZW5kb2JqCgoxNTg2IDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW0xNTg2Ci9XaWR0aCAzCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAy Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEgPGU3ZGVlM2M3 YmZjOD5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl YW0KeNoTAAAAEQARCmVuZHN0cmVhbQplbmRvYmoKCjE1ODcgMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE1ODcK L1dpZHRoIDQKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8YmNiNWM4NWQ2NDZjNWQ1 YTZjYzdjYWQxPl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+ CnN0cmVhbQp42pMGAAAcABwKZW5kc3RyZWFtCmVuZG9iagoKMTU4OCAwIG9i ago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0lt MTU4OAovV2lkdGggMwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgov Q29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDxlN2U4ZWRiY2Jm YmZkMmNhZDE+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4K c3RyZWFtCnjakwAAABkAGQplbmRzdHJlYW0KZW5kb2JqCgoxNTg5IDAgb2Jq Cjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0x NTg5Ci9XaWR0aCA0Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9D b2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMgPGQyZDRkYWJjYjVj OGM3YmZjOGU3ZThlZD5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNqTBgAAHAAcCmVuZHN0cmVhbQplbmRvYmoKCjE1OTAg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTE1OTAKL1dpZHRoIDUKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50 IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNCA8Njg2ZTc1 Njg2NDZjNWQ1YTZjNWQ2NDZjNzI3ODdlPl0KL0xlbmd0aCAxMQovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVHYAAACMAGUKZW5kc3RyZWFt CmVuZG9iagoKMTU5MSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlw ZSAvSW1hZ2UKL05hbWUgL0ltMTU5MQovV2lkdGggNwovSGVpZ2h0IDEKL0Jp dHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rldmlj ZVJHQiA0IDxjN2NhYzg2ODY0NmM1ZDY0NmM1ZDVhNmNiY2JmYmY+XQovTGVu Z3RoIDEyCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUVnIA AAD1AIcKZW5kc3RyZWFtCmVuZG9iagoKMTU5MiAwIG9iago8PAovVHlwZSAv WE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTU5MgovV2lkdGgg NQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiAzIDw5Mjk3OWE1ZDY0NmM1ZDVhNmM2ODZl NzU+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVh bQp42pM8AAAA9ADaCmVuZHN0cmVhbQplbmRvYmoKCjE1OTMgMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE1OTMK L1dpZHRoIDEwCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xv clNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDYgPGQyZDRkYTVkNjQ2Y2M3 YmZjODg4ODI4N2IyYjViNTY4NjQ2YzVkNWE2Yz5dCi9MZW5ndGggMTMKL0Zp bHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYxQydE0EAAHQAOsKZW5k c3RyZWFtCmVuZG9iagoKMTU5NCAwIG9iago8PAovVHlwZSAvWE9iamVjdAov U3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTU5NAovV2lkdGggNgovSGVpZ2h0 IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQg L0RldmljZVJHQiAzIDw1ZDY0NmM2ODY0NmM1ZDVhNmM4ODgyODc+XQovTGVu Z3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mPcAAAA tACyCmVuZHN0cmVhbQplbmRvYmoKCjE1OTUgMCBvYmoKPDwKL1R5cGUgL1hP YmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE1OTUKL1dpZHRoIDYK L0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9J bmRleGVkIC9EZXZpY2VSR0IgMyA8NWQ1YTZjNWQ2NDZjNjg2NDZjYmNiZmM4 Pl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0K eNoT3QAAANwAxgplbmRzdHJlYW0KZW5kb2JqCgoxNTk2IDAgb2JqCjw8Ci9U eXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNTk2Ci9X aWR0aCA0Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNw YWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMgPGRjZGVlMzY4NjQ2YzVkNjQ2 Y2E3YWJiNT5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+Pgpz dHJlYW0KeNqTBgAAHAAcCmVuZHN0cmVhbQplbmRvYmoKCjE1OTcgMCBvYmoK PDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE1 OTcKL1dpZHRoIDQKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0Nv bG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8N2Q3ODg3NWQ2NDZj Njg2NDc1Pl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0 cmVhbQp42hMDAAAXABcKZW5kc3RyZWFtCmVuZG9iagoKMTU5OCAwIG9iago8 PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTU5 OAovV2lkdGggMwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29s b3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDxkY2RlZTM1ZDVhNmM1 ZDY0NmM+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3Ry ZWFtCnjakwAAABkAGQplbmRzdHJlYW0KZW5kb2JqCgoxNTk5IDAgb2JqCjw8 Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNTk5 Ci9XaWR0aCA0Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xv clNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPDVkNWE2YzVkNjQ2Yzlk YTFhMz5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl YW0KeNpjAwAABwAHCmVuZHN0cmVhbQplbmRvYmoKCjE2MDAgMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE2MDAK L1dpZHRoIDgKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNCA8NWQ2NDZjNWQ1YTZjYzdi ZmM4Njg2NDZjZTdlOGVkPl0KL0xlbmd0aCAxMgovRmlsdGVyIC9GbGF0ZURl Y29kZQo+PgpzdHJlYW0KeNpjZBIwAQAAYgBICmVuZHN0cmVhbQplbmRvYmoK CjE2MDEgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdl Ci9OYW1lIC9JbTE2MDEKL1dpZHRoIDkKL0hlaWdodCAxCi9CaXRzUGVyQ29t cG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNCA8 YmNiZmM4NWQ2NDZjZGNkNGUzZTdlOGVkOWQ5N2EzPl0KL0xlbmd0aCAxMwov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjFDIUdAAAAUcAlgpl bmRzdHJlYW0KZW5kb2JqCgoxNjAyIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0 Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNjAyCi9XaWR0aCA2Ci9IZWln aHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhl ZCAvRGV2aWNlUkdCIDMgPDdkNzg3ZTVkNjQ2YzVkNWE2Y2JjYmZjOD5dCi9M ZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaEysA AACeAIcKZW5kc3RyZWFtCmVuZG9iagoKMTYwMyAwIG9iago8PAovVHlwZSAv WE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTYwMwovV2lkdGgg NgovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiAzIDxjN2JmYzg1ZDY0NmM1ZDVhNmM2ODY0 NzU+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVh bQp42pMsAAAApACKCmVuZHN0cmVhbQplbmRvYmoKCjE2MDQgMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE2MDQK L1dpZHRoIDYKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8Njg2ZTc1NWQ2NDZjNWQ1 YTZjPl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl YW0KeNoTWwAAAM4AtwplbmRzdHJlYW0KZW5kb2JqCgoxNjA1IDAgb2JqCjw8 Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNjA1 Ci9XaWR0aCA2Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xv clNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEgPDY4NjQ2YzVkNjQ2Yz5d Ci9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja E3UAAABsAFYKZW5kc3RyZWFtCmVuZG9iagoKMTYwNiAwIG9iago8PAovVHlw ZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTYwNgovV2lk dGggNgovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFj ZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDw1ZDY0NmM2ODY0NmM5Mjk3YTM+ XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4 2mNJAAAAagBlCmVuZHN0cmVhbQplbmRvYmoKCjE2MDcgMCBvYmoKPDwKL1R5 cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE2MDcKL1dp ZHRoIDQKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3Bh Y2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8Njg2ZTc1NWQ1YTZjNWQ2NDZj ZTdlOGVkPl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0 cmVhbQp42pMGAAAcABwKZW5kc3RyZWFtCmVuZG9iagoKMTYwOCAwIG9iago8 PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTYw OAovV2lkdGggNwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29s b3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxIDw1ZDY0NmM1ZDVhNmM+ XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4 2hMNAAAAfABmCmVuZHN0cmVhbQplbmRvYmoKCjE2MDkgMCBvYmoKPDwKL1R5 cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE2MDkKL1dp ZHRoIDcKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3Bh Y2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8YzdiZmM4NWQ2NDZjNWQ1YTZj YjJiNWJmPl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+Pgpz dHJlYW0KeNqTmgMAANIAtwplbmRzdHJlYW0KZW5kb2JqCgoxNjEwIDAgb2Jq Cjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0x NjEwCi9XaWR0aCA3Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9D b2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMgPDg4ODI4NzVkNWE2 YzVkNjQ2YzcyNzg3ZT5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjak4oBAACSAHcKZW5kc3RyZWFtCmVuZG9iagoKMTYx MSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05h bWUgL0ltMTYxMQovV2lkdGggMTAKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9u ZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8ZGNk NGRhNWQ1YTZjNWQ2NDZjYTdhYmI1Pl0KL0xlbmd0aCAxMQovRmlsdGVyIC9G bGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTzk0AAAGOAOkKZW5kc3RyZWFtCmVu ZG9iagoKMTYxMiAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAv SW1hZ2UKL05hbWUgL0ltMTYxMgovV2lkdGggNwovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiAyIDw1ZDY0NmM1ZDVhNmM5MjhkOWE+XQovTGVuZ3RoIDEwCi9GaWx0ZXIg L0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mOIAAAAWgBZCmVuZHN0cmVhbQpl bmRvYmoKCjE2MTMgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTE2MTMKL1dpZHRoIDcKL0hlaWdodCAxCi9CaXRz UGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VS R0IgMiA8OWRhMWEzNWQ2NDZjYmNiNWM4Pl0KL0xlbmd0aCAxMAovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTjQAAAIQAbgplbmRzdHJlYW0K ZW5kb2JqCgoxNjE0IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBl IC9JbWFnZQovTmFtZSAvSW0xNjE0Ci9XaWR0aCAzCi9IZWlnaHQgMQovQml0 c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNl UkdCIDIgPDVkNjQ2YzVkNWE2YzdkNzg4Nz5dCi9MZW5ndGggOQovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTAAAAGQAZCmVuZHN0cmVhbQpl bmRvYmoKCjE2MTUgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTE2MTUKL1dpZHRoIDQKL0hlaWdodCAxCi9CaXRz UGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VS R0IgMiA8NWQ2NDZjNWQ1YTZjN2Q4Mjg3Pl0KL0xlbmd0aCA5Ci9GaWx0ZXIg L0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hMCAAATABMKZW5kc3RyZWFtCmVu ZG9iagoKMTYxNiAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAv SW1hZ2UKL05hbWUgL0ltMTYxNgovV2lkdGggMwovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiAyIDw5Mjk3OWE1ZDVhNmM1ZDY0NmM+XQovTGVuZ3RoIDkKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjakwAAABkAGQplbmRzdHJlYW0KZW5k b2JqCgoxNjE3IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9J bWFnZQovTmFtZSAvSW0xNjE3Ci9XaWR0aCA0Ci9IZWlnaHQgMQovQml0c1Bl ckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdC IDIgPDY4NjQ2YzVkNWE2YzY4NjQ3NT5dCi9MZW5ndGggOQovRmlsdGVyIC9G bGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTAwAAFwAXCmVuZHN0cmVhbQplbmRv YmoKCjE2MTggMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0lt YWdlCi9OYW1lIC9JbTE2MTgKL1dpZHRoIDgKL0hlaWdodCAxCi9CaXRzUGVy Q29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0Ig MiA8NWQ1YTZjNjg2ZTc1Njg2NDZjPl0KL0xlbmd0aCAxMAovRmlsdGVyIC9G bGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjZAIAAAYABAplbmRzdHJlYW0KZW5k b2JqCgoxNjE5IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9J bWFnZQovTmFtZSAvSW0xNjE5Ci9XaWR0aCAxNgovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiA2IDxiY2JmYmY1ZDY0NmNkMmQ0ZGFlN2U4ZWQ1ZDVhNmM5Mjk3YTM3ZDc4 ODc+XQovTGVuZ3RoIDE2Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVh bQp42mMUMnQMc3QUBAAFpwFvCmVuZHN0cmVhbQplbmRvYmoKCjE2MjAgMCBv YmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9J bTE2MjAKL1dpZHRoIDYKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIK L0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8NWQ2NDZjNWQ1 YTZjNjg2NDZjPl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+ PgpzdHJlYW0KeNpjUQAAACoAJQplbmRzdHJlYW0KZW5kb2JqCgoxNjIxIDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW0xNjIxCi9XaWR0aCA2Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAy Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMgPDY4NmU3NTVk NjQ2YzVkNWE2YzY4NjQ3NT5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVE ZWNvZGUKPj4Kc3RyZWFtCnjaE90AAADcAMYKZW5kc3RyZWFtCmVuZG9iagoK MTYyMiAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UK L05hbWUgL0ltMTYyMgovV2lkdGggNwovSGVpZ2h0IDEKL0JpdHNQZXJDb21w b25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA0IDw2 ODY0NmM1ZDVhNmM1ZDY0NmM1MzVhNjM3MjZlNzU+XQovTGVuZ3RoIDEyCi9G aWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMQMnIAAADeAIUKZW5k c3RyZWFtCmVuZG9iagoKMTYyMyAwIG9iago8PAovVHlwZSAvWE9iamVjdAov U3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTYyMwovV2lkdGggNwovSGVpZ2h0 IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQg L0RldmljZVJHQiA1IDxiMmI1YmY1ZDY0NmM2ODY0NzU1ZDVhNmM2ODY0NmM5 Mjk3OWE+XQovTGVuZ3RoIDEyCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0 cmVhbQp42mNUdg4AAAFHALgKZW5kc3RyZWFtCmVuZG9iagoKMTYyNCAwIG9i ago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0lt MTYyNAovV2lkdGggMwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgov Q29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDw2ODY0NzU1ZDVh NmM1ZDY0NmM+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4K c3RyZWFtCnjakwAAABkAGQplbmRzdHJlYW0KZW5kb2JqCgoxNjI1IDAgb2Jq Cjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0x NjI1Ci9XaWR0aCAxNgovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAov Q29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA3IDw4ODgyODc1ZDY0 NmM1ZDVhNmM2ODY0NzVhN2FiYjVjN2JmYzg2ODY0NmNiMmI1YmY+XQovTGVu Z3RoIDE2Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMUMhRy FVRKBwAEAAE2CmVuZHN0cmVhbQplbmRvYmoKCjE2MjYgMCBvYmoKPDwKL1R5 cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE2MjYKL1dp ZHRoIDMKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3Bh Y2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8Njg2NDZjNTM1YTYzOWQ5N2Ez Pl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4 2pMAAAAZABkKZW5kc3RyZWFtCmVuZG9iagoKMTYyNyAwIG9iago8PAovVHlw ZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTYyNwovV2lk dGggMwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFj ZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDw2ODY0NmM1ZDVhNmM1ZDY0NmM+ XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja kwAAABkAGQplbmRzdHJlYW0KZW5kb2JqCgoxNjI4IDAgb2JqCjw8Ci9UeXBl IC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNjI4Ci9XaWR0 aCAxMAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFj ZSBbL0luZGV4ZWQgL0RldmljZVJHQiAzIDxkMmQ0ZGE1ZDY0NmM1ZDVhNmNh N2FiYjU+XQovTGVuZ3RoIDExCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0 cmVhbQp42pOaOwEAAhsBSAplbmRzdHJlYW0KZW5kb2JqCgoxNjI5IDAgb2Jq Cjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0x NjI5Ci9XaWR0aCAyCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9D b2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEgPDcyNzg3ZWRjZGVl Mz5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0K eNoTAAAAEQARCmVuZHN0cmVhbQplbmRvYmoKCjE2MzAgMCBvYmoKPDwKL1R5 cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE2MzAKL1dp ZHRoIDQKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3Bh Y2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8Njg2NDc1NWQ1YTZjNWQ2NDZj Pl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4 2pMCAAAbABsKZW5kc3RyZWFtCmVuZG9iagoKMTYzMSAwIG9iago8PAovVHlw ZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTYzMQovV2lk dGggMwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFj ZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDw2ODY0NmM1ZDVhNmM2ODZlNzU+ XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja kwAAABkAGQplbmRzdHJlYW0KZW5kb2JqCgoxNjMyIDAgb2JqCjw8Ci9UeXBl IC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNjMyCi9XaWR0 aCAyCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNl IFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEgPGQyZDRkYWM3Y2FkMT5dCi9MZW5n dGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTAAAAEQAR CmVuZHN0cmVhbQplbmRvYmoKCjE2MzMgMCBvYmoKPDwKL1R5cGUgL1hPYmpl Y3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE2MzMKL1dpZHRoIDMKL0hl aWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRl eGVkIC9EZXZpY2VSR0IgMiA8Njg2ZTc1NWQ2NDZjNjg2NDc1Pl0KL0xlbmd0 aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42pMAAAAZABkK ZW5kc3RyZWFtCmVuZG9iagoKMTYzNCAwIG9iago8PAovVHlwZSAvWE9iamVj dAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTYzNAovV2lkdGggNAovSGVp Z2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4 ZWQgL0RldmljZVJHQiAyIDw2ODY0NzU1ZDVhNmNjN2NhZDE+XQovTGVuZ3Ro IDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaEwMAABcAFwpl bmRzdHJlYW0KZW5kb2JqCgoxNjM1IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0 Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNjM1Ci9XaWR0aCAzCi9IZWln aHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhl ZCAvRGV2aWNlUkdCIDIgPDY4NjQ2YzVkNWE2Yzg4ODI4Nz5dCi9MZW5ndGgg OQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTAAAAGQAZCmVu ZHN0cmVhbQplbmRvYmoKCjE2MzYgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QK L1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE2MzYKL1dpZHRoIDQKL0hlaWdo dCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVk IC9EZXZpY2VSR0IgMyA8OTI4ZDlhNWQ1YTZjNTM1YTYzNWQ2NDZjPl0KL0xl bmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42pMGAAAc ABwKZW5kc3RyZWFtCmVuZG9iagoKMTYzNyAwIG9iago8PAovVHlwZSAvWE9i amVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTYzNwovV2lkdGggMjIK L0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9J bmRleGVkIC9EZXZpY2VSR0IgNyA8NWQ2NDZjNWQ1YTZjZjFlOGY2YmNiNWM4 ZDJkNGRhZTdlOGVkOTI5NzlhOWRhMWFjPl0KL0xlbmd0aCAxOQovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjZBQUVBZwZWRjZAcABA4ArApl bmRzdHJlYW0KZW5kb2JqCgoxNjM4IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0 Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNjM4Ci9XaWR0aCA3Ci9IZWln aHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhl ZCAvRGV2aWNlUkdCIDQgPDY4NjQ2YzVkNjQ2YzlkOTdhM2M3Y2FkMTVkNWE2 Yz5dCi9MZW5ndGggMTIKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFt CnjaY1QWdAAAANMAdgplbmRzdHJlYW0KZW5kb2JqCgoxNjM5IDAgb2JqCjw8 Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNjM5 Ci9XaWR0aCAxCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xv clNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDAgPGJjYmZjOD5dCi9MZW5n dGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjAAAAAQAB CmVuZHN0cmVhbQplbmRvYmoKCjE2NDAgMCBvYmoKPDwKL1R5cGUgL1hPYmpl Y3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE2NDAKL1dpZHRoIDYKL0hl aWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRl eGVkIC9EZXZpY2VSR0IgNCA8ODg4ZDkxNzI3ODdlNWQ2NDZjNWQ1YTZjN2Q4 Mjg3Pl0KL0xlbmd0aCAxMQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl YW0KeNpjVBYBAABgADkKZW5kc3RyZWFtCmVuZG9iagoKMTY0MSAwIG9iago8 PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTY0 MQovV2lkdGggMQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29s b3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAwIDw4ODhkOTE+XQovTGVu Z3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYwAAAAEA AQplbmRzdHJlYW0KZW5kb2JqCgoxNjQyIDAgb2JqCjw8Ci9UeXBlIC9YT2Jq ZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNjQyCi9XaWR0aCA0Ci9I ZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5k ZXhlZCAvRGV2aWNlUkdCIDIgPDg4OGQ5MTVkNjQ2YzVkNWE2Yz5dCi9MZW5n dGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTAgAAGwAb CmVuZHN0cmVhbQplbmRvYmoKCjE2NDMgMCBvYmoKPDwKL1R5cGUgL1hPYmpl Y3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE2NDMKL1dpZHRoIDMKL0hl aWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRl eGVkIC9EZXZpY2VSR0IgMiA8NzI3ODdlNWQ1YTZjNjg2NDc1Pl0KL0xlbmd0 aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42pMAAAAZABkK ZW5kc3RyZWFtCmVuZG9iagoKMTY0NCAwIG9iago8PAovVHlwZSAvWE9iamVj dAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTY0NAovV2lkdGggNAovSGVp Z2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4 ZWQgL0RldmljZVJHQiAzIDw2ODY0NzU1ZDVhNmM1ZDY0NmNlN2U4ZjY+XQov TGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjakwYA ABwAHAplbmRzdHJlYW0KZW5kb2JqCgoxNjQ1IDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNjQ1Ci9XaWR0aCA0 Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsv SW5kZXhlZCAvRGV2aWNlUkdCIDIgPDY4NjQ2YzVkNjQ2YzVkNWE2Yz5dCi9M ZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTBAAA GgAaCmVuZHN0cmVhbQplbmRvYmoKCjE2NDYgMCBvYmoKPDwKL1R5cGUgL1hP YmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE2NDYKL1dpZHRoIDQK L0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9J bmRleGVkIC9EZXZpY2VSR0IgMyA8ZTdlOGVkNTM1YTYzNWQ1YTZjNjg2NDc1 Pl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4 2pMGAAAcABwKZW5kc3RyZWFtCmVuZG9iagoKMTY0NyAwIG9iago8PAovVHlw ZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTY0NwovV2lk dGggMwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFj ZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxIDw1ZDY0NmM2ODZlNzU+XQovTGVu Z3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYwEAAAUA BQplbmRzdHJlYW0KZW5kb2JqCgoxNjQ4IDAgb2JqCjw8Ci9UeXBlIC9YT2Jq ZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNjQ4Ci9XaWR0aCA0Ci9I ZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5k ZXhlZCAvRGV2aWNlUkdCIDMgPGQyZDRkYTVkNjQ2YzVkNWE2Y2U3ZThlZD5d Ci9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqT BgAAHAAcCmVuZHN0cmVhbQplbmRvYmoKCjE2NDkgMCBvYmoKPDwKL1R5cGUg L1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE2NDkKL1dpZHRo IDE0Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNl IFsvSW5kZXhlZCAvRGV2aWNlUkdCIDggPDY4NmU3NTVkNjQ2Y2JjYmZjOGQy ZDRkYTVkNWE2YzUzNWE2MzdkODI4N2IyYjViNTY4NjQ3NT5dCi9MZW5ndGgg MTUKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYxQyCRQrkQAA BAQBOwplbmRzdHJlYW0KZW5kb2JqCgoxNjUwIDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNjUwCi9XaWR0aCA2 Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsv SW5kZXhlZCAvRGV2aWNlUkdCIDQgPGU3ZGVlM2E3YWJhY2E3YWJiNTVkNjQ2 YzVkNWE2Yz5dCi9MZW5ndGggMTEKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4K c3RyZWFtCnjaY1R2BgAAjwBoCmVuZHN0cmVhbQplbmRvYmoKCjE2NTEgMCBv YmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9J bTE2NTEKL1dpZHRoIDUKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQK L0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNCA8Njg2ZTc1NTM1 YTYzNWQ1YTZjN2Q4Mjg3YmNiZmM4Pl0KL0xlbmd0aCAxMQovRmlsdGVyIC9G bGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVHYAAACMAGUKZW5kc3RyZWFtCmVu ZG9iagoKMTY1MiAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAv SW1hZ2UKL05hbWUgL0ltMTY1MgovV2lkdGggMwovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiAxIDxiMmI1YmY1ZDVhNmM+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVE ZWNvZGUKPj4Kc3RyZWFtCnjaEwEAABUAFQplbmRzdHJlYW0KZW5kb2JqCgox NjUzIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQov TmFtZSAvSW0xNjUzCi9XaWR0aCAzCi9IZWlnaHQgMQovQml0c1BlckNvbXBv bmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEgPDVk NWE2YzVkNjQ2Yz5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+ PgpzdHJlYW0KeNpjAQAABQAFCmVuZHN0cmVhbQplbmRvYmoKCjE2NTQgMCBv YmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9J bTE2NTQKL1dpZHRoIDgKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQK L0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNCA8NWQ1YTZjYjJi NWJmZTdlOGVkYzdjYWQxNWQ2NDZjPl0KL0xlbmd0aCAxMgovRmlsdGVyIC9G bGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjEDJgAQAAngBHCmVuZHN0cmVhbQpl bmRvYmoKCjE2NTUgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTE2NTUKL1dpZHRoIDIyCi9IZWlnaHQgMQovQml0 c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNl UkdCIDggPDVkNjQ2YzVkNWE2YzY4NmU3NTkyOGQ5YTUzNWE2M2M3YmZjOGJj YmZiZmQyY2FkMWU3ZThlZD5dCi9MZW5ndGggMTkKL0ZpbHRlciAvRmxhdGVE ZWNvZGUKPj4Kc3RyZWFtCnjaYxQycAgTrGBkZhQHAAm4AX8KZW5kc3RyZWFt CmVuZG9iagoKMTY1NiAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlw ZSAvSW1hZ2UKL05hbWUgL0ltMTY1NgovV2lkdGggOQovSGVpZ2h0IDEKL0Jp dHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rldmlj ZVJHQiA1IDw4ODgyODc1ZDY0NmM3MjZlNzVkMmQ0ZGE1ZDVhNmNjN2NhZDE+ XQovTGVuZ3RoIDEzCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4 2mNUdhEMAAAB1ADKCmVuZHN0cmVhbQplbmRvYmoKCjE2NTcgMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE2NTcK L1dpZHRoIDQKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8YzdiZmM4NWQ1YTZjNWQ2 NDZjZDJjYWQxPl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+ CnN0cmVhbQp42pMGAAAcABwKZW5kc3RyZWFtCmVuZG9iagoKMTY1OCAwIG9i ago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0lt MTY1OAovV2lkdGggMTMKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQK L0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgOSA8ZDJjYWQxODg4 Mjg3OTI5NzlhNWQ1YTZjNTM1YTYzNWQ2NDZjZTdlOGVkN2Q4Mjg3ODg4ZDkx ZGNkZWUzPl0KL0xlbmd0aCAxNQovRmlsdGVyIC9GbGF0ZURlY29kZQo+Pgpz dHJlYW0KeNpjVHZNN42YAAAFtAHuCmVuZHN0cmVhbQplbmRvYmoKCjE2NTkg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTE2NTkKL1dpZHRoIDQKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50 IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8Njg2ZTc1 NWQ2NDZjZTdlOGVkPl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2Rl Cj4+CnN0cmVhbQp42hMDAAAXABcKZW5kc3RyZWFtCmVuZG9iagoKMTY2MCAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltMTY2MAovV2lkdGggMQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg MgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAwIDw1ZDY0NmM+ XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja YwAAAAEAAQplbmRzdHJlYW0KZW5kb2JqCgoxNjYxIDAgb2JqCjw8Ci9UeXBl IC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNjYxCi9XaWR0 aCAzCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNl IFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPDVkNWE2YzVkNjQ2YzY4NjQ2Yz5d Ci9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqT AAAAGQAZCmVuZHN0cmVhbQplbmRvYmoKCjE2NjIgMCBvYmoKPDwKL1R5cGUg L1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE2NjIKL1dpZHRo IDMKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2Ug Wy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8NWQ2NDZjNTM1YTYzNzI2ZTc1Pl0K L0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42pMA AAAZABkKZW5kc3RyZWFtCmVuZG9iagoKMTY2MyAwIG9iago8PAovVHlwZSAv WE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTY2MwovV2lkdGgg MTMKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2Ug Wy9JbmRleGVkIC9EZXZpY2VSR0IgNSA8YjJiNWI1NWQ2NDZjNTM1YTYzNWQ1 YTZjOTI4ZDlhZDJkNGRhPl0KL0xlbmd0aCAxNQovRmlsdGVyIC9GbGF0ZURl Y29kZQo+PgpzdHJlYW0KeNpjVDQ2djUWAAAD5AERCmVuZHN0cmVhbQplbmRv YmoKCjE2NjQgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0lt YWdlCi9OYW1lIC9JbTE2NjQKL1dpZHRoIDcKL0hlaWdodCAxCi9CaXRzUGVy Q29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0Ig MiA8Njg2NDZjNWQ1YTZjNWQ2NDZjPl0KL0xlbmd0aCAxMAovRmlsdGVyIC9G bGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTnQEAAMQArgplbmRzdHJlYW0KZW5k b2JqCgoxNjY1IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9J bWFnZQovTmFtZSAvSW0xNjY1Ci9XaWR0aCA3Ci9IZWlnaHQgMQovQml0c1Bl ckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdC IDMgPDlkYTFhMzVkNWE2YzVkNjQ2Y2JjYmZiZj5dCi9MZW5ndGggMTAKL0Zp bHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjak1wDAADgAMYKZW5kc3Ry ZWFtCmVuZG9iagoKMTY2NiAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3Vi dHlwZSAvSW1hZ2UKL05hbWUgL0ltMTY2NgovV2lkdGggNgovSGVpZ2h0IDEK L0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rl dmljZVJHQiAzIDw1ZDVhNmNkMmQ0ZGE1ZDY0NmM2ODY0NzU+XQovTGVuZ3Ro IDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mPZAAAAugC1 CmVuZHN0cmVhbQplbmRvYmoKCjE2NjcgMCBvYmoKPDwKL1R5cGUgL1hPYmpl Y3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE2NjcKL1dpZHRoIDkKL0hl aWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRl eGVkIC9EZXZpY2VSR0IgMyA8YmNiZmM4NWQ2NDZjNWQ1YTZjNTM1YTYzPl0K L0xlbmd0aCAxMQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqT Wt4AAAIfAUIKZW5kc3RyZWFtCmVuZG9iagoKMTY2OCAwIG9iago8PAovVHlw ZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTY2OAovV2lk dGggMjYKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3Bh Y2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgOSA8NWQ2NDZjNTM1YTYzNWQ1YTZj N2Q4Mjg3YmNiZmM4YTdhYmFjZDJkNGRhZTdlOGVkOTI5NzlhNjg2NDZjPl0K L0xlbmd0aCAyMQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpj VHZSChFIV+BQUlLiBAAOUAHrCmVuZHN0cmVhbQplbmRvYmoKCjE2NjkgMCBv YmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9J bTE2NjkKL1dpZHRoIDYKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIK L0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8NWQ1YTZjNTM1 YTYzNjg2NDZjPl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+ PgpzdHJlYW0KeNoTUAAAAEIAMQplbmRzdHJlYW0KZW5kb2JqCgoxNjcwIDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW0xNjcwCi9XaWR0aCA0Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAy Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPGM3YmZjODVk NjQ2Y2QyY2FkMT5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+ PgpzdHJlYW0KeNoTAwAAFwAXCmVuZHN0cmVhbQplbmRvYmoKCjE2NzEgMCBv YmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9J bTE2NzEKL1dpZHRoIDcKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIK L0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8Njg2NDZjNWQ2 NDZjNWQ1YTZjPl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+ PgpzdHJlYW0KeNqTTAEAAJgAfgplbmRzdHJlYW0KZW5kb2JqCgoxNjcyIDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW0xNjcyCi9XaWR0aCA3Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAy Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMgPGQyZDRkYTVk NWE2YzVkNjQ2Yzg4ODI4Nz5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVE ZWNvZGUKPj4Kc3RyZWFtCnjaE8sBAACaAIMKZW5kc3RyZWFtCmVuZG9iagoK MTY3MyAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UK L05hbWUgL0ltMTY3MwovV2lkdGggNAovSGVpZ2h0IDEKL0JpdHNQZXJDb21w b25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAzIDw2 ODY0NmM1ZDVhNmM1ZDY0NmNlN2U4ZWQ+XQovTGVuZ3RoIDkKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjakwYAABwAHAplbmRzdHJlYW0KZW5k b2JqCgoxNjc0IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9J bWFnZQovTmFtZSAvSW0xNjc0Ci9XaWR0aCA0Ci9IZWlnaHQgMQovQml0c1Bl ckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdC IDEgPDVkNWE2YzVkNjQ2Yz5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURl Y29kZQo+PgpzdHJlYW0KeNpjBAAAAgACCmVuZHN0cmVhbQplbmRvYmoKCjE2 NzUgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9O YW1lIC9JbTE2NzUKL1dpZHRoIDMKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9u ZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8NWQ1 YTZjNWQ2NDZjNjg2NDc1Pl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVj b2RlCj4+CnN0cmVhbQp42pMAAAAZABkKZW5kc3RyZWFtCmVuZG9iagoKMTY3 NiAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05h bWUgL0ltMTY3NgovV2lkdGggMwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25l bnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDw1ZDY0 NmM1ZDVhNmM3MjZlNzU+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjakwAAABkAGQplbmRzdHJlYW0KZW5kb2JqCgoxNjc3 IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFt ZSAvSW0xNjc3Ci9XaWR0aCAxNAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25l bnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA4IDxkY2Rl ZGFiY2JmYmY1ZDVhNmM1ZDY0NmM2ODY0NmM4ODhkOWFkY2Q0ZGE1MzVhNjM3 MjZlNzU+XQovTGVuZ3RoIDE1Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0 cmVhbQp42mNUVlYxTdcAAAO0ATAKZW5kc3RyZWFtCmVuZG9iagoKMTY3OCAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltMTY3OAovV2lkdGggOAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg NAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA0IDw3ZDgyODc1 ZDY0NmNhN2ExYTNhN2FiYWM1ZDVhNmM+XQovTGVuZ3RoIDEyCi9GaWx0ZXIg L0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMUMhEEAAC3AFkKZW5kc3RyZWFt CmVuZG9iagoKMTY3OSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlw ZSAvSW1hZ2UKL05hbWUgL0ltMTY3OQovV2lkdGggNgovSGVpZ2h0IDEKL0Jp dHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rldmlj ZVJHQiAyIDw1ZDY0NmM1ZDVhNmM2ODY0NmM+XQovTGVuZ3RoIDEwCi9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hNRAAAASgA1CmVuZHN0cmVh bQplbmRvYmoKCjE2ODAgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5 cGUgL0ltYWdlCi9OYW1lIC9JbTE2ODAKL1dpZHRoIDYKL0hlaWdodCAxCi9C aXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZp Y2VSR0IgMiA8Njg2NDZjNWQ1YTZjODg4Mjg3Pl0KL0xlbmd0aCAxMAovRmls dGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTTAAAAJQAegplbmRzdHJl YW0KZW5kb2JqCgoxNjgxIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0 eXBlIC9JbWFnZQovTmFtZSAvSW0xNjgxCi9XaWR0aCA5Ci9IZWlnaHQgMQov Qml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2 aWNlUkdCIDIgPDcyNzg3ZTVkNjQ2YzVkNWE2Yz5dCi9MZW5ndGggMTEKL0Zp bHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjak1rpAAAB4wEECmVuZHN0 cmVhbQplbmRvYmoKCjE2ODIgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1 YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE2ODIKL1dpZHRoIDI2Ci9IZWlnaHQg MQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAv RGV2aWNlUkdCIDkgPDVkNWE2YzUzNWE2MzVkNjQ2YzdkODI4N2JjYmZiZmE3 YWJhY2QyZDRkYWU3ZThlZDkyOGQ5YTY4NjQ2Yz5dCi9MZW5ndGggMjEKL0Zp bHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1R2EAhhSlfQYGDgZAIA DI8BhQplbmRzdHJlYW0KZW5kb2JqCgoxNjgzIDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNjgzCi9XaWR0aCA2 Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsv SW5kZXhlZCAvRGV2aWNlUkdCIDMgPDcyNzg3ZTVkNWE2YzVkNjQ2Y2JjYmZj OD5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFt Cnjak9wAAADkAMoKZW5kc3RyZWFtCmVuZG9iagoKMTY4NCAwIG9iago8PAov VHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTY4NAov V2lkdGggNAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JT cGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDxjN2NhYzg1ZDY0NmM1ZDVh NmM+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFt CnjakwAAABkAGQplbmRzdHJlYW0KZW5kb2JqCgoxNjg1IDAgb2JqCjw8Ci9U eXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNjg1Ci9X aWR0aCA4Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNw YWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDQgPDkyOGQ5YTVkNjQ2YzVkNWE2 Y2M3YmZjOGQyZDRkYT5dCi9MZW5ndGggMTIKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjaY1R2VAQAARQAhwplbmRzdHJlYW0KZW5kb2JqCgox Njg2IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQov TmFtZSAvSW0xNjg2Ci9XaWR0aCA2Ci9IZWlnaHQgMQovQml0c1BlckNvbXBv bmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMgPDY4 NjQ3NTVkNjQ2YzVkNWE2YzY4NjQ2Yz5dCi9MZW5ndGggMTAKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaEysAAACeAIcKZW5kc3RyZWFtCmVu ZG9iagoKMTY4NyAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAv SW1hZ2UKL05hbWUgL0ltMTY4NwovV2lkdGggMTIKL0hlaWdodCAxCi9CaXRz UGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VS R0IgNCA8Njg2NDc1NWQ1YTZjNWQ2NDZjZGNkZWY2Njg2NDZjPl0KL0xlbmd0 aCAxNAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjFFISdlIC AAHNAK0KZW5kc3RyZWFtCmVuZG9iagoKMTY4OCAwIG9iago8PAovVHlwZSAv WE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTY4OAovV2lkdGgg NAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiAzIDxkY2RlZTM1ZDVhNmM1ZDY0NmM3Mjc4 N2U+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFt CnjakwYAABwAHAplbmRzdHJlYW0KZW5kb2JqCgoxNjg5IDAgb2JqCjw8Ci9U eXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNjg5Ci9X aWR0aCAzCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNw YWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEgPDVkNjQ2YzVkNWE2Yz5dCi9M ZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTAAAA EQARCmVuZHN0cmVhbQplbmRvYmoKCjE2OTAgMCBvYmoKPDwKL1R5cGUgL1hP YmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE2OTAKL1dpZHRoIDQK L0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9J bmRleGVkIC9EZXZpY2VSR0IgMiA8ZTdlOGVkNWQ2NDZjZDJkNGRhPl0KL0xl bmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hMDAAAX ABcKZW5kc3RyZWFtCmVuZG9iagoKMTY5MSAwIG9iago8PAovVHlwZSAvWE9i amVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTY5MQovV2lkdGggNAov SGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0lu ZGV4ZWQgL0RldmljZVJHQiAzIDxkY2Q0ZGE1ZDVhNmM1ZDY0NmM3ZDc4ODc+ XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja kwYAABwAHAplbmRzdHJlYW0KZW5kb2JqCgoxNjkyIDAgb2JqCjw8Ci9UeXBl IC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNjkyCi9XaWR0 aCAzCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNl IFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPDY4NjQ2YzVkNjQ2YzVkNWE2Yz5d Ci9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqT AAAAGQAZCmVuZHN0cmVhbQplbmRvYmoKCjE2OTMgMCBvYmoKPDwKL1R5cGUg L1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE2OTMKL1dpZHRo IDQKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2Ug Wy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8YjJiNWJmNWQ2NDZjNjg2NDc1Pl0K L0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hMD AAAXABcKZW5kc3RyZWFtCmVuZG9iagoKMTY5NCAwIG9iago8PAovVHlwZSAv WE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTY5NAovV2lkdGgg NAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiAyIDw4ODhkOTE1ZDVhNmM1ZDY0NmM+XQov TGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaEwMA ABcAFwplbmRzdHJlYW0KZW5kb2JqCgoxNjk1IDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNjk1Ci9XaWR0aCA2 Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsv SW5kZXhlZCAvRGV2aWNlUkdCIDMgPDg4OGQ5MTVkNWE2YzUzNWE2M2QyY2Fk MT5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFt CnjakywAAACkAIoKZW5kc3RyZWFtCmVuZG9iagoKMTY5NiAwIG9iago8PAov VHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTY5Ngov V2lkdGggMTAKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8NWQ2NDZjNWQ1YTZjNTM1 YTYzZTdkZWUzPl0KL0xlbmd0aCAxMQovRmlsdGVyIC9GbGF0ZURlY29kZQo+ PgpzdHJlYW0KeNpjDSsAAAEuAMwKZW5kc3RyZWFtCmVuZG9iagoKMTY5NyAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltMTY5NwovV2lkdGggMjIKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50 IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMTAgPDVkNWE2 YzUzNWE2MzY4NjQ3NTdkODI4N2M3Y2FkMWJjYjVjOGE3YTFhM2M3YmZjODVk NjQ2YzkyOGQ5YTlkYTFhYz5dCi9MZW5ndGggMTkKL0ZpbHRlciAvRmxhdGVE ZWNvZGUKPj4Kc3RyZWFtCnjaY2QyYHBlSO+QbOACAAk1AgsKZW5kc3RyZWFt CmVuZG9iagoKMTY5OCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlw ZSAvSW1hZ2UKL05hbWUgL0ltMTY5OAovV2lkdGggNAovSGVpZ2h0IDEKL0Jp dHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rldmlj ZVJHQiAyIDxlN2U4ZjY1ZDVhNmNhN2ExYTM+XQovTGVuZ3RoIDkKL0ZpbHRl ciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaEwMAABcAFwplbmRzdHJlYW0K ZW5kb2JqCgoxNjk5IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBl IC9JbWFnZQovTmFtZSAvSW0xNjk5Ci9XaWR0aCA1Ci9IZWlnaHQgMQovQml0 c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNl UkdCIDMgPGQyZDRkYTVkNWE2YzcyNzg3ZWU3ZThlZD5dCi9MZW5ndGggMTAK L0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaEzsAAADuANcKZW5k c3RyZWFtCmVuZG9iagoKMTcwMCAwIG9iago8PAovVHlwZSAvWE9iamVjdAov U3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTcwMAovV2lkdGggMwovSGVpZ2h0 IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQg L0RldmljZVJHQiAyIDw2ODZlNzU1ZDY0NmM1ZDVhNmM+XQovTGVuZ3RoIDkK L0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjakwAAABkAGQplbmRz dHJlYW0KZW5kb2JqCgoxNzAxIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9T dWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNzAxCi9XaWR0aCA0Ci9IZWlnaHQg MQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAv RGV2aWNlUkdCIDIgPGM3Y2FkMTVkNjQ2YzVkNWE2Yz5dCi9MZW5ndGggOQov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTBAAAGgAaCmVuZHN0 cmVhbQplbmRvYmoKCjE3MDIgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1 YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE3MDIKL1dpZHRoIDEKL0hlaWdodCAx Ci9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9E ZXZpY2VSR0IgMCA8ZTdlOGVkPl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRl RGVjb2RlCj4+CnN0cmVhbQp42mMAAAABAAEKZW5kc3RyZWFtCmVuZG9iagoK MTcwMyAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UK L05hbWUgL0ltMTcwMwovV2lkdGggNAovSGVpZ2h0IDEKL0JpdHNQZXJDb21w b25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxIDxj N2NhZDE1ZDY0NmM+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUK Pj4Kc3RyZWFtCnjaEwUAABYAFgplbmRzdHJlYW0KZW5kb2JqCgoxNzA0IDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW0xNzA0Ci9XaWR0aCAxNwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg NAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA1IDw3MjZlNzU1 ZDVhNmM1ZDY0NmNlN2RlZTNhN2FiYWNkMmQ0ZGE+XQovTGVuZ3RoIDE3Ci9G aWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUElR2UlJSDAAABTUB TwplbmRzdHJlYW0KZW5kb2JqCgoxNzA1IDAgb2JqCjw8Ci9UeXBlIC9YT2Jq ZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNzA1Ci9XaWR0aCA1Ci9I ZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5k ZXhlZCAvRGV2aWNlUkdCIDIgPDVkNjQ2YzVkNWE2Y2IyYjViNT5dCi9MZW5n dGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY2wAAACE AIIKZW5kc3RyZWFtCmVuZG9iagoKMTcwNiAwIG9iago8PAovVHlwZSAvWE9i amVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTcwNgovV2lkdGggNwov SGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0lu ZGV4ZWQgL0RldmljZVJHQiA1IDw2ODY0NmM1ZDY0NmM1ZDVhNmNiMmI1YjVk MmQ0ZGE2ODY0NzU+XQovTGVuZ3RoIDEyCi9GaWx0ZXIgL0ZsYXRlRGVjb2Rl Cj4+CnN0cmVhbQp42mNUdg4AAAFHALgKZW5kc3RyZWFtCmVuZG9iagoKMTcw NyAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05h bWUgL0ltMTcwNwovV2lkdGggNAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25l bnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDxkY2Rl ZTM1ZDY0NmM3ZDgyODc+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjaEwMAABcAFwplbmRzdHJlYW0KZW5kb2JqCgoxNzA4 IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFt ZSAvSW0xNzA4Ci9XaWR0aCA4Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVu dCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPDY4NjQ2 YzVkNjQ2Y2IyYjViNT5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjaEwsFAACDAGwKZW5kc3RyZWFtCmVuZG9iagoKMTcw OSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05h bWUgL0ltMTcwOQovV2lkdGggNwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25l bnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA1IDw4ODhk OTFhN2ExYTNiMmI1YjU2ODY0NzU1ZDVhNmM1ZDY0NmM+XQovTGVuZ3RoIDEy Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUdnUAAAE7AKoK ZW5kc3RyZWFtCmVuZG9iagoKMTcxMCAwIG9iago8PAovVHlwZSAvWE9iamVj dAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTcxMAovV2lkdGggNQovSGVp Z2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4 ZWQgL0RldmljZVJHQiAzIDxkY2RlZTM1ZDVhNmM1MzVhNjM1ZDY0NmM+XQov TGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42pM+ AAAA+ADcCmVuZHN0cmVhbQplbmRvYmoKCjE3MTEgMCBvYmoKPDwKL1R5cGUg L1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE3MTEKL1dpZHRo IDQKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2Ug Wy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8ZTdlOGVkNWQ2NDZjODg4Mjg3Pl0K L0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hMD AAAXABcKZW5kc3RyZWFtCmVuZG9iagoKMTcxMiAwIG9iago8PAovVHlwZSAv WE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTcxMgovV2lkdGgg NAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiAyIDw5MjhkOWE1ZDVhNmM5Mjk3YTM+XQov TGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaEwMA ABcAFwplbmRzdHJlYW0KZW5kb2JqCgoxNzEzIDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNzEzCi9XaWR0aCA4 Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsv SW5kZXhlZCAvRGV2aWNlUkdCIDEgPDVkNWE2YzVkNjQ2Yz5dCi9MZW5ndGgg MTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaE3QEAABlAFMK ZW5kc3RyZWFtCmVuZG9iagoKMTcxNCAwIG9iago8PAovVHlwZSAvWE9iamVj dAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTcxNAovV2lkdGggMTcKL0hl aWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRl eGVkIC9EZXZpY2VSR0IgNyA8ZDJkNGRhNWQ2NDZjNWQ1YTZjOTI5NzlhNjg2 ZTc1NzI3ODdlNjg2NDZjZGNkZWUzPl0KL0xlbmd0aCAxNwovRmlsdGVyIC9G bGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVFIUMhFSNSsAAAUMAWgKZW5kc3Ry ZWFtCmVuZG9iagoKMTcxNSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3Vi dHlwZSAvSW1hZ2UKL05hbWUgL0ltMTcxNQovV2lkdGggNwovSGVpZ2h0IDEK L0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rl dmljZVJHQiA2IDw2ODY0NmM3MjZlNzU4ODhkOTE3ZDc4N2U1ZDVhNmM1ZDY0 NmNkMmQ0ZGE+XQovTGVuZ3RoIDEyCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+ CnN0cmVhbQp42mNUdk0AAAFbAMoKZW5kc3RyZWFtCmVuZG9iagoKMTcxNiAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltMTcxNgovV2lkdGggNQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg MgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDxlN2U4ZWQ1 ZDVhNmM1ZDY0NmM+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2Rl Cj4+CnN0cmVhbQp42pNsAAAAtACaCmVuZHN0cmVhbQplbmRvYmoKCjE3MTcg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTE3MTcKL1dpZHRoIDgKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50 IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNCA8Njg2ZTc1 NWQ2NDZjNWQ1YTZjOTI4ZDlhNjg2NDZjPl0KL0xlbmd0aCAxMgovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVHZUBAABFACHCmVuZHN0cmVh bQplbmRvYmoKCjE3MTggMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5 cGUgL0ltYWdlCi9OYW1lIC9JbTE3MTgKL1dpZHRoIDcKL0hlaWdodCAxCi9C aXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZp Y2VSR0IgNSA8YjJiNWI1N2Q3ODdlODg4ZDkxNjg2NDZjNjg2NDc1NWQ2NDZj Pl0KL0xlbmd0aCAxMgovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0K eNpjVHYNAAABSwC6CmVuZHN0cmVhbQplbmRvYmoKCjE3MTkgMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE3MTkK L1dpZHRoIDgKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8Njg2ZTc1NWQ1YTZjNWQ2 NDZjZTdkZWUzPl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+ PgpzdHJlYW0KeNqTXA0AAN8AxQplbmRzdHJlYW0KZW5kb2JqCgoxNzIwIDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW0xNzIwCi9XaWR0aCA3Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAy Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMgPDY4NjQ2YzVk NjQ2YzVkNWE2YzY4NmU3NT5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVE ZWNvZGUKPj4Kc3RyZWFtCnjaE50DAADIALIKZW5kc3RyZWFtCmVuZG9iagoK MTcyMSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UK L05hbWUgL0ltMTcyMQovV2lkdGggNQovSGVpZ2h0IDEKL0JpdHNQZXJDb21w b25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAzIDw3 ZDc4N2U1ZDY0NmM1ZDVhNmNiMmI1YjU+XQovTGVuZ3RoIDEwCi9GaWx0ZXIg L0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42pM8AAAA9ADaCmVuZHN0cmVhbQpl bmRvYmoKCjE3MjIgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTE3MjIKL1dpZHRoIDcKL0hlaWdodCAxCi9CaXRz UGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VS R0IgMiA8YzdjYWQxNWQ1YTZjNWQ2NDZjPl0KL0xlbmd0aCAxMAovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTywAAAJYAfwplbmRzdHJlYW0K ZW5kb2JqCgoxNzIzIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBl IC9JbWFnZQovTmFtZSAvSW0xNzIzCi9XaWR0aCA0Ci9IZWlnaHQgMQovQml0 c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNl UkdCIDMgPGRjZGVlMzVkNWE2YzVkNjQ2YzdkODI4Nz5dCi9MZW5ndGggOQov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTBgAAHAAcCmVuZHN0 cmVhbQplbmRvYmoKCjE3MjQgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1 YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE3MjQKL1dpZHRoIDgKL0hlaWdodCAx Ci9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9E ZXZpY2VSR0IgNCA8N2Q3ODg3NWQ1YTZjNTM1YTYzNzI2ZTc1NWQ2NDZjPl0K L0xlbmd0aCAxMgovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpj VDQUAQAA4QBoCmVuZHN0cmVhbQplbmRvYmoKCjE3MjUgMCBvYmoKPDwKL1R5 cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE3MjUKL1dp ZHRoIDcKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3Bh Y2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8ODg4Mjg3NWQ1YTZjNWQ2NDZj YmNiNWM4Pl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+Pgpz dHJlYW0KeNqTXAMAAOAAxgplbmRzdHJlYW0KZW5kb2JqCgoxNzI2IDAgb2Jq Cjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0x NzI2Ci9XaWR0aCA0Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9D b2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPDVkNWE2YzVkNjQ2 YzY4NjQ2Yz5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+Pgpz dHJlYW0KeNpjAwAABwAHCmVuZHN0cmVhbQplbmRvYmoKCjE3MjcgMCBvYmoK PDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE3 MjcKL1dpZHRoIDQKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0Nv bG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8OWRhMWEzNWQ2NDZj YzdiZmM4Pl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0 cmVhbQp42hMDAAAXABcKZW5kc3RyZWFtCmVuZG9iagoKMTcyOCAwIG9iago8 PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTcy OAovV2lkdGggNAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29s b3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAzIDxkY2Q0ZGE1ZDY0NmM1 ZDVhNmM2ODY0NmM+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUK Pj4Kc3RyZWFtCnjakwYAABwAHAplbmRzdHJlYW0KZW5kb2JqCgoxNzI5IDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW0xNzI5Ci9XaWR0aCA4Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAy Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPDVkNjQ2YzVk NWE2YzdkNzg4Nz5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUK Pj4Kc3RyZWFtCnjaE3UDAAByAFwKZW5kc3RyZWFtCmVuZG9iagoKMTczMCAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltMTczMAovV2lkdGggOAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg NAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA0IDw1ZDY0NmM1 MzVhNjM3Mjc4ODc1ZDVhNmM5Mjk3OWE+XQovTGVuZ3RoIDEyCi9GaWx0ZXIg L0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNkMmABAAByADgKZW5kc3RyZWFt CmVuZG9iagoKMTczMSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlw ZSAvSW1hZ2UKL05hbWUgL0ltMTczMQovV2lkdGggNwovSGVpZ2h0IDEKL0Jp dHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rldmlj ZVJHQiAyIDw1ZDY0NmM1ZDVhNmNkY2RlZTM+XQovTGVuZ3RoIDEwCi9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mPkAAAADAAKCmVuZHN0cmVh bQplbmRvYmoKCjE3MzIgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5 cGUgL0ltYWdlCi9OYW1lIC9JbTE3MzIKL1dpZHRoIDYKL0hlaWdodCAxCi9C aXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZp Y2VSR0IgMSA8NWQ2NDZjNzI2ZTc1Pl0KL0xlbmd0aCAxMAovRmlsdGVyIC9G bGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjEAAAABIAEQplbmRzdHJlYW0KZW5k b2JqCgoxNzMzIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9J bWFnZQovTmFtZSAvSW0xNzMzCi9XaWR0aCA0Ci9IZWlnaHQgMQovQml0c1Bl ckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdC IDIgPDVkNjQ2YzVkNWE2YzY4NjQ2Yz5dCi9MZW5ndGggOQovRmlsdGVyIC9G bGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTAgAAEwATCmVuZHN0cmVhbQplbmRv YmoKCjE3MzQgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0lt YWdlCi9OYW1lIC9JbTE3MzQKL1dpZHRoIDgKL0hlaWdodCAxCi9CaXRzUGVy Q29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0Ig NCA8YTdhYmI1NWQ2NDZjNWQ1YTZjODg4Mjg3Njg2NDZjPl0KL0xlbmd0aCAx MgovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjFDIUAQAAtABZ CmVuZHN0cmVhbQplbmRvYmoKCjE3MzUgMCBvYmoKPDwKL1R5cGUgL1hPYmpl Y3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE3MzUKL1dpZHRoIDcKL0hl aWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRl eGVkIC9EZXZpY2VSR0IgMiA8YTdhYmI1NWQ2NDZjYjJiNWJmPl0KL0xlbmd0 aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTjQAAAIQA bgplbmRzdHJlYW0KZW5kb2JqCgoxNzM2IDAgb2JqCjw8Ci9UeXBlIC9YT2Jq ZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNzM2Ci9XaWR0aCA4Ci9I ZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5k ZXhlZCAvRGV2aWNlUkdCIDMgPDY4NjQ2YzVkNjQ2YzVkNWE2Y2U3ZThlZD5d Ci9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja E5kNAADFALAKZW5kc3RyZWFtCmVuZG9iagoKMTczNyAwIG9iago8PAovVHlw ZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTczNwovV2lk dGggNQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFj ZSBbL0luZGV4ZWQgL0RldmljZVJHQiAzIDw3ZDgyODc1ZDY0NmM1ZDVhNmM5 MjhkOWE+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0 cmVhbQp42hM7AAAA7gDXCmVuZHN0cmVhbQplbmRvYmoKCjE3MzggMCBvYmoK PDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE3 MzgKL1dpZHRoIDQKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0Nv bG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8Njg2NDZjNWQ2NDZj YmNiZmJmPl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0 cmVhbQp42hMDAAAXABcKZW5kc3RyZWFtCmVuZG9iagoKMTczOSAwIG9iago8 PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTcz OQovV2lkdGggNgovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29s b3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA0IDxkY2RlZTM1ZDVhNmM2 ODY0NmM1ZDY0NmM3Mjc4N2U+XQovTGVuZ3RoIDExCi9GaWx0ZXIgL0ZsYXRl RGVjb2RlCj4+CnN0cmVhbQp42mNUNAEAAHwAVwplbmRzdHJlYW0KZW5kb2Jq CgoxNzQwIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFn ZQovTmFtZSAvSW0xNzQwCi9XaWR0aCA0Ci9IZWlnaHQgMQovQml0c1BlckNv bXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMg PGRjZGVkYTY4NjQ2YzVkNjQ2YzdkODI4Nz5dCi9MZW5ndGggOQovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTBgAAHAAcCmVuZHN0cmVhbQpl bmRvYmoKCjE3NDEgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTE3NDEKL1dpZHRoIDcKL0hlaWdodCAxCi9CaXRz UGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VS R0IgNCA8NzI2ZTc1NWQ2NDZjODg4ZDkxYzdjYWQxNjg2NDZjPl0KL0xlbmd0 aCAxMgovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVHZxAAAB OQCpCmVuZHN0cmVhbQplbmRvYmoKCjE3NDIgMCBvYmoKPDwKL1R5cGUgL1hP YmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE3NDIKL1dpZHRoIDYK L0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9J bmRleGVkIC9EZXZpY2VSR0IgNCA8YmNiZmJmNWQ2NDZjNWQ1YTZjNjg2NDc1 ZGNkZWRhPl0KL0xlbmd0aCAxMQovRmlsdGVyIC9GbGF0ZURlY29kZQo+Pgpz dHJlYW0KeNpjVDIBAAB+AFgKZW5kc3RyZWFtCmVuZG9iagoKMTc0MyAwIG9i ago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0lt MTc0MwovV2lkdGggNAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgov Q29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAzIDw1MzVhNjM1ZDY0 NmM1ZDVhNmM4ODhkOTE+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjakwYAABwAHAplbmRzdHJlYW0KZW5kb2JqCgoxNzQ0 IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFt ZSAvSW0xNzQ0Ci9XaWR0aCAzCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVu dCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPDY4NjQ2 YzY4NjQ3NTY4NmU3NT5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNqTAAAAGQAZCmVuZHN0cmVhbQplbmRvYmoKCjE3NDUg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTE3NDUKL1dpZHRoIDMKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50 IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8Njg2ZTc1 Njg2NDc1Pl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0 cmVhbQp42hMAAAARABEKZW5kc3RyZWFtCmVuZG9iagoKMTc0NiAwIG9iago8 PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTc0 NgovV2lkdGggNwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29s b3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA0IDw1ZDY0NmM1ZDVhNmM3 MjZlNzU2ODY0NmM4ODhkOTE+XQovTGVuZ3RoIDEyCi9GaWx0ZXIgL0ZsYXRl RGVjb2RlCj4+CnN0cmVhbQp42mMUMnAAAADeAIQKZW5kc3RyZWFtCmVuZG9i agoKMTc0NyAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1h Z2UKL05hbWUgL0ltMTc0NwovV2lkdGggMwovSGVpZ2h0IDEKL0JpdHNQZXJD b21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAy IDxkMmQ0ZGE1ZDY0NmM3ZDc4ODc+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxh dGVEZWNvZGUKPj4Kc3RyZWFtCnjakwAAABkAGQplbmRzdHJlYW0KZW5kb2Jq CgoxNzQ4IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFn ZQovTmFtZSAvSW0xNzQ4Ci9XaWR0aCA0Ci9IZWlnaHQgMQovQml0c1BlckNv bXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMg PDY4NmU3NTcyNzg3ZTcyNmU3NTlkYTFhMz5dCi9MZW5ndGggOQovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTBgAAHAAcCmVuZHN0cmVhbQpl bmRvYmoKCjE3NDkgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTE3NDkKL1dpZHRoIDUKL0hlaWdodCAxCi9CaXRz UGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VS R0IgMyA8OTI4ZDlhNWQ2NDZjNjg2NDZjODg4ZDlhPl0KL0xlbmd0aCAxMAov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTPAAAAPQA2gplbmRz dHJlYW0KZW5kb2JqCgoxNzUwIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9T dWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNzUwCi9XaWR0aCA1Ci9IZWlnaHQg MQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAv RGV2aWNlUkdCIDMgPDlkYTFhMzY4NmU3NTVkNjQ2Y2JjYmZjOD5dCi9MZW5n dGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjakzoAAAD2 ANsKZW5kc3RyZWFtCmVuZG9iagoKMTc1MSAwIG9iago8PAovVHlwZSAvWE9i amVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTc1MQovV2lkdGggMwov SGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0lu ZGV4ZWQgL0RldmljZVJHQiAxIDw1ZDY0NmM4ODgyODc+XQovTGVuZ3RoIDkK L0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYwEAAAUABQplbmRz dHJlYW0KZW5kb2JqCgoxNzUyIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9T dWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNzUyCi9XaWR0aCA3Ci9IZWlnaHQg MQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAv RGV2aWNlUkdCIDQgPGE3YTFhMzY4NjQ2Y2U3ZThlZDcyNzg3ZTdkNzg4Nz5d Ci9MZW5ndGggMTIKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja Y2QyMQAAAKYAaAplbmRzdHJlYW0KZW5kb2JqCgoxNzUzIDAgb2JqCjw8Ci9U eXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNzUzCi9X aWR0aCA2Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNw YWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPGU3ZThlZDY4NjQ2YzdkNzg4 Nz5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFt CnjaE20AAACsAJYKZW5kc3RyZWFtCmVuZG9iagoKMTc1NCAwIG9iago8PAov VHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTc1NAov V2lkdGggNAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JT cGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDw1ZDVhNmM1ZDY0NmNkY2Rl ZTM+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFt CnjaYwMAAAcABwplbmRzdHJlYW0KZW5kb2JqCgoxNzU1IDAgb2JqCjw8Ci9U eXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNzU1Ci9X aWR0aCA0Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNw YWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMgPDVkNjQ2YzVkNWE2YzUzNWE2 MzcyNzg3ZT5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+Pgpz dHJlYW0KeNqTBgAAHAAcCmVuZHN0cmVhbQplbmRvYmoKCjE3NTYgMCBvYmoK PDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE3 NTYKL1dpZHRoIDUKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0Nv bG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8NWQ2NDZjNWQ1YTZj Pl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0K eNpjZQAAAAwABgplbmRzdHJlYW0KZW5kb2JqCgoxNzU3IDAgb2JqCjw8Ci9U eXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNzU3Ci9X aWR0aCA0Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNw YWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPDVkNjQ2YzVkNWE2YzcyNzg3 ZT5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0K eNoTAwAAFwAXCmVuZHN0cmVhbQplbmRvYmoKCjE3NTggMCBvYmoKPDwKL1R5 cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE3NTgKL1dp ZHRoIDUKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3Bh Y2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8NWQ2NDZjNWQ1YTZjYmNiZmM4 Pl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0K eNoTbQAAAKwAlgplbmRzdHJlYW0KZW5kb2JqCgoxNzU5IDAgb2JqCjw8Ci9U eXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNzU5Ci9X aWR0aCA0Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNw YWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEgPDY4NjQ2YzdkNzg3ZT5dCi9M ZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjBAAA AgACCmVuZHN0cmVhbQplbmRvYmoKCjE3NjAgMCBvYmoKPDwKL1R5cGUgL1hP YmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE3NjAKL1dpZHRoIDMK L0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9J bmRleGVkIC9EZXZpY2VSR0IgMiA8YTdhMWEzOWRhMWFjYjJiNWI1Pl0KL0xl bmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42pMAAAAZ ABkKZW5kc3RyZWFtCmVuZG9iagoKMTc2MSAwIG9iago8PAovVHlwZSAvWE9i amVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTc2MQovV2lkdGggMwov SGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0lu ZGV4ZWQgL0RldmljZVJHQiAxIDw5ZDk3YTNiY2JmYmY+XQovTGVuZ3RoIDkK L0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYwEAAAUABQplbmRz dHJlYW0KZW5kb2JqCgoxNzYyIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9T dWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNzYyCi9XaWR0aCAzCi9IZWlnaHQg MQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAv RGV2aWNlUkdCIDIgPDdkODI4NzdkNzg3ZWE3YTFhMz5dCi9MZW5ndGggOQov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTAAAAGQAZCmVuZHN0 cmVhbQplbmRvYmoKCjE3NjMgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1 YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE3NjMKL1dpZHRoIDMKL0hlaWdodCAx Ci9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9E ZXZpY2VSR0IgMSA8NWQ2NDZjN2Q3ODg3Pl0KL0xlbmd0aCA5Ci9GaWx0ZXIg L0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMBAAAFAAUKZW5kc3RyZWFtCmVu ZG9iagoKMTc2NCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAv SW1hZ2UKL05hbWUgL0ltMTc2NAovV2lkdGggMwovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiAxIDw1ZDY0NmM4ODhkOTE+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVE ZWNvZGUKPj4Kc3RyZWFtCnjaYwEAAAUABQplbmRzdHJlYW0KZW5kb2JqCgox NzY1IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQov TmFtZSAvSW0xNzY1Ci9XaWR0aCA4Ci9IZWlnaHQgMQovQml0c1BlckNvbXBv bmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPDky OTc5YTkyOGQ5YTg4OGQ5MT5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVE ZWNvZGUKPj4Kc3RyZWFtCnjaE5wKAAC5AKcKZW5kc3RyZWFtCmVuZG9iagoK MTc2NiAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UK L05hbWUgL0ltMTc2NgovV2lkdGggMgovSGVpZ2h0IDEKL0JpdHNQZXJDb21w b25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxIDxk MmQ0ZGE3MjZlNzU+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUK Pj4Kc3RyZWFtCnjaEwAAABEAEQplbmRzdHJlYW0KZW5kb2JqCgoxNzY3IDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW0xNzY3Ci9XaWR0aCAzCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAy Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEgPDVkNjQ2Yzky OTc5YT5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl YW0KeNpjAQAABQAFCmVuZHN0cmVhbQplbmRvYmoKCjE3NjggMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE3NjgK L1dpZHRoIDMKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8NWQ1YTZjNWQ2NDZjN2Q3 ODg3Pl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVh bQp42pMAAAAZABkKZW5kc3RyZWFtCmVuZG9iagoKMTc2OSAwIG9iago8PAov VHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTc2OQov V2lkdGggOAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JT cGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxIDw1ZDY0NmM1ZDVhNmM+XQov TGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hMV BAAAPQAnCmVuZHN0cmVhbQplbmRvYmoKCjE3NzAgMCBvYmoKPDwKL1R5cGUg L1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE3NzAKL1dpZHRo IDMKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2Ug Wy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8OWQ5N2EzNWQ1YTZjNjg2NDc1Pl0K L0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42pMA AAAZABkKZW5kc3RyZWFtCmVuZG9iagoKMTc3MSAwIG9iago8PAovVHlwZSAv WE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTc3MQovV2lkdGgg MwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiAyIDw1ZDY0NmM1ZDVhNmM5MjhkOWE+XQov TGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjakwAA ABkAGQplbmRzdHJlYW0KZW5kb2JqCgoxNzcyIDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNzcyCi9XaWR0aCA4 Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsv SW5kZXhlZCAvRGV2aWNlUkdCIDEgPDVkNjQ2YzVkNWE2Yz5dCi9MZW5ndGgg MTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaEwwFAAB5AGcK ZW5kc3RyZWFtCmVuZG9iagoKMTc3MyAwIG9iago8PAovVHlwZSAvWE9iamVj dAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTc3MwovV2lkdGggMwovSGVp Z2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4 ZWQgL0RldmljZVJHQiAyIDw3ZDgyODc1ZDVhNmM1ZDY0NmM+XQovTGVuZ3Ro IDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjakwAAABkAGQpl bmRzdHJlYW0KZW5kb2JqCgoxNzc0IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0 Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNzc0Ci9XaWR0aCAzCi9IZWln aHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhl ZCAvRGV2aWNlUkdCIDEgPDVkNWE2YzkyOGQ5YT5dCi9MZW5ndGggOQovRmls dGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjAQAABQAFCmVuZHN0cmVh bQplbmRvYmoKCjE3NzUgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5 cGUgL0ltYWdlCi9OYW1lIC9JbTE3NzUKL1dpZHRoIDEKL0hlaWdodCAxCi9C aXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZp Y2VSR0IgMCA8ZGNkZWUzPl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVj b2RlCj4+CnN0cmVhbQp42mMAAAABAAEKZW5kc3RyZWFtCmVuZG9iagoKMTc3 NiAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05h bWUgL0ltMTc3NgovV2lkdGggMwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25l bnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxIDw1ZDVh NmM3ZDc4N2U+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4K c3RyZWFtCnjaYwEAAAUABQplbmRzdHJlYW0KZW5kb2JqCgoxNzc3IDAgb2Jq Cjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0x Nzc3Ci9XaWR0aCAyCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9D b2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEgPGQyZDRkYWU3ZThl ZD5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0K eNoTAAAAEQARCmVuZHN0cmVhbQplbmRvYmoKCjE3NzggMCBvYmoKPDwKL1R5 cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE3NzgKL1dp ZHRoIDMKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3Bh Y2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8NWQ2NDZjNWQ1YTZjODg4ZDkx Pl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4 2pMAAAAZABkKZW5kc3RyZWFtCmVuZG9iagoKMTc3OSAwIG9iago8PAovVHlw ZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTc3OQovV2lk dGggOAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFj ZSBbL0luZGV4ZWQgL0RldmljZVJHQiA1IDw2ODY0NmM1ZDVhNmM1ZDY0NmM3 ZDgyODc4ODgyODc4ODhkOTE+XQovTGVuZ3RoIDEyCi9GaWx0ZXIgL0ZsYXRl RGVjb2RlCj4+CnN0cmVhbQp42mNUMnEFAAEbAJ0KZW5kc3RyZWFtCmVuZG9i agoKMTc4MCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1h Z2UKL05hbWUgL0ltMTc4MAovV2lkdGggMwovSGVpZ2h0IDEKL0JpdHNQZXJD b21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAy IDxjN2NhYzhkMmQ0ZGFmMWU4ZjY+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxh dGVEZWNvZGUKPj4Kc3RyZWFtCnjakwAAABkAGQplbmRzdHJlYW0KZW5kb2Jq CgoxNzgxIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFn ZQovTmFtZSAvSW0xNzgxCi9XaWR0aCAzCi9IZWlnaHQgMQovQml0c1BlckNv bXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEg PDdkNzg3ZTVkNWE2Yz5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNoTAQAAFQAVCmVuZHN0cmVhbQplbmRvYmoKCjE3ODIg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTE3ODIKL1dpZHRoIDMKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50 IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8YmNiNWM4 YjJiNWI1ZDJkNGRhPl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2Rl Cj4+CnN0cmVhbQp42pMAAAAZABkKZW5kc3RyZWFtCmVuZG9iagoKMTc4MyAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltMTc4MwovV2lkdGggMwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg MgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDxkMmQ0ZGFi MmI1YjVlN2U4ZWQ+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUK Pj4Kc3RyZWFtCnjakwAAABkAGQplbmRzdHJlYW0KZW5kb2JqCgoxNzg0IDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW0xNzg0Ci9XaWR0aCAyCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAy Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEgPGJjYmZjOGJj YmZiZj5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl YW0KeNoTAAAAEQARCmVuZHN0cmVhbQplbmRvYmoKCjE3ODUgMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE3ODUK L1dpZHRoIDgKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNCA8Njg2ZTZjNWQ1YTZjNWQ2 NDZjYzdjYWQxN2Q3ODdlPl0KL0xlbmd0aCAxMgovRmlsdGVyIC9GbGF0ZURl Y29kZQo+PgpzdHJlYW0KeNpjFDJUAQAAxABpCmVuZHN0cmVhbQplbmRvYmoK CjE3ODYgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdl Ci9OYW1lIC9JbTE3ODYKL1dpZHRoIDYKL0hlaWdodCAxCi9CaXRzUGVyQ29t cG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8 OWRhMWEzNWQ1YTZjNWQ2NDZjZTdkZWUzPl0KL0xlbmd0aCAxMAovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoT3QAAANwAxgplbmRzdHJlYW0K ZW5kb2JqCgoxNzg3IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBl IC9JbWFnZQovTmFtZSAvSW0xNzg3Ci9XaWR0aCAzCi9IZWlnaHQgMQovQml0 c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNl UkdCIDIgPDY4NjQ2YzVkNjQ2Yzg4OGQ5MT5dCi9MZW5ndGggOQovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTAAAAGQAZCmVuZHN0cmVhbQpl bmRvYmoKCjE3ODggMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTE3ODgKL1dpZHRoIDQKL0hlaWdodCAxCi9CaXRz UGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VS R0IgMiA8Njg2NDZjNWQ1YTZjNWQ2NDZjPl0KL0xlbmd0aCA5Ci9GaWx0ZXIg L0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hMDAAAXABcKZW5kc3RyZWFtCmVu ZG9iagoKMTc4OSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAv SW1hZ2UKL05hbWUgL0ltMTc4OQovV2lkdGggNgovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiAzIDw5Mjk3OWE1ZDVhNmM1ZDY0NmM4ODgyODc+XQovTGVuZ3RoIDEwCi9G aWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hPbAAAA3gDHCmVuZHN0 cmVhbQplbmRvYmoKCjE3OTAgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1 YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE3OTAKL1dpZHRoIDYKL0hlaWdodCAx Ci9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9E ZXZpY2VSR0IgMiA8NWQ2NDZjNWQ1YTZjNjg2ZTc1Pl0KL0xlbmd0aCAxMAov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVAAAACQAIgplbmRz dHJlYW0KZW5kb2JqCgoxNzkxIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9T dWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNzkxCi9XaWR0aCA2Ci9IZWlnaHQg MQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAv RGV2aWNlUkdCIDIgPDVkNWE2YzVkNjQ2YzdkNzg3ZT5dCi9MZW5ndGggMTAK L0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaE1QAAABEADIKZW5k c3RyZWFtCmVuZG9iagoKMTc5MiAwIG9iago8PAovVHlwZSAvWE9iamVjdAov U3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTc5MgovV2lkdGggOAovSGVpZ2h0 IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQg L0RldmljZVJHQiA0IDw2ODZlNzU1ZDVhNmM1ZDY0NmNiY2I1Yzg4ODhkOTE+ XQovTGVuZ3RoIDEyCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4 2mNUNFQBAADxAHgKZW5kc3RyZWFtCmVuZG9iagoKMTc5MyAwIG9iago8PAov VHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTc5Mwov V2lkdGggNgovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JT cGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAzIDw3MjZlNzU1ZDVhNmM1ZDY0 NmM2ODZlNmM+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+ CnN0cmVhbQp42pPcAAAA5ADKCmVuZHN0cmVhbQplbmRvYmoKCjE3OTQgMCBv YmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9J bTE3OTQKL1dpZHRoIDkKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIK L0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8YTdhYmFjNWQ2 NDZjNWQ1YTZjN2Q3ODdlPl0KL0xlbmd0aCAxMQovRmlsdGVyIC9GbGF0ZURl Y29kZQo+PgpzdHJlYW0KeNqTmnoAAAI7AXAKZW5kc3RyZWFtCmVuZG9iagoK MTc5NSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UK L05hbWUgL0ltMTc5NQovV2lkdGggNwovSGVpZ2h0IDEKL0JpdHNQZXJDb21w b25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDxh N2FiYWM1ZDY0NmM1ZDVhNmM+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRl RGVjb2RlCj4+CnN0cmVhbQp42hNLAQAAkgB7CmVuZHN0cmVhbQplbmRvYmoK CjE3OTYgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdl Ci9OYW1lIC9JbTE3OTYKL1dpZHRoIDgKL0hlaWdodCAxCi9CaXRzUGVyQ29t cG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNSA8 Njg2NDZjNWQ1YTZjNWQ2NDZjYjJiNWJmYjJiNWI1YmNiNWM4Pl0KL0xlbmd0 aCAxMgovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVDIxBQAB CwCNCmVuZHN0cmVhbQplbmRvYmoKCjE3OTcgMCBvYmoKPDwKL1R5cGUgL1hP YmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE3OTcKL1dpZHRoIDcK L0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9J bmRleGVkIC9EZXZpY2VSR0IgMyA8YzdjYWQxNWQ1YTZjNWQ2NDZjODg4Mjg3 Pl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0K eNoTzQEAAJgAggplbmRzdHJlYW0KZW5kb2JqCgoxNzk4IDAgb2JqCjw8Ci9U eXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xNzk4Ci9X aWR0aCA2Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNw YWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPDVkNjQ2YzVkNWE2YzY4NjQ2 Yz5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFt CnjaY1UAAAAsACYKZW5kc3RyZWFtCmVuZG9iagoKMTc5OSAwIG9iago8PAov VHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTc5OQov V2lkdGggMTYKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNSA8NWQ2NDZjNjg2NDZjNWQ1 YTZjOWRhMWFjYmNiZmJmODg4ZDkxPl0KL0xlbmd0aCAxNgovRmlsdGVyIC9G bGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjEGIwYVJiYgUAAgEAcgplbmRzdHJl YW0KZW5kb2JqCgoxODAwIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0 eXBlIC9JbWFnZQovTmFtZSAvSW0xODAwCi9XaWR0aCA4Ci9IZWlnaHQgMQov Qml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2 aWNlUkdCIDQgPDg4ODI4NzVkNjQ2YzUzNWE2MzVkNWE2YzY4NmU3NT5dCi9M ZW5ndGggMTIKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1Q2 EgEAAOkAawplbmRzdHJlYW0KZW5kb2JqCgoxODAxIDAgb2JqCjw8Ci9UeXBl IC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xODAxCi9XaWR0 aCA5Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNl IFsvSW5kZXhlZCAvRGV2aWNlUkdCIDQgPDY4NjQ2YzVkNjQ2YzVkNWE2YzY4 NmU3NTdkNzg3ZT5dCi9MZW5ndGggMTMKL0ZpbHRlciAvRmxhdGVEZWNvZGUK Pj4Kc3RyZWFtCnjaY1RiFnQAAAD9AHgKZW5kc3RyZWFtCmVuZG9iagoKMTgw MiAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05h bWUgL0ltMTgwMgovV2lkdGggNAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25l bnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAzIDw3ZDc4 N2U1ZDVhNmM1ZDY0NmNiY2JmYzg+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxh dGVEZWNvZGUKPj4Kc3RyZWFtCnjakwYAABwAHAplbmRzdHJlYW0KZW5kb2Jq CgoxODAzIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFn ZQovTmFtZSAvSW0xODAzCi9XaWR0aCAzCi9IZWlnaHQgMQovQml0c1BlckNv bXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIg PDVkNjQ2YzY4NjQ2Yzg4OGQ5MT5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0 ZURlY29kZQo+PgpzdHJlYW0KeNqTAAAAGQAZCmVuZHN0cmVhbQplbmRvYmoK CjE4MDQgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdl Ci9OYW1lIC9JbTE4MDQKL1dpZHRoIDgKL0hlaWdodCAxCi9CaXRzUGVyQ29t cG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8 Njg2NDZjNWQ2NDZjNWQ1YTZjPl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0 ZURlY29kZQo+PgpzdHJlYW0KeNqTmgIAAMoArwplbmRzdHJlYW0KZW5kb2Jq CgoxODA1IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFn ZQovTmFtZSAvSW0xODA1Ci9XaWR0aCAzCi9IZWlnaHQgMQovQml0c1BlckNv bXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEg PDg4OGQ5MTVkNWE2Yz5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNoTAQAAFQAVCmVuZHN0cmVhbQplbmRvYmoKCjE4MDYg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTE4MDYKL1dpZHRoIDEKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50 IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMCA8YjJiNWI1 Pl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4 2mMAAAABAAEKZW5kc3RyZWFtCmVuZG9iagoKMTgwNyAwIG9iago8PAovVHlw ZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTgwNwovV2lk dGggNgovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFj ZSBbL0luZGV4ZWQgL0RldmljZVJHQiAzIDw4ODgyODc2ODY0NmM1ZDVhNmM5 MjhkOWE+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0 cmVhbQp42pMyAAAAZgBLCmVuZHN0cmVhbQplbmRvYmoKCjE4MDggMCBvYmoK PDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE4 MDgKL1dpZHRoIDEzCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9D b2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDYgPDY4NjQ2YzVkNjQ2 YzVkNWE2YzY4NmU3NTg4OGQ5MTcyNzg3ZTUzNWE2Mz5dCi9MZW5ndGggMTUK L0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1Q0EnJNdAAAA+cB TQplbmRzdHJlYW0KZW5kb2JqCgoxODA5IDAgb2JqCjw8Ci9UeXBlIC9YT2Jq ZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xODA5Ci9XaWR0aCA5Ci9I ZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5k ZXhlZCAvRGV2aWNlUkdCIDMgPDY4NjQ2YzVkNWE2YzVkNjQ2Y2U3ZThlZD5d Ci9MZW5ndGggMTEKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja k5p2AAACPQFxCmVuZHN0cmVhbQplbmRvYmoKCjE4MTAgMCBvYmoKPDwKL1R5 cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE4MTAKL1dp ZHRoIDQKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3Bh Y2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8NWQ2NDZjNWQ1YTZjPl0KL0xl bmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMFAAAG AAYKZW5kc3RyZWFtCmVuZG9iagoKMTgxMSAwIG9iago8PAovVHlwZSAvWE9i amVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTgxMQovV2lkdGggMwov SGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0lu ZGV4ZWQgL0RldmljZVJHQiAxIDw1ZDVhNmM3Mjc4N2U+XQovTGVuZ3RoIDkK L0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYwEAAAUABQplbmRz dHJlYW0KZW5kb2JqCgoxODEyIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9T dWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xODEyCi9XaWR0aCAzCi9IZWlnaHQg MQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAv RGV2aWNlUkdCIDEgPDVkNWE2YzVkNjQ2Yz5dCi9MZW5ndGggOQovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTAQAAFQAVCmVuZHN0cmVhbQpl bmRvYmoKCjE4MTMgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTE4MTMKL1dpZHRoIDQKL0hlaWdodCAxCi9CaXRz UGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VS R0IgMiA8OWRhMWFjNWQ2NDZjODg4Mjg3Pl0KL0xlbmd0aCA5Ci9GaWx0ZXIg L0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hMDAAAXABcKZW5kc3RyZWFtCmVu ZG9iagoKMTgxNCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAv SW1hZ2UKL05hbWUgL0ltMTgxNAovV2lkdGggOAovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiAyIDw1ZDY0NmM1MzVhNjM1ZDVhNmM+XQovTGVuZ3RoIDEwCi9GaWx0ZXIg L0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42pNYAQAA2gDBCmVuZHN0cmVhbQpl bmRvYmoKCjE4MTUgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTE4MTUKL1dpZHRoIDYKL0hlaWdodCAxCi9CaXRz UGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VS R0IgMyA8ODg4ZDkxNWQ1YTZjNjg2NDZjZGNkZWUzPl0KL0xlbmd0aCAxMAov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTMwAAAF4ARwplbmRz dHJlYW0KZW5kb2JqCgoxODE2IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9T dWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xODE2Ci9XaWR0aCAzCi9IZWlnaHQg MQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAv RGV2aWNlUkdCIDIgPDdkNzg4NzVkNWE2YzVkNjQ2Yz5dCi9MZW5ndGggOQov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTAAAAGQAZCmVuZHN0 cmVhbQplbmRvYmoKCjE4MTcgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1 YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE4MTcKL1dpZHRoIDEwCi9IZWlnaHQg MQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAv RGV2aWNlUkdCIDQgPDdkNzg3ZTcyNmU3NTVkNWE2YzY4NjQ2YzVkNjQ2Yz5d Ci9MZW5ndGggMTMKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja YxBSMlIBAAE7AIsKZW5kc3RyZWFtCmVuZG9iagoKMTgxOCAwIG9iago8PAov VHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTgxOAov V2lkdGggMTMKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNyA8NWQ1YTZjNWQ2NDZjODg4 ZDkxZGNkZWUzNTM1YTYzNjg2ZTc1OTI4ZDlhYmNiZmJmPl0KL0xlbmd0aCAx NQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVHZxTWAsAAAE 2gF/CmVuZHN0cmVhbQplbmRvYmoKCjE4MTkgMCBvYmoKPDwKL1R5cGUgL1hP YmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE4MTkKL1dpZHRoIDQK L0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9J bmRleGVkIC9EZXZpY2VSR0IgMSA8NWQ2NDZjNWQ1YTZjPl0KL0xlbmd0aCA5 Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hMBAAAVABUKZW5k c3RyZWFtCmVuZG9iagoKMTgyMCAwIG9iago8PAovVHlwZSAvWE9iamVjdAov U3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTgyMAovV2lkdGggMTIKL0hlaWdo dCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVk IC9EZXZpY2VSR0IgNCA8NWQ1YTZjNWQ2NDZjN2Q3ODdlZTdlOGVkNzI2ZTc1 Pl0KL0xlbmd0aCAxNAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0K eNpjVGZgYGABAAC/ACkKZW5kc3RyZWFtCmVuZG9iagoKMTgyMSAwIG9iago8 PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTgy MQovV2lkdGggOAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29s b3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAzIDw1ZDY0NmM1ZDVhNmM2 ODZlNmM3MjZlNzU+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2Rl Cj4+CnN0cmVhbQp42hPdDwAA6wDVCmVuZHN0cmVhbQplbmRvYmoKCjE4MjIg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTE4MjIKL1dpZHRoIDcKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50 IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNCA8ZTdlOGVk Njg2NDZjNWQ2NDZjNWQ1YTZjN2Q3ODdlPl0KL0xlbmd0aCAxMgovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVDZ2AAABFwCYCmVuZHN0cmVh bQplbmRvYmoKCjE4MjMgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5 cGUgL0ltYWdlCi9OYW1lIC9JbTE4MjMKL1dpZHRoIDMKL0hlaWdodCAxCi9C aXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZp Y2VSR0IgMSA8ODg4Mjg3NWQ2NDZjPl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0Zs YXRlRGVjb2RlCj4+CnN0cmVhbQp42hMBAAAVABUKZW5kc3RyZWFtCmVuZG9i agoKMTgyNCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1h Z2UKL05hbWUgL0ltMTgyNAovV2lkdGggMTIKL0hlaWdodCAxCi9CaXRzUGVy Q29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0Ig MiA8ZGNkZWUzNWQ2NDZjNWQ1YTZjPl0KL0xlbmd0aCAxMQovRmlsdGVyIC9G bGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTy4wEAAFwANkKZW5kc3RyZWFtCmVu ZG9iagoKMTgyNSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAv SW1hZ2UKL05hbWUgL0ltMTgyNQovV2lkdGggMTMKL0hlaWdodCAxCi9CaXRz UGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VS R0IgNiA8NWQ1YTZjODg4Mjg3ZGNkNGRhNWQ2NDZjNzI2ZTc1OWRhMWEzYTdh YmI1Pl0KL0xlbmd0aCAxNQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl YW0KeNpjEGIwCWBOAAACmQD6CmVuZHN0cmVhbQplbmRvYmoKCjE4MjYgMCBv YmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9J bTE4MjYKL1dpZHRoIDQKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIK L0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8NWQ2NDZjNWQ1 YTZjPl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVh bQp42mMBAAAFAAUKZW5kc3RyZWFtCmVuZG9iagoKMTgyNyAwIG9iago8PAov VHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTgyNwov V2lkdGggMwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JT cGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDw1MzVhNjM1ZDVhNmM3ZDc4 N2U+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFt CnjakwAAABkAGQplbmRzdHJlYW0KZW5kb2JqCgoxODI4IDAgb2JqCjw8Ci9U eXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xODI4Ci9X aWR0aCA4Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNw YWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMgPDVkNWE2YzVkNjQ2YzY4NjQ2 YzY4NmU3NT5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4K c3RyZWFtCnjaE5AGAAA9ACwKZW5kc3RyZWFtCmVuZG9iagoKMTgyOSAwIG9i ago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0lt MTgyOQovV2lkdGggNgovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAov Q29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA0IDxkY2Q0ZGE2ODY0 NmM1ZDVhNmM1MzVhNjM1ZDY0NmM+XQovTGVuZ3RoIDExCi9GaWx0ZXIgL0Zs YXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUMgEAAH4AWAplbmRzdHJlYW0KZW5k b2JqCgoxODMwIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9J bWFnZQovTmFtZSAvSW0xODMwCi9XaWR0aCAxMgovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiA2IDw2ODY0NmM1MzVhNjM2ODY0NzVkY2RlZTM5ZDk3YTM1ZDVhNmM1ZDY0 NmM+XQovTGVuZ3RoIDE0Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVh bQp42mNUdk1ICwMABBEBhgplbmRzdHJlYW0KZW5kb2JqCgoxODMxIDAgb2Jq Cjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0x ODMxCi9XaWR0aCAxMwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAov Q29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA3IDw1MzVhNjM1ZDVh NmM4ODgyODdlN2RlZTM2ODZlNzU5Mjk3OWE1ZDY0NmNiY2JmYmY+XQovTGVu Z3RoIDE1Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUFmQJ EysAAALjARYKZW5kc3RyZWFtCmVuZG9iagoKMTgzMiAwIG9iago8PAovVHlw ZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTgzMgovV2lk dGggOQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFj ZSBbL0luZGV4ZWQgL0RldmljZVJHQiA0IDw1ZDY0NmM1ZDVhNmNiMmI1YjVj N2NhZDE3Mjc4N2U+XQovTGVuZ3RoIDEzCi9GaWx0ZXIgL0ZsYXRlRGVjb2Rl Cj4+CnN0cmVhbQp42mMQVBZwAAABEgCFCmVuZHN0cmVhbQplbmRvYmoKCjE4 MzMgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9O YW1lIC9JbTE4MzMKL1dpZHRoIDMKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9u ZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8NWQ2 NDZjNWQ1YTZjPl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+ CnN0cmVhbQp42hMBAAAVABUKZW5kc3RyZWFtCmVuZG9iagoKMTgzNCAwIG9i ago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0lt MTgzNAovV2lkdGggOAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAov Q29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA0IDw2ODY0NmM1ZDVh NmM1ZDY0NmNiMmI1YmZiMmI1YjU+XQovTGVuZ3RoIDEyCi9GaWx0ZXIgL0Zs YXRlRGVjb2RlCj4+CnN0cmVhbQp42mMUMjYBAADYAHsKZW5kc3RyZWFtCmVu ZG9iagoKMTgzNSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAv SW1hZ2UKL05hbWUgL0ltMTgzNQovV2lkdGggNQovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiAzIDxjN2NhZDE1ZDY0NmM1ZDVhNmNlN2U4ZWQ+XQovTGVuZ3RoIDEwCi9G aWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42pM6AAAA9gDbCmVuZHN0 cmVhbQplbmRvYmoKCjE4MzYgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1 YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE4MzYKL1dpZHRoIDUKL0hlaWdodCAx Ci9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9E ZXZpY2VSR0IgNCA8ODg4ZDkxNWQ2NDZjNWQ1YTZjYTdhYmFjZGNkZWUzPl0K L0xlbmd0aCAxMQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpj VHYAAACMAGUKZW5kc3RyZWFtCmVuZG9iagoKMTgzNyAwIG9iago8PAovVHlw ZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTgzNwovV2lk dGggMwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFj ZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDw2ODY0NmM1ZDY0NmNjN2JmYzg+ XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja kwAAABkAGQplbmRzdHJlYW0KZW5kb2JqCgoxODM4IDAgb2JqCjw8Ci9UeXBl IC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xODM4Ci9XaWR0 aCAxMwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFj ZSBbL0luZGV4ZWQgL0RldmljZVJHQiA2IDw3ZDc4ODc1ZDVhNmM2ODY0NmM2 ODY0NzU5ZGExYTM5Mjk3OWE4ODhkOTE+XQovTGVuZ3RoIDE1Ci9GaWx0ZXIg L0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMUMhR0FUwAAAMEAQwKZW5kc3Ry ZWFtCmVuZG9iagoKMTgzOSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3Vi dHlwZSAvSW1hZ2UKL05hbWUgL0ltMTgzOQovV2lkdGggOQovSGVpZ2h0IDEK L0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rl dmljZVJHQiA0IDw1ZDVhNmM1ZDY0NmM2ODZlNzU1MzVhNjNlN2U4ZWQ+XQov TGVuZ3RoIDEzCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNk VDB0AAABEACUCmVuZHN0cmVhbQplbmRvYmoKCjE4NDAgMCBvYmoKPDwKL1R5 cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE4NDAKL1dp ZHRoIDkKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3Bh Y2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8NzI3ODdlNWQ2NDZjNWQ1YTZj Njg2NDZjPl0KL0xlbmd0aCAxMQovRmlsdGVyIC9GbGF0ZURlY29kZQo+Pgpz dHJlYW0KeNqTeskAAAIjAQQKZW5kc3RyZWFtCmVuZG9iagoKMTg0MSAwIG9i ago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0lt MTg0MQovV2lkdGggNwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAov Q29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA1IDw3ZDc4ODc1ZDY0 NmM1ZDVhNmNhN2FiYWM5Mjk3OWE2ODY0NmM+XQovTGVuZ3RoIDEyCi9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUMAkAAAEgAKYKZW5kc3Ry ZWFtCmVuZG9iagoKMTg0MiAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3Vi dHlwZSAvSW1hZ2UKL05hbWUgL0ltMTg0MgovV2lkdGggMwovSGVpZ2h0IDEK L0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rl dmljZVJHQiAyIDw1ZDY0NmM2ODY0NzU4ODhkOTE+XQovTGVuZ3RoIDkKL0Zp bHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjakwAAABkAGQplbmRzdHJl YW0KZW5kb2JqCgoxODQzIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0 eXBlIC9JbWFnZQovTmFtZSAvSW0xODQzCi9XaWR0aCAxNgovSGVpZ2h0IDEK L0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rl dmljZVJHQiA3IDw2ODY0NmM1MzVhNjM1ZDVhNmM1ZDY0NmNkY2RlZTNjN2Nh Yzg3ZDc4N2U2ODZlNzU+XQovTGVuZ3RoIDE2Ci9GaWx0ZXIgL0ZsYXRlRGVj b2RlCj4+CnN0cmVhbQp42mNUMlJ2NStSBgAFlgGJCmVuZHN0cmVhbQplbmRv YmoKCjE4NDQgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0lt YWdlCi9OYW1lIC9JbTE4NDQKL1dpZHRoIDUKL0hlaWdodCAxCi9CaXRzUGVy Q29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0Ig MyA8YTdhYmFjNWQ2NDZjNWQ1YTZjNjg2NDc1Pl0KL0xlbmd0aCAxMAovRmls dGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTOgAAAPYA2wplbmRzdHJl YW0KZW5kb2JqCgoxODQ1IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0 eXBlIC9JbWFnZQovTmFtZSAvSW0xODQ1Ci9XaWR0aCAxNwovSGVpZ2h0IDEK L0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rl dmljZVJHQiA1IDw1ZDVhNmM1ZDY0NmM3ZDgyODc2ODY0NmNhN2ExYTM4ODgy ODc+XQovTGVuZ3RoIDE3Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVh bQp42mMQEhB2ZGBgCAAAAxAAxwplbmRzdHJlYW0KZW5kb2JqCgoxODQ2IDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW0xODQ2Ci9XaWR0aCA4Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAy Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMgPDcyNzg3ZTVk NjQ2YzUzNWE2MzVkNWE2Yz5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVE ZWNvZGUKPj4Kc3RyZWFtCnjak/4LAAE1ARkKZW5kc3RyZWFtCmVuZG9iagoK MTg0NyAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UK L05hbWUgL0ltMTg0NwovV2lkdGggOQovSGVpZ2h0IDEKL0JpdHNQZXJDb21w b25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA0IDxl N2U4ZWQ2ODY0NmM1ZDY0NmM1ZDVhNmM3Mjc4N2U+XQovTGVuZ3RoIDEzCi9G aWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUUjZyAAABnwC5CmVu ZHN0cmVhbQplbmRvYmoKCjE4NDggMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QK L1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE4NDgKL1dpZHRoIDYKL0hlaWdo dCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVk IC9EZXZpY2VSR0IgMiA8Njg2NDZjNWQ1YTZjNWQ2NDZjPl0KL0xlbmd0aCAx MAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTTQAAAIwAdgpl bmRzdHJlYW0KZW5kb2JqCgoxODQ5IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0 Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xODQ5Ci9XaWR0aCAzCi9IZWln aHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhl ZCAvRGV2aWNlUkdCIDIgPDVkNjQ2YzVkNWE2Yzg4ODI4Nz5dCi9MZW5ndGgg OQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTAAAAGQAZCmVu ZHN0cmVhbQplbmRvYmoKCjE4NTAgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QK L1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE4NTAKL1dpZHRoIDE2Ci9IZWln aHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhl ZCAvRGV2aWNlUkdCIDQgPDVkNjQ2YzVkNWE2Y2RjZGVlM2M3YmZjODlkYTFh Mz5dCi9MZW5ndGggMTYKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFt CnjaY2BkZFBmYGQBAACnACsKZW5kc3RyZWFtCmVuZG9iagoKMTg1MSAwIG9i ago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0lt MTg1MQovV2lkdGggOAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgov Q29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAzIDw3Mjc4N2U1ZDY0 NmM3ZDc4ODc1ZDVhNmM+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVj b2RlCj4+CnN0cmVhbQp42hPdCgAA4QDLCmVuZHN0cmVhbQplbmRvYmoKCjE4 NTIgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9O YW1lIC9JbTE4NTIKL1dpZHRoIDgKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9u ZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNCA8Njg2 ZTc1NWQ2NDZjNWQ1YTZjNzI2ZTc1ODg4Mjg3Pl0KL0xlbmd0aCAxMgovRmls dGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVDJUAQAA9AB5CmVuZHN0 cmVhbQplbmRvYmoKCjE4NTMgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1 YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE4NTMKL1dpZHRoIDcKL0hlaWdodCAx Ci9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9E ZXZpY2VSR0IgMiA8NWQ1YTZjNWQ2NDZjZTdlOGY2Pl0KL0xlbmd0aCAxMAov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjjAAAAFwAWgplbmRz dHJlYW0KZW5kb2JqCgoxODU0IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9T dWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xODU0Ci9XaWR0aCA4Ci9IZWlnaHQg MQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAv RGV2aWNlUkdCIDUgPGM3Y2FjODVkNWE2YzVkNjQ2Y2U3ZThlZDY4NjQ2Yzdk Nzg3ZT5dCi9MZW5ndGggMTIKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3Ry ZWFtCnjaY1Q0UQUAAPgAfAplbmRzdHJlYW0KZW5kb2JqCgoxODU1IDAgb2Jq Cjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0x ODU1Ci9XaWR0aCA1Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9D b2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMgPDg4ODI4NzVkNWE2 YzY4NjQ2YzdkODI4Nz5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjakzoAAAD2ANsKZW5kc3RyZWFtCmVuZG9iagoKMTg1 NiAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05h bWUgL0ltMTg1NgovV2lkdGggMwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25l bnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDw2ODZl NzU2ODY0NmM5MjhkOWE+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjakwAAABkAGQplbmRzdHJlYW0KZW5kb2JqCgoxODU3 IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFt ZSAvSW0xODU3Ci9XaWR0aCAxNQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25l bnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA4IDw2ODY0 NzU2ODZlNzU2ODY0NmM3MjZlNzVlN2RlZTNlN2U4ZWQ4ODgyODc1ZDY0NmNk MmQ0ZGE+XQovTGVuZ3RoIDE2Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0 cmVhbQp42mMQYDJ2TS9uAAAFMgHlCmVuZHN0cmVhbQplbmRvYmoKCjE4NTgg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTE4NTgKL1dpZHRoIDQKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50 IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8Njg2NDZj NWQ1YTZjYTdhMWEzPl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2Rl Cj4+CnN0cmVhbQp42hMCAAATABMKZW5kc3RyZWFtCmVuZG9iagoKMTg1OSAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltMTg1OQovV2lkdGggNwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg NAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA1IDw4ODgyODc2 ODY0NmNkMmQ0ZGFhN2FiYjU3Mjc4N2U3MjZlNzU+XQovTGVuZ3RoIDEyCi9G aWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUdgkAAAFJALkKZW5k c3RyZWFtCmVuZG9iagoKMTg2MCAwIG9iago8PAovVHlwZSAvWE9iamVjdAov U3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTg2MAovV2lkdGggMwovSGVpZ2h0 IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQg L0RldmljZVJHQiAyIDw2ODZlNzU1ZDVhNmM3ZDc4N2U+XQovTGVuZ3RoIDkK L0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjakwAAABkAGQplbmRz dHJlYW0KZW5kb2JqCgoxODYxIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9T dWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xODYxCi9XaWR0aCAzCi9IZWlnaHQg MQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAv RGV2aWNlUkdCIDEgPDdkNzg3ZTlkYTFhMz5dCi9MZW5ndGggOQovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjAQAABQAFCmVuZHN0cmVhbQpl bmRvYmoKCjE4NjIgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTE4NjIKL1dpZHRoIDQKL0hlaWdodCAxCi9CaXRz UGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VS R0IgMyA8YTdhYmI1Njg2NDZjNWQ2NDZjOWQ5N2EzPl0KL0xlbmd0aCA5Ci9G aWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42pMGAAAcABwKZW5kc3Ry ZWFtCmVuZG9iagoKMTg2MyAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3Vi dHlwZSAvSW1hZ2UKL05hbWUgL0ltMTg2MwovV2lkdGggMzAKL0hlaWdodCAz Ci9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9E ZXZpY2VSR0IgMTMgPGRjZGVlM2QyZDRkYWQyY2FkMWM3Y2FjOGM3Y2FkMWM3 YmZjODg4ODI4NzQ4NTA1MDUzNTA1MDUzNTA1OTQ4NDU1MDVkNTA1OTY4NjQ2 YzVkNjQ2Yz5dCi9MZW5ndGggNDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4K c3RyZWFtCnjaYxQEAiVlY2NjZyAOTm/vmNExo6u9o7ujo3NWT1YlkNsxs7yj s6NjxvReAEojEmQKZW5kc3RyZWFtCmVuZG9iagoKMTg2NCAwIG9iago8PAov VHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTg2NAov V2lkdGggMQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JT cGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAwIDxhNzk3ZTM+XQovTGVuZ3Ro IDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYwAAAAEAAQpl bmRzdHJlYW0KZW5kb2JqCgoxODY1IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0 Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xODY1Ci9XaWR0aCAxCi9IZWln aHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhl ZCAvRGV2aWNlUkdCIDAgPDVkODI1MD5dCi9MZW5ndGggOQovRmlsdGVyIC9G bGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjAAAAAQABCmVuZHN0cmVhbQplbmRv YmoKCjE4NjYgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0lt YWdlCi9OYW1lIC9JbTE4NjYKL1dpZHRoIDEKL0hlaWdodCAxCi9CaXRzUGVy Q29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0Ig MCA8YTdhYmQxPl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+ CnN0cmVhbQp42mMAAAABAAEKZW5kc3RyZWFtCmVuZG9iagoKMTg2NyAwIG9i ago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0lt MTg2NwovV2lkdGggOAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAov Q29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA3IDxmMTMxMzVmZmRl ZTNjNzMxMzVlN2RlZTM3MmExNTlkY2U4ZGE3ZGFiNmNjN2RlYzg+XQovTGVu Z3RoIDEyCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUdk0H AAFiANEKZW5kc3RyZWFtCmVuZG9iagoKMTg2OCAwIG9iago8PAovVHlwZSAv WE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTg2OAovV2lkdGgg MTMKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2Ug Wy9JbmRleGVkIC9EZXZpY2VSR0IgMTAgPDg4NTAzNWZjZGVkYWZjZThlZGYx M2IzZWZjMzEzNWZmZDRkYWZjZDRkYWM3MzEzNWRjZThkYTg4YjU3NWM3ZGVi Zj5dCi9MZW5ndGggMTUKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFt CnjaY1RWCUnvXAAABcsCLQplbmRzdHJlYW0KZW5kb2JqCgoxODY5IDAgb2Jq Cjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0x ODY5Ci9XaWR0aCA0Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9D b2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMgPDVkOGQ0N2ZjY2Fj OGZjMzEzNWZmZGVlMz5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNqTBgAAHAAcCmVuZHN0cmVhbQplbmRvYmoKCjE4NzAg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTE4NzAKL1dpZHRoIDEwCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVu dCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDcgPGZjMzEz NWZmZThlZGZjZDRkYWZjNDU0N2ZjY2FkMWZjYWJiNTg4OGQ1OWQyZGVjOD5d Ci9MZW5ndGggMTMKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja Y2QyYU0HAAEfAKQKZW5kc3RyZWFtCmVuZG9iagoKMTg3MSAwIG9iago8PAov VHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTg3MQov V2lkdGggNAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JT cGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAzIDxjNzMxMzVmY2NhYzhmYzMx MzVmZmRlZTM+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4K c3RyZWFtCnjakwYAABwAHAplbmRzdHJlYW0KZW5kb2JqCgoxODcyIDAgb2Jq Cjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0x ODcyCi9XaWR0aCAxMAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAov Q29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA1IDxmMTMxMzVmY2Rl ZGFmYzMxMzVmY2NhZDFmY2FiYmZkMmRlYzg+XQovTGVuZ3RoIDEzCi9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUZGZRBQAAxABPCmVuZHN0 cmVhbQplbmRvYmoKCjE4NzMgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1 YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE4NzMKL1dpZHRoIDYKL0hlaWdodCAx Ci9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9E ZXZpY2VSR0IgNCA8NzJhMTU5ZmNiNWI1ZmMzMTM1ZmNjYWM4ZmNkZWRhPl0K L0xlbmd0aCAxMQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpj VFYBAABwAEkKZW5kc3RyZWFtCmVuZG9iagoKMTg3NCAwIG9iago8PAovVHlw ZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTg3NAovV2lk dGggOAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFj ZSBbL0luZGV4ZWQgL0RldmljZVJHQiA2IDxmMTMxMzVmY2Q0ZGFmYzNiM2Vm Y2NhZDFmYzMxMzVmY2FiYjVmYzk3OWE+XQovTGVuZ3RoIDEyCi9GaWx0ZXIg L0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUdnUDAAFBALAKZW5kc3RyZWFt CmVuZG9iagoKMTg3NSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlw ZSAvSW1hZ2UKL05hbWUgL0ltMTg3NQovV2lkdGggNgovSGVpZ2h0IDEKL0Jp dHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rldmlj ZVJHQiA0IDw4OGFiNmNmY2I1YjVmYzMxMzVmZmNhYzhmY2RlZGE+XQovTGVu Z3RoIDExCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUVgEA AHAASQplbmRzdHJlYW0KZW5kb2JqCgoxODc2IDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xODc2Ci9XaWR0aCAx MAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiA3IDxlNzMxMzVlN2RlZTNmY2Q0ZGFmMTMx MzVmY2NhZDFmYzNiM2VmY2FiYjVmYzk3OWE+XQovTGVuZ3RoIDEzCi9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNkMgkLBwABsQDlCmVuZHN0 cmVhbQplbmRvYmoKCjE4NzcgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1 YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE4NzcKL1dpZHRoIDE3Ci9IZWlnaHQg MQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAv RGV2aWNlUkdCIDEyIDxmYzk3OWFmY2I1YjVmYzMxMzVmY2NhYzhmMTMxMzVl N2RlZTMxZTFkNmMyODFkNTA5ZDk3YTNlNzMxMzVmY2FiYjVmYzNiM2VmYzhk OTE+XQovTGVuZ3RoIDE3Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVh bQp42mNUdk1LS+9cfQAADLwDkQplbmRzdHJlYW0KZW5kb2JqCgoxODc4IDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW0xODc4Ci9XaWR0aCAxNwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg NAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxMCA8ZmM0NTQ3 ZmZiNWJmZmMzMTM1ZmZjYWM4NjgxZDM1MWUxZDZjMTMxZDZjMjgxZDUwYTdh MWEzZjEzMTM1ZmM5NzlhPl0KL0xlbmd0aCAxNwovRmlsdGVyIC9GbGF0ZURl Y29kZQo+PgpzdHJlYW0KeNpjVHZNS0sL71wAAAu+AxwKZW5kc3RyZWFtCmVu ZG9iagoKMTg3OSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAv SW1hZ2UKL05hbWUgL0ltMTg3OQovV2lkdGggMTcKL0hlaWdodCAxCi9CaXRz UGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VS R0IgOCA8ZmMzYjNlZmNiNWI1ZjEzMTM1MzMzMTc1MWUxZDZjMTMxZDZjMTMx ZDc1N2QyNzM1ZmM4ZDkxPl0KL0xlbmd0aCAxNwovRmlsdGVyIC9GbGF0ZURl Y29kZQo+PgpzdHJlYW0KeNpjVHYNC011cW8AAAooAoUKZW5kc3RyZWFtCmVu ZG9iagoKMTg4MCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAv SW1hZ2UKL05hbWUgL0ltMTg4MAovV2lkdGggMTcKL0hlaWdodCAxCi9CaXRz UGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VS R0IgNiA8ZjEzYjNlZmNiNWI1MjgyNzZjMTMxZDZjMTMxZDc1MWUxZDZjODg4 Mjg3Pl0KL0xlbmd0aCAxNwovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl YW0KeNpjVDZxNnZ1MU0AAAfRAe0KZW5kc3RyZWFtCmVuZG9iagoKMTg4MSAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltMTg4MQovV2lkdGggMTcKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50 IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNSA8ZmMzYjNl YTdhYmQxMTMxZDYzMTMxZDc1MTMxZDZjMWUxZDZjPl0KL0xlbmd0aCAxNwov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVHZxMXFxcQ4AAAhU AfwKZW5kc3RyZWFtCmVuZG9iagoKMTg4MiAwIG9iago8PAovVHlwZSAvWE9i amVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTg4MgovV2lkdGggMTcK L0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9J bmRleGVkIC9EZXZpY2VSR0IgNSA8ZmM1MDUwMjgyNzZjMTMxZDc1MTMxZDZj MjgzMTdlMWUyNzc1Pl0KL0xlbmd0aCAxNwovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNpjVDI2Mgk2NlYAAAciAZYKZW5kc3RyZWFtCmVuZG9i agoKMTg4MyAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1h Z2UKL05hbWUgL0ltMTg4MwovV2lkdGggMTcKL0hlaWdodCAxCi9CaXRzUGVy Q29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0Ig MiA8ZDJjYWQxMTMxZDc1MTMxZDZjPl0KL0xlbmd0aCAxMwovRmlsdGVyIC9G bGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTWpW5qgEABj4CWAplbmRzdHJlYW0K ZW5kb2JqCgoxODg0IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBl IC9JbWFnZQovTmFtZSAvSW0xODg0Ci9XaWR0aCAxNwovSGVpZ2h0IDEKL0Jp dHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rldmlj ZVJHQiA0IDw3Mjc4YWMxZTI3N2UxMzFkNmMxMzFkNzUxMzFkNjM+XQovTGVu Z3RoIDE3Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUVlJ2 MlZSUgAABcoBQwplbmRzdHJlYW0KZW5kb2JqCgoxODg1IDAgb2JqCjw8Ci9U eXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xODg1Ci9X aWR0aCAxOAovSGVpZ2h0IDIKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JT cGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA2IDw0ODUwOTExMzFkNmMxMzFk NzUyODMxN2VlN2U4ZjYzZDQ1ODdkY2RlZjY+XQovTGVuZ3RoIDIyCi9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMUFBQSFhJUFAkUBANFMQAN uAGPCmVuZHN0cmVhbQplbmRvYmoKCjE4ODYgMCBvYmoKPDwKL1R5cGUgL1hP YmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE4ODYKL1dpZHRoIDE3 Ci9IZWlnaHQgMwovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsv SW5kZXhlZCAvRGV2aWNlUkdCIDEwIDw1ZDY0YTMzMzNiN2UxMzFkNmMxMzFk NzUxZTI3NmM4ODhkYjUxZTI3NzUxMzFkNjMyODI3NmNlN2U4ZWQxZTFkNmM+ XQovTGVuZ3RoIDMxCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4 2mNUAgFlJYcw8yZlJSUjZYNZQJ6SspHyAgBCiQVnCmVuZHN0cmVhbQplbmRv YmoKCjE4ODcgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0lt YWdlCi9OYW1lIC9JbTE4ODcKL1dpZHRoIDE2Ci9IZWlnaHQgMgovQml0c1Bl ckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdC IDYgPDI4MzE3NTEzMWQ2YzEzMWQ3NTFlMjc2YzFlMjc3NWRjZGVmNjMzMzE3 NT5dCi9MZW5ndGggMjQKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFt CnjaYxRUFBZUEhIJERQUEVQSFAMADFEBhAplbmRzdHJlYW0KZW5kb2JqCgox ODg4IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQov TmFtZSAvSW0xODg4Ci9XaWR0aCAxNAovSGVpZ2h0IDEKL0JpdHNQZXJDb21w b25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA0IDw3 Mjc4YWMxMzFkNzUxMzFkNmMxZTFkNmMxZTI3NmM+XQovTGVuZ3RoIDE1Ci9G aWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMUUlJUUjQBAAKEAM4K ZW5kc3RyZWFtCmVuZG9iagoKMTg4OSAwIG9iago8PAovVHlwZSAvWE9iamVj dAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTg4OQovV2lkdGggMTMKL0hl aWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRl eGVkIC9EZXZpY2VSR0IgNSA8Njg2ZWEzMWUxZDZjMTMxZDc1MTMxZDZjMWUy Nzc1ZTdlOGY2Pl0KL0xlbmd0aCAxNQovRmlsdGVyIC9GbGF0ZURlY29kZQo+ PgpzdHJlYW0KeNpjVDY2MjYJAAAD+AFBCmVuZHN0cmVhbQplbmRvYmoKCjE4 OTAgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9O YW1lIC9JbTE4OTAKL1dpZHRoIDEwCi9IZWlnaHQgMQovQml0c1BlckNvbXBv bmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDYgPGJj YmZkYTFlMjc3NTEzMWQ3NTEzMWQ2YzEzMWQ2MzFlMjc2YzNkNDU4Nz5dCi9M ZW5ndGggMTMKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1Q2 dg4DAAILAPEKZW5kc3RyZWFtCmVuZG9iagoKMTg5MSAwIG9iago8PAovVHlw ZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTg5MQovV2lk dGggNgovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFj ZSBbL0luZGV4ZWQgL0RldmljZVJHQiA0IDwzZDNiODcyODI3NmMxZTI3NmMy ODMxNzU2ODZlYTM+XQovTGVuZ3RoIDExCi9GaWx0ZXIgL0ZsYXRlRGVjb2Rl Cj4+CnN0cmVhbQp42mNUMgEAAH4AWAplbmRzdHJlYW0KZW5kb2JqCgoxODky IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFt ZSAvSW0xODkyCi9XaWR0aCAzCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVu dCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPGYxZThm Njg4ODI4N2RjZGVlMz5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNqTAAAAGQAZCmVuZHN0cmVhbQplbmRvYmoKCjE4OTMg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTE4OTMKL1dpZHRoIDUKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50 IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNCA8ZGNkZWRh Njg2NDZjNWQ1YTZjNWQ2NDZjZDJkNGRhPl0KL0xlbmd0aCAxMQovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVHYAAACMAGUKZW5kc3RyZWFt CmVuZG9iagoKMTg5NCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlw ZSAvSW1hZ2UKL05hbWUgL0ltMTg5NAovV2lkdGggNQovSGVpZ2h0IDEKL0Jp dHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rldmlj ZVJHQiAyIDxiY2JmYzg1ZDY0NmNkMmQ0ZGE+XQovTGVuZ3RoIDEwCi9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hNtAAAArACWCmVuZHN0cmVh bQplbmRvYmoKCjE4OTUgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5 cGUgL0ltYWdlCi9OYW1lIC9JbTE4OTUKL1dpZHRoIDIKL0hlaWdodCAxCi9C aXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZp Y2VSR0IgMSA8ZTdlOGVkZTdkZWUzPl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0Zs YXRlRGVjb2RlCj4+CnN0cmVhbQp42hMAAAARABEKZW5kc3RyZWFtCmVuZG9i agoKMTg5NiAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1h Z2UKL05hbWUgL0ltMTg5NgovV2lkdGggMwovSGVpZ2h0IDEKL0JpdHNQZXJD b21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAx IDxlN2RlZTNiY2JmYzg+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjaEwAAABEAEQplbmRzdHJlYW0KZW5kb2JqCgoxODk3 IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFt ZSAvSW0xODk3Ci9XaWR0aCA1Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVu dCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMgPGJjYjVj ODVkNjQ2YzVkNWE2Y2M3Y2FkMT5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxh dGVEZWNvZGUKPj4Kc3RyZWFtCnjakzoAAAD2ANsKZW5kc3RyZWFtCmVuZG9i agoKMTg5OCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1h Z2UKL05hbWUgL0ltMTg5OAovV2lkdGggNAovSGVpZ2h0IDEKL0JpdHNQZXJD b21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAz IDxlN2U4ZWRjN2JmYzhiY2JmYmZkMmNhZDE+XQovTGVuZ3RoIDkKL0ZpbHRl ciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjakwYAABwAHAplbmRzdHJlYW0K ZW5kb2JqCgoxODk5IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBl IC9JbWFnZQovTmFtZSAvSW0xODk5Ci9XaWR0aCA1Ci9IZWlnaHQgMQovQml0 c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNl UkdCIDQgPDY4NmU3NTVkNWE2YzVkNjQ2YzY4NjQ2YzcyNzg3ZT5dCi9MZW5n dGggMTEKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1R2AAAA jABlCmVuZHN0cmVhbQplbmRvYmoKCjE5MDAgMCBvYmoKPDwKL1R5cGUgL1hP YmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE5MDAKL1dpZHRoIDUK L0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9J bmRleGVkIC9EZXZpY2VSR0IgMiA8OTI5NzlhNWQ2NDZjNWQ1YTZjPl0KL0xl bmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTcwAA AG4AVwplbmRzdHJlYW0KZW5kb2JqCgoxOTAxIDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xOTAxCi9XaWR0aCAx MQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiA2IDxkMmQ0ZGE1ZDY0NmNjN2JmYzg4ODgy ODdiMmI1YjU2ODY0NmM1ZDVhNmM+XQovTGVuZ3RoIDE0Ci9GaWx0ZXIgL0Zs YXRlRGVjb2RlCj4+CnN0cmVhbQp42mMUVBYJEwAAAeUAsAplbmRzdHJlYW0K ZW5kb2JqCgoxOTAyIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBl IC9JbWFnZQovTmFtZSAvSW0xOTAyCi9XaWR0aCA2Ci9IZWlnaHQgMQovQml0 c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNl UkdCIDIgPDVkNjQ2YzY4NjQ2YzVkNWE2Yz5dCi9MZW5ndGggMTAKL0ZpbHRl ciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY0gAAABiAGEKZW5kc3RyZWFt CmVuZG9iagoKMTkwMyAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlw ZSAvSW1hZ2UKL05hbWUgL0ltMTkwMwovV2lkdGggNwovSGVpZ2h0IDEKL0Jp dHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rldmlj ZVJHQiA0IDw4ODgyODc1ZDVhNmM1ZDY0NmM2ODY0NmNiY2JmYzg+XQovTGVu Z3RoIDEyCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUUnYA AAD0AIcKZW5kc3RyZWFtCmVuZG9iagoKMTkwNCAwIG9iago8PAovVHlwZSAv WE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTkwNAovV2lkdGgg NQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiAzIDxkY2RlZTM2ODY0NmM1ZDY0NmNhN2Fi YjU+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVh bQp42pM6AAAA9gDbCmVuZHN0cmVhbQplbmRvYmoKCjE5MDUgMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE5MDUK L1dpZHRoIDMKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8NWQ2NDZjNjg2NDc1Pl0K L0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMB AAAFAAUKZW5kc3RyZWFtCmVuZG9iagoKMTkwNiAwIG9iago8PAovVHlwZSAv WE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTkwNgovV2lkdGgg OAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiA0IDw1ZDVhNmM1ZDY0NmNjN2JmYzg2ODY0 NmNlN2U4ZWQ+XQovTGVuZ3RoIDEyCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+ CnN0cmVhbQp42mNUZjQBAACnAFoKZW5kc3RyZWFtCmVuZG9iagoKMTkwNyAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltMTkwNwovV2lkdGggNgovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg NAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA0IDw3ZDc4N2U1 ZDY0NmM1ZDVhNmM2ODY0NmNiY2JmYzg+XQovTGVuZ3RoIDExCi9GaWx0ZXIg L0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUNAEAAHwAVwplbmRzdHJlYW0K ZW5kb2JqCgoxOTA4IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBl IC9JbWFnZQovTmFtZSAvSW0xOTA4Ci9XaWR0aCA2Ci9IZWlnaHQgMQovQml0 c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNl UkdCIDMgPGM3YmZjODVkNjQ2YzVkNWE2YzY4NjQ3NT5dCi9MZW5ndGggMTAK L0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjakyoAAACmAIsKZW5k c3RyZWFtCmVuZG9iagoKMTkwOSAwIG9iago8PAovVHlwZSAvWE9iamVjdAov U3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTkwOQovV2lkdGggNgovSGVpZ2h0 IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQg L0RldmljZVJHQiAyIDw2ODZlNzU1ZDY0NmM1ZDVhNmM+XQovTGVuZ3RoIDEw Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hNdAAAAzAC2CmVu ZHN0cmVhbQplbmRvYmoKCjE5MTAgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QK L1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE5MTAKL1dpZHRoIDcKL0hlaWdo dCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVk IC9EZXZpY2VSR0IgMSA8Njg2NDZjNWQ2NDZjPl0KL0xlbmd0aCAxMAovRmls dGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTDQAAAHwAZgplbmRzdHJl YW0KZW5kb2JqCgoxOTExIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0 eXBlIC9JbWFnZQovTmFtZSAvSW0xOTExCi9XaWR0aCA3Ci9IZWlnaHQgMQov Qml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2 aWNlUkdCIDMgPDdkODI4NzVkNjQ2YzY4NjQ2YzkyOTdhMz5dCi9MZW5ndGgg MTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaE8sBAACaAIMK ZW5kc3RyZWFtCmVuZG9iagoKMTkxMiAwIG9iago8PAovVHlwZSAvWE9iamVj dAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTkxMgovV2lkdGggNwovSGVp Z2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4 ZWQgL0RldmljZVJHQiAzIDw4ODgyODc1ZDVhNmM1ZDY0NmM3Mjc4N2U+XQov TGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hOb AwAAygCzCmVuZHN0cmVhbQplbmRvYmoKCjE5MTMgMCBvYmoKPDwKL1R5cGUg L1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE5MTMKL1dpZHRo IDExCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNl IFsvSW5kZXhlZCAvRGV2aWNlUkdCIDQgPGRjZDRkYTUzNWE2MzVkNWE2YzVk NjQ2Y2E3YWJiNT5dCi9MZW5ndGggMTQKL0ZpbHRlciAvRmxhdGVEZWNvZGUK Pj4Kc3RyZWFtCnjaY1R2MlEyAAAC0wDtCmVuZHN0cmVhbQplbmRvYmoKCjE5 MTQgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9O YW1lIC9JbTE5MTQKL1dpZHRoIDcKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9u ZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8NWQ2 NDZjNWQ1YTZjOTI4ZDlhPl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURl Y29kZQo+PgpzdHJlYW0KeNpjkAAAABoAGQplbmRzdHJlYW0KZW5kb2JqCgox OTE1IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQov TmFtZSAvSW0xOTE1Ci9XaWR0aCA4Ci9IZWlnaHQgMQovQml0c1BlckNvbXBv bmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPDlk YTFhMzVkNjQ2Y2JjYjVjOD5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVE ZWNvZGUKPj4Kc3RyZWFtCnjaEw0DAACCAGwKZW5kc3RyZWFtCmVuZG9iagoK MTkxNiAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UK L05hbWUgL0ltMTkxNgovV2lkdGggNAovSGVpZ2h0IDEKL0JpdHNQZXJDb21w b25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDw1 ZDY0NmM1ZDVhNmM3ZDc4ODc+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVE ZWNvZGUKPj4Kc3RyZWFtCnjaEwMAABcAFwplbmRzdHJlYW0KZW5kb2JqCgox OTE3IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQov TmFtZSAvSW0xOTE3Ci9XaWR0aCAzCi9IZWlnaHQgMQovQml0c1BlckNvbXBv bmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPDVk NWE2YzVkNjQ2YzdkODI4Nz5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURl Y29kZQo+PgpzdHJlYW0KeNqTAAAAGQAZCmVuZHN0cmVhbQplbmRvYmoKCjE5 MTggMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9O YW1lIC9JbTE5MTgKL1dpZHRoIDgKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9u ZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8NWQ1 YTZjNjg2ZTc1Njg2NDZjPl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURl Y29kZQo+PgpzdHJlYW0KeNpjYQIAAAwABwplbmRzdHJlYW0KZW5kb2JqCgox OTE5IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQov TmFtZSAvSW0xOTE5Ci9XaWR0aCA5Ci9IZWlnaHQgMQovQml0c1BlckNvbXBv bmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDUgPGJj YmZiZjVkNjQ2Y2QyZDRkYWU3ZThlZDVkNWE2YzkyOTdhMz5dCi9MZW5ndGgg MTMKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYxQydAwAAAG3 ANYKZW5kc3RyZWFtCmVuZG9iagoKMTkyMCAwIG9iago8PAovVHlwZSAvWE9i amVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTkyMAovV2lkdGggNwov SGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0lu ZGV4ZWQgL0RldmljZVJHQiAyIDw3ZDc4ODc1ZDVhNmM1ZDY0NmM+XQovTGVu Z3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hNbAQAA 1gC/CmVuZHN0cmVhbQplbmRvYmoKCjE5MjEgMCBvYmoKPDwKL1R5cGUgL1hP YmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE5MjEKL1dpZHRoIDYK L0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9J bmRleGVkIC9EZXZpY2VSR0IgMiA8Njg2ZTc1NWQ2NDZjNWQ1YTZjPl0KL0xl bmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTTQAA AIwAdgplbmRzdHJlYW0KZW5kb2JqCgoxOTIyIDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xOTIyCi9XaWR0aCAx NgovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiA3IDw2ODY0NmM1ZDY0NmM1ZDVhNmM1MzVh NjM3MjZlNzViMmI1YmY2ODY0NzU5Mjk3OWE+XQovTGVuZ3RoIDE2Ci9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMQEhYJElNQBwADTQDpCmVu ZHN0cmVhbQplbmRvYmoKCjE5MjMgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QK L1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE5MjMKL1dpZHRoIDE2Ci9IZWln aHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhl ZCAvRGV2aWNlUkdCIDcgPDg4ODI4NzVkNjQ2YzY4NjQ3NTVkNWE2Y2E3YWJi NWM3YmZjODY4NjQ2Y2IyYjViZj5dCi9MZW5ndGggMTYKL0ZpbHRlciAvRmxh dGVEZWNvZGUKPj4Kc3RyZWFtCnjaYxQSFnYVNE4HAANzASoKZW5kc3RyZWFt CmVuZG9iagoKMTkyNCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlw ZSAvSW1hZ2UKL05hbWUgL0ltMTkyNAovV2lkdGggNAovSGVpZ2h0IDEKL0Jp dHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rldmlj ZVJHQiAzIDw2ODY0NmM1MzVhNjM1ZDVhNmM5ZDk3YTM+XQovTGVuZ3RoIDkK L0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjakwYAABwAHAplbmRz dHJlYW0KZW5kb2JqCgoxOTI1IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9T dWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xOTI1Ci9XaWR0aCAyCi9IZWlnaHQg MQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAv RGV2aWNlUkdCIDEgPDY4NjQ2YzVkNjQ2Yz5dCi9MZW5ndGggOQovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTAAAAEQARCmVuZHN0cmVhbQpl bmRvYmoKCjE5MjYgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTE5MjYKL1dpZHRoIDExCi9IZWlnaHQgMQovQml0 c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNl UkdCIDQgPGQyZDRkYTUzNWE2MzVkNjQ2YzVkNWE2Y2E3YWJiNT5dCi9MZW5n dGggMTQKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1Q2VlFW AAACWQC/CmVuZHN0cmVhbQplbmRvYmoKCjE5MjcgMCBvYmoKPDwKL1R5cGUg L1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE5MjcKL1dpZHRo IDQKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2Ug Wy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8Njg2NDZjNWQ2NDZjNWQ1YTZjNjg2 ZTc1Pl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVh bQp42pMGAAAcABwKZW5kc3RyZWFtCmVuZG9iagoKMTkyOCAwIG9iago8PAov VHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTkyOAov V2lkdGggNAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JT cGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAzIDw2ODZlNzU1ZDY0NmM1ZDVh NmM2ODY0NzU+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4K c3RyZWFtCnjakwYAABwAHAplbmRzdHJlYW0KZW5kb2JqCgoxOTI5IDAgb2Jq Cjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0x OTI5Ci9XaWR0aCAzCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9D b2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEgPDVkNWE2Y2M3Y2Fk MT5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0K eNpjAQAABQAFCmVuZHN0cmVhbQplbmRvYmoKCjE5MzAgMCBvYmoKPDwKL1R5 cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE5MzAKL1dp ZHRoIDE4Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNw YWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDcgPDVkNWE2YzVkNjQ2YzY4NjQ2 Y2YxZThmNmJjYjVjOGQyZDRkYWU3ZThlZDkyOTc5YT5dCi9MZW5ndGggMTcK L0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY2RiYDBhDBMQBwAC YwC2CmVuZHN0cmVhbQplbmRvYmoKCjE5MzEgMCBvYmoKPDwKL1R5cGUgL1hP YmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE5MzEKL1dpZHRoIDMK L0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9J bmRleGVkIC9EZXZpY2VSR0IgMiA8NWQ2NDZjNWQ1YTZjOWRhMWFjPl0KL0xl bmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42pMAAAAZ ABkKZW5kc3RyZWFtCmVuZG9iagoKMTkzMiAwIG9iago8PAovVHlwZSAvWE9i amVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTkzMgovV2lkdGggOAov SGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0lu ZGV4ZWQgL0RldmljZVJHQiA0IDw2ODY0NmM1ZDY0NmM5ZDk3YTNjN2NhZDE1 ZDVhNmM+XQovTGVuZ3RoIDEyCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0 cmVhbQp42mMUMhQBAAC0AFkKZW5kc3RyZWFtCmVuZG9iagoKMTkzMyAwIG9i ago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0lt MTkzMwovV2lkdGggNgovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgov Q29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAzIDw4ODhkOTE3Mjc4 N2U1ZDY0NmM1ZDVhNmM+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVj b2RlCj4+CnN0cmVhbQp42pO+AAABCADsCmVuZHN0cmVhbQplbmRvYmoKCjE5 MzQgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9O YW1lIC9JbTE5MzQKL1dpZHRoIDgKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9u ZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNCA8ODg4 ZDkxNWQ2NDZjNWQ1YTZjNzI3ODdlNjg2NDc1Pl0KL0xlbmd0aCAxMgovRmls dGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVDJUAQAA9AB5CmVuZHN0 cmVhbQplbmRvYmoKCjE5MzUgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1 YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE5MzUKL1dpZHRoIDUKL0hlaWdodCAx Ci9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9E ZXZpY2VSR0IgMyA8ZTdlOGVkNWQ1YTZjNTM1YTYzNjg2NDc1Pl0KL0xlbmd0 aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTPAAAAPQA 2gplbmRzdHJlYW0KZW5kb2JqCgoxOTM2IDAgb2JqCjw8Ci9UeXBlIC9YT2Jq ZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xOTM2Ci9XaWR0aCA1Ci9I ZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5k ZXhlZCAvRGV2aWNlUkdCIDMgPGQyZDRkYTVkNjQ2YzVkNWE2Y2U3ZThlZD5d Ci9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja kzoAAAD2ANsKZW5kc3RyZWFtCmVuZG9iagoKMTkzNyAwIG9iago8PAovVHlw ZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTkzNwovV2lk dGggMTQKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3Bh Y2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgOCA8Njg2ZTc1NWQ2NDZjYmNiZmM4 ZDJkNGRhNWQ1YTZjNTM1YTYzN2Q4Mjg3YjJiNWI1Njg2NDc1Pl0KL0xlbmd0 aCAxNQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVHYJFCuR AAAEugFcCmVuZHN0cmVhbQplbmRvYmoKCjE5MzggMCBvYmoKPDwKL1R5cGUg L1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE5MzgKL1dpZHRo IDYKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2Ug Wy9JbmRleGVkIC9EZXZpY2VSR0IgNCA8ZTdkZWUzYjJiNWI1YTdhYmFjYTdh YmI1NWQ2NDZjPl0KL0xlbmd0aCAxMQovRmlsdGVyIC9GbGF0ZURlY29kZQo+ PgpzdHJlYW0KeNpjVHYBAACQAGkKZW5kc3RyZWFtCmVuZG9iagoKMTkzOSAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltMTkzOQovV2lkdGggNgovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg NAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA1IDw2ODZlNzU1 ZDY0NmM1MzVhNjM1ZDVhNmM3ZDgyODdiY2JmYzg+XQovTGVuZ3RoIDExCi9G aWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUdgUAAJEAagplbmRz dHJlYW0KZW5kb2JqCgoxOTQwIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9T dWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xOTQwCi9XaWR0aCA0Ci9IZWlnaHQg MQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAv RGV2aWNlUkdCIDEgPGIyYjViZjVkNWE2Yz5dCi9MZW5ndGggOQovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTBQAAFgAWCmVuZHN0cmVhbQpl bmRvYmoKCjE5NDEgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTE5NDEKL1dpZHRoIDIKL0hlaWdodCAxCi9CaXRz UGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VS R0IgMSA8NWQ1YTZjNWQ2NDZjPl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRl RGVjb2RlCj4+CnN0cmVhbQp42hMAAAARABEKZW5kc3RyZWFtCmVuZG9iagoK MTk0MiAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UK L05hbWUgL0ltMTk0MgovV2lkdGggOQovSGVpZ2h0IDEKL0JpdHNQZXJDb21w b25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA0IDw1 ZDVhNmNiMmI1YmZlN2U4ZWRjN2NhZDE1ZDY0NmM+XQovTGVuZ3RoIDEzCi9G aWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMQMmAxAAABFQB3CmVu ZHN0cmVhbQplbmRvYmoKCjE5NDMgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QK L1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE5NDMKL1dpZHRoIDMKL0hlaWdo dCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVk IC9EZXZpY2VSR0IgMSA8NWQ1YTZjNjg2ZTc1Pl0KL0xlbmd0aCA5Ci9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMBAAAFAAUKZW5kc3RyZWFt CmVuZG9iagoKMTk0NCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlw ZSAvSW1hZ2UKL05hbWUgL0ltMTk0NAovV2lkdGggMTgKL0hlaWdodCAxCi9C aXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZp Y2VSR0IgOCA8OTI4ZDlhNWQ2NDZjNTM1YTYzYzdiZmM4YmNiZmJmNWQ1YTZj ZDJjYWQxZTdlOGVkZGNkZWUzPl0KL0xlbmd0aCAxNwovRmlsdGVyIC9GbGF0 ZURlY29kZQo+PgpzdHJlYW0KeNpjVDQJTRcVaAwDAAhjAg8KZW5kc3RyZWFt CmVuZG9iagoKMTk0NSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlw ZSAvSW1hZ2UKL05hbWUgL0ltMTk0NQovV2lkdGggMTAKL0hlaWdodCAxCi9C aXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZp Y2VSR0IgNiA8ODg4Mjg3NWQ1YTZjNWQ2NDZjNzI2ZTc1ZDJkNGRhN2Q4Mjg3 YzdjYWQxPl0KL0xlbmd0aCAxMwovRmlsdGVyIC9GbGF0ZURlY29kZQo+Pgpz dHJlYW0KeNpjVHYUCgMAAdMAzgplbmRzdHJlYW0KZW5kb2JqCgoxOTQ2IDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW0xOTQ2Ci9XaWR0aCA1Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAy Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMgPGM3YmZjODVk NWE2YzVkNjQ2Y2QyY2FkMT5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVE ZWNvZGUKPj4Kc3RyZWFtCnjaEzsAAADuANcKZW5kc3RyZWFtCmVuZG9iagoK MTk0NyAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UK L05hbWUgL0ltMTk0NwovV2lkdGggMTQKL0hlaWdodCAxCi9CaXRzUGVyQ29t cG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgOCA8 ZDJjYWQxODg4ZDkxODg4Mjg3OTI5NzlhNWQ1YTZjNTM1YTYzNWQ2NDZjN2Q4 Mjg3ZGNkZWUzPl0KL0xlbmd0aCAxNQovRmlsdGVyIC9GbGF0ZURlY29kZQo+ PgpzdHJlYW0KeNpjVHZNT0mTAAAF5QGzCmVuZHN0cmVhbQplbmRvYmoKCjE5 NDggMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9O YW1lIC9JbTE5NDgKL1dpZHRoIDE0Ci9IZWlnaHQgMQovQml0c1BlckNvbXBv bmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDUgPGIy YjViNTVkNjQ2YzUzNWE2MzVkNWE2YzkyOGQ5YWQyZDRkYT5dCi9MZW5ndGgg MTUKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1QSNnYVNgQA AysA8wplbmRzdHJlYW0KZW5kb2JqCgoxOTQ5IDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xOTQ5Ci9XaWR0aCA3 Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsv SW5kZXhlZCAvRGV2aWNlUkdCIDIgPDY4NjQ2YzVkNWE2YzVkNjQ2Yz5dCi9M ZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaE80A AACUAH4KZW5kc3RyZWFtCmVuZG9iagoKMTk1MCAwIG9iago8PAovVHlwZSAv WE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTk1MAovV2lkdGgg OAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiAzIDw5ZGExYTM1ZDY0NmM1ZDVhNmNiY2Jm YmY+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVh bQp42pOcDgAAywCxCmVuZHN0cmVhbQplbmRvYmoKCjE5NTEgMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE5NTEK L1dpZHRoIDYKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8NWQ1YTZjZDJkNGRhNWQ2 NDZjNjg2NDc1Pl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+ PgpzdHJlYW0KeNpj3AAAALQAsgplbmRzdHJlYW0KZW5kb2JqCgoxOTUyIDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW0xOTUyCi9XaWR0aCAxMAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg NAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA0IDxiY2JmYzg1 ZDY0NmM1ZDVhNmM1MzVhNjM3ZDc4N2U+XQovTGVuZ3RoIDEzCi9GaWx0ZXIg L0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUUhJWAQABQgB9CmVuZHN0cmVh bQplbmRvYmoKCjE5NTMgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5 cGUgL0ltYWdlCi9OYW1lIC9JbTE5NTMKL1dpZHRoIDMKL0hlaWdodCAxCi9C aXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZp Y2VSR0IgMiA8NTM1YTYzNWQ1YTZjN2Q4Mjg3Pl0KL0xlbmd0aCA5Ci9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42pMAAAAZABkKZW5kc3RyZWFt CmVuZG9iagoKMTk1NCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlw ZSAvSW1hZ2UKL05hbWUgL0ltMTk1NAovV2lkdGggMjMKL0hlaWdodCAxCi9C aXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZp Y2VSR0IgNyA8YmNiZmM4NWQ1YTZjYTdhYmFjNWQ2NDZjZDJkNGRhZTdlOGVk OTI5NzlhNjg2NDZjPl0KL0xlbmd0aCAyMAovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNpjFFQQdhU2cxQUFC4AAAkBAboKZW5kc3RyZWFtCmVu ZG9iagoKMTk1NSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAv SW1hZ2UKL05hbWUgL0ltMTk1NQovV2lkdGggNgovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiAzIDw1ZDVhNmM1MzVhNjM1ZDY0NmM2ODY0NmM+XQovTGVuZ3RoIDEwCi9G aWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hMyAAAAVgBDCmVuZHN0 cmVhbQplbmRvYmoKCjE5NTYgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1 YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE5NTYKL1dpZHRoIDUKL0hlaWdodCAx Ci9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9E ZXZpY2VSR0IgMyA8YzdiZmM4NWQ2NDZjNWQ1YTZjZDJjYWQxPl0KL0xlbmd0 aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTPAAAAPQA 2gplbmRzdHJlYW0KZW5kb2JqCgoxOTU3IDAgb2JqCjw8Ci9UeXBlIC9YT2Jq ZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xOTU3Ci9XaWR0aCAxNgov SGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0lu ZGV4ZWQgL0RldmljZVJHQiA0IDw2ODY0NmM1ZDY0NmM1ZDVhNmNkMmQ0ZGE4 ODgyODc+XQovTGVuZ3RoIDE2Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0 cmVhbQp42mMUElQ0VBISAQAC+wC/CmVuZHN0cmVhbQplbmRvYmoKCjE5NTgg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTE5NTgKL1dpZHRoIDEKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50 IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMCA8NWQ1YTZj Pl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4 2mMAAAABAAEKZW5kc3RyZWFtCmVuZG9iagoKMTk1OSAwIG9iago8PAovVHlw ZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTk1OQovV2lk dGggNAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFj ZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDw1ZDVhNmM1ZDY0NmM2ODY0NzU+ XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja YwMAAAcABwplbmRzdHJlYW0KZW5kb2JqCgoxOTYwIDAgb2JqCjw8Ci9UeXBl IC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xOTYwCi9XaWR0 aCAxNQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFj ZSBbL0luZGV4ZWQgL0RldmljZVJHQiA3IDxkY2RlZGFiY2JmYmY1ZDVhNmM1 ZDY0NmM4ODhkOWFkY2Q0ZGE1MzVhNjM3MjZlNzU+XQovTGVuZ3RoIDE2Ci9G aWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUVjIyCUoqAAAFxQHR CmVuZHN0cmVhbQplbmRvYmoKCjE5NjEgMCBvYmoKPDwKL1R5cGUgL1hPYmpl Y3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE5NjEKL1dpZHRoIDgKL0hl aWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRl eGVkIC9EZXZpY2VSR0IgNCA8N2Q4Mjg3NWQ2NDZjNWQ1YTZjYTdhMWEzYTdh YmFjPl0KL0xlbmd0aCAxMgovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl YW0KeNpjFDJRBAAAxwBpCmVuZHN0cmVhbQplbmRvYmoKCjE5NjIgMCBvYmoK PDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE5 NjIKL1dpZHRoIDcKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0Nv bG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8OWRhMWEzNWQ2NDZj NWQ1YTZjNjg2NDZjPl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNqTigEAAJIAdwplbmRzdHJlYW0KZW5kb2JqCgoxOTYz IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFt ZSAvSW0xOTYzCi9XaWR0aCA2Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVu dCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPDY4NjQ2 YzVkNWE2Yzg4ODI4Nz5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjaE0sAAACOAHcKZW5kc3RyZWFtCmVuZG9iagoKMTk2 NCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05h bWUgL0ltMTk2NAovV2lkdGggMTAKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9u ZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8NzI3 ODdlNWQ2NDZjNWQ1YTZjPl0KL0xlbmd0aCAxMQovRmlsdGVyIC9GbGF0ZURl Y29kZQo+PgpzdHJlYW0KeNqTWhkAAAHzARQKZW5kc3RyZWFtCmVuZG9iagoK MTk2NSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UK L05hbWUgL0ltMTk2NQovV2lkdGggMwovSGVpZ2h0IDEKL0JpdHNQZXJDb21w b25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDw1 MzVhNjM1ZDY0NmM3ZDgyODc+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVE ZWNvZGUKPj4Kc3RyZWFtCnjakwAAABkAGQplbmRzdHJlYW0KZW5kb2JqCgox OTY2IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQov TmFtZSAvSW0xOTY2Ci9XaWR0aCAyMwovSGVpZ2h0IDEKL0JpdHNQZXJDb21w b25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA5IDxi Y2JmYmY1ZDVhNmM1MzVhNjNhN2FiYWM1ZDY0NmNkMmQ0ZGFlN2U4ZWQ5Mjhk OWFkY2RlZTM2ODY0NmM+XQovTGVuZ3RoIDIwCi9GaWx0ZXIgL0ZsYXRlRGVj b2RlCj4+CnN0cmVhbQp42mNUNHAJc3RvFJQUdAAAD14CcQplbmRzdHJlYW0K ZW5kb2JqCgoxOTY3IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBl IC9JbWFnZQovTmFtZSAvSW0xOTY3Ci9XaWR0aCA1Ci9IZWlnaHQgMQovQml0 c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNl UkdCIDIgPGM3Y2FjODVkNjQ2YzVkNWE2Yz5dCi9MZW5ndGggMTAKL0ZpbHRl ciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaE2MAAAAuABcKZW5kc3RyZWFt CmVuZG9iagoKMTk2OCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlw ZSAvSW1hZ2UKL05hbWUgL0ltMTk2OAovV2lkdGggOQovSGVpZ2h0IDEKL0Jp dHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rldmlj ZVJHQiA1IDw5MjhkOWE1ZDY0NmM1ZDVhNmM2ODY0NmNjN2JmYzhkMmQ0ZGE+ XQovTGVuZ3RoIDEzCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4 2mNUdhUSAAABmQCMCmVuZHN0cmVhbQplbmRvYmoKCjE5NjkgMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE5NjkK L1dpZHRoIDcKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNCA8ZDJkNGRhNjg2NDc1NWQ2 NDZjNWQ1YTZjNjg2NDZjPl0KL0xlbmd0aCAxMgovRmlsdGVyIC9GbGF0ZURl Y29kZQo+PgpzdHJlYW0KeNpjVDJyAAABEgCWCmVuZHN0cmVhbQplbmRvYmoK CjE5NzAgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdl Ci9OYW1lIC9JbTE5NzAKL1dpZHRoIDEyCi9IZWlnaHQgMQovQml0c1BlckNv bXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDQg PDY4NjQ3NTVkNWE2YzVkNjQ2Y2RjZGVmNjY4NjQ2Yz5dCi9MZW5ndGggMTQK L0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYxRSEjJRAgABrgCe CmVuZHN0cmVhbQplbmRvYmoKCjE5NzEgMCBvYmoKPDwKL1R5cGUgL1hPYmpl Y3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE5NzEKL1dpZHRoIDUKL0hl aWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRl eGVkIC9EZXZpY2VSR0IgMyA8ZGNkZWUzNWQ1YTZjNWQ2NDZjNzI3ODdlPl0K L0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoT OwAAAO4A1wplbmRzdHJlYW0KZW5kb2JqCgoxOTcyIDAgb2JqCjw8Ci9UeXBl IC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xOTcyCi9XaWR0 aCA1Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNl IFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPGU3ZThlZDVkNjQ2Y2QyZDRkYT5d Ci9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja E20AAACsAJYKZW5kc3RyZWFtCmVuZG9iagoKMTk3MyAwIG9iago8PAovVHlw ZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTk3MwovV2lk dGggNQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFj ZSBbL0luZGV4ZWQgL0RldmljZVJHQiAzIDxkY2Q0ZGE1ZDVhNmM1ZDY0NmM3 ZDc4ODc+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0 cmVhbQp42hM7AAAA7gDXCmVuZHN0cmVhbQplbmRvYmoKCjE5NzQgMCBvYmoK PDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE5 NzQKL1dpZHRoIDQKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0Nv bG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8Njg2NDZjNWQ2NDZj NWQ1YTZjOWQ5N2EzPl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2Rl Cj4+CnN0cmVhbQp42pMGAAAcABwKZW5kc3RyZWFtCmVuZG9iagoKMTk3NSAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltMTk3NQovV2lkdGggMwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg MgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDxiMmI1YmY1 ZDY0NmM2ODY0NzU+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUK Pj4Kc3RyZWFtCnjakwAAABkAGQplbmRzdHJlYW0KZW5kb2JqCgoxOTc2IDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW0xOTc2Ci9XaWR0aCA2Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAy Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMgPDg4OGQ5MTVk NWE2YzUzNWE2M2QyY2FkMT5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVE ZWNvZGUKPj4Kc3RyZWFtCnjaEysAAACeAIcKZW5kc3RyZWFtCmVuZG9iagoK MTk3NyAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UK L05hbWUgL0ltMTk3NwovV2lkdGggMTEKL0hlaWdodCAxCi9CaXRzUGVyQ29t cG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8 NWQ2NDZjNWQ1YTZjNTM1YTYzZTdkZWUzPl0KL0xlbmd0aCAxMQovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjDfMBAAEKAKgKZW5kc3RyZWFt CmVuZG9iagoKMTk3OCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlw ZSAvSW1hZ2UKL05hbWUgL0ltMTk3OAovV2lkdGggMwovSGVpZ2h0IDEKL0Jp dHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rldmlj ZVJHQiAyIDw1MzVhNjM1ZDVhNmM2ODY0NzU+XQovTGVuZ3RoIDkKL0ZpbHRl ciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjakwAAABkAGQplbmRzdHJlYW0K ZW5kb2JqCgoxOTc5IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBl IC9JbWFnZQovTmFtZSAvSW0xOTc5Ci9XaWR0aCAxNAovSGVpZ2h0IDEKL0Jp dHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rldmlj ZVJHQiA4IDw3ZDgyODc1ZDVhNmNjN2NhZDFiY2I1Yzg1ZDY0NmNhN2ExYTNj N2JmYzg1MzVhNjM5MjhkOWE+XQovTGVuZ3RoIDE1Ci9GaWx0ZXIgL0ZsYXRl RGVjb2RlCj4+CnN0cmVhbQp42mMUVHYMc6kAAAQpAYkKZW5kc3RyZWFtCmVu ZG9iagoKMTk4MCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAv SW1hZ2UKL05hbWUgL0ltMTk4MAovV2lkdGggNAovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiAxIDw1ZDVhNmNhN2ExYTM+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVE ZWNvZGUKPj4Kc3RyZWFtCnjaYwQAAAIAAgplbmRzdHJlYW0KZW5kb2JqCgox OTgxIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQov TmFtZSAvSW0xOTgxCi9XaWR0aCA1Ci9IZWlnaHQgMQovQml0c1BlckNvbXBv bmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPGQy ZDRkYTVkNWE2YzcyNzg3ZT5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVE ZWNvZGUKPj4Kc3RyZWFtCnjaE20AAACsAJYKZW5kc3RyZWFtCmVuZG9iagoK MTk4MiAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UK L05hbWUgL0ltMTk4MgovV2lkdGggNAovSGVpZ2h0IDEKL0JpdHNQZXJDb21w b25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAzIDw2 ODZlNzU1ZDY0NmM1ZDVhNmM3ZDgyODc+XQovTGVuZ3RoIDkKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjakwYAABwAHAplbmRzdHJlYW0KZW5k b2JqCgoxOTgzIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9J bWFnZQovTmFtZSAvSW0xOTgzCi9XaWR0aCA1Ci9IZWlnaHQgMQovQml0c1Bl ckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdC IDMgPGM3Y2FkMTVkNjQ2YzVkNWE2Y2U3ZThlZD5dCi9MZW5ndGggMTAKL0Zp bHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjakzwAAAD0ANoKZW5kc3Ry ZWFtCmVuZG9iagoKMTk4NCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3Vi dHlwZSAvSW1hZ2UKL05hbWUgL0ltMTk4NAovV2lkdGggMTgKL0hlaWdodCAx Ci9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9E ZXZpY2VSR0IgNSA8NzI2ZTc1NWQ1YTZjNWQ2NDZjZTdkZWUzYTdhYmFjZDJk NGRhPl0KL0xlbmd0aCAxNwovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl YW0KeNpjVBJUNFFSEhIFAASKAPUKZW5kc3RyZWFtCmVuZG9iagoKMTk4NSAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltMTk4NQovV2lkdGggNwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg NAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA1IDw2ODY0NmM1 ZDY0NmM1ZDVhNmNiMmI1YjVkMmQ0ZGE2ODY0NzU+XQovTGVuZ3RoIDEyCi9G aWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMUMgkAAAD2AJgKZW5k c3RyZWFtCmVuZG9iagoKMTk4NiAwIG9iago8PAovVHlwZSAvWE9iamVjdAov U3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMTk4NgovV2lkdGggNQovSGVpZ2h0 IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQg L0RldmljZVJHQiAzIDxkY2RlZTM1ZDVhNmM1ZDY0NmM3ZDgyODc+XQovTGVu Z3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42pM6AAAA 9gDbCmVuZHN0cmVhbQplbmRvYmoKCjE5ODcgMCBvYmoKPDwKL1R5cGUgL1hP YmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE5ODcKL1dpZHRoIDgK L0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9J bmRleGVkIC9EZXZpY2VSR0IgMiA8Njg2NDZjNWQ2NDZjYjJiNWI1Pl0KL0xl bmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTnQoA AMEAqwplbmRzdHJlYW0KZW5kb2JqCgoxOTg4IDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xOTg4Ci9XaWR0aCA4 Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsv SW5kZXhlZCAvRGV2aWNlUkdCIDYgPDg4OGQ5MTY4NmU3NWE3YTFhM2IyYjVi NTY4NjQ3NTVkNWE2YzVkNjQ2Yz5dCi9MZW5ndGggMTIKL0ZpbHRlciAvRmxh dGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1R2TQUAAWAAzwplbmRzdHJlYW0KZW5k b2JqCgoxOTg5IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9J bWFnZQovTmFtZSAvSW0xOTg5Ci9XaWR0aCA1Ci9IZWlnaHQgMQovQml0c1Bl ckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdC IDMgPGRjZGVlMzUzNWE2MzVkNWE2YzVkNjQ2Yz5dCi9MZW5ndGggMTAKL0Zp bHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjakzwAAAD0ANoKZW5kc3Ry ZWFtCmVuZG9iagoKMTk5MCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3Vi dHlwZSAvSW1hZ2UKL05hbWUgL0ltMTk5MAovV2lkdGggNQovSGVpZ2h0IDEK L0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rl dmljZVJHQiAzIDw5MjhkOWE1ZDVhNmM1ZDY0NmM5Mjk3YTM+XQovTGVuZ3Ro IDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hM7AAAA7gDX CmVuZHN0cmVhbQplbmRvYmoKCjE5OTEgMCBvYmoKPDwKL1R5cGUgL1hPYmpl Y3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE5OTEKL1dpZHRoIDgKL0hl aWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRl eGVkIC9EZXZpY2VSR0IgMSA8NWQ2NDZjNWQ1YTZjPl0KL0xlbmd0aCAxMAov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTFAEAADgAJgplbmRz dHJlYW0KZW5kb2JqCgoxOTkyIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9T dWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xOTkyCi9XaWR0aCA5Ci9IZWlnaHQg MQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAv RGV2aWNlUkdCIDMgPGQyZDRkYTVkNjQ2YzVkNWE2YzkyOTc5YT5dCi9MZW5n dGggMTEKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjak5p2AAAC PQFxCmVuZHN0cmVhbQplbmRvYmoKCjE5OTMgMCBvYmoKPDwKL1R5cGUgL1hP YmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE5OTMKL1dpZHRoIDgK L0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9J bmRleGVkIC9EZXZpY2VSR0IgNyA8Njg2ZTc1NWQ2NDZjNWQ1YTZjNzI3ODdl OTI5NzlhODg4ZDkxNjg2NDZjZGNkZWUzPl0KL0xlbmd0aCAxMgovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVHZNBwABYgDRCmVuZHN0cmVh bQplbmRvYmoKCjE5OTQgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5 cGUgL0ltYWdlCi9OYW1lIC9JbTE5OTQKL1dpZHRoIDcKL0hlaWdodCAxCi9C aXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZp Y2VSR0IgNSA8Njg2NDZjNzI2ZTc1ODg4ZDkxNWQ1YTZjNWQ2NDZjZDJkNGRh Pl0KL0xlbmd0aCAxMgovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0K eNpjVDYJAAABKQCpCmVuZHN0cmVhbQplbmRvYmoKCjE5OTUgMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTE5OTUK L1dpZHRoIDUKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8ZTdlOGVkNWQ1YTZjNWQ2 NDZjPl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl YW0KeNoTcwAAAG4AVwplbmRzdHJlYW0KZW5kb2JqCgoxOTk2IDAgb2JqCjw8 Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xOTk2 Ci9XaWR0aCAxNwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29s b3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA4IDw2ODZlNzU1ZDY0NmM1 ZDVhNmM2ODY0NmM5MjhkOWFiMmI1YjU3ZDc4N2U4ODhkOTE2ODY0NzU+XQov TGVuZ3RoIDE3Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNU dhYSFStuFAAABpcBqQplbmRzdHJlYW0KZW5kb2JqCgoxOTk3IDAgb2JqCjw8 Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0xOTk3 Ci9XaWR0aCA5Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xv clNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMgPDY4NmU3NTVkNWE2YzVk NjQ2Y2U3ZGVlMz5dCi9MZW5ndGggMTEKL0ZpbHRlciAvRmxhdGVEZWNvZGUK Pj4Kc3RyZWFtCnjak1x1AAACYgGECmVuZHN0cmVhbQplbmRvYmoKCjE5OTgg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTE5OTgKL1dpZHRoIDcKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50 IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8Njg2NDZj NWQ2NDZjNWQ1YTZjNjg2ZTc1Pl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0 ZURlY29kZQo+PgpzdHJlYW0KeNoTmwMAAMoAswplbmRzdHJlYW0KZW5kb2Jq CgoxOTk5IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFn ZQovTmFtZSAvSW0xOTk5Ci9XaWR0aCA3Ci9IZWlnaHQgMQovQml0c1BlckNv bXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIg PGM3Y2FkMTVkNWE2YzVkNjQ2Yz5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxh dGVEZWNvZGUKPj4Kc3RyZWFtCnjaE50BAADEAK4KZW5kc3RyZWFtCmVuZG9i agoKMjAwMCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1h Z2UKL05hbWUgL0ltMjAwMAovV2lkdGggNQovSGVpZ2h0IDEKL0JpdHNQZXJD b21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAz IDxkY2RlZTM1ZDVhNmM1ZDY0NmM3ZDgyODc+XQovTGVuZ3RoIDEwCi9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hM7AAAA7gDXCmVuZHN0cmVh bQplbmRvYmoKCjIwMDEgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5 cGUgL0ltYWdlCi9OYW1lIC9JbTIwMDEKL1dpZHRoIDgKL0hlaWdodCAxCi9C aXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZp Y2VSR0IgNCA8N2Q3ODg3NWQ1YTZjNTM1YTYzNzI2ZTc1NWQ2NDZjPl0KL0xl bmd0aCAxMgovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVBQW AQAApQBKCmVuZHN0cmVhbQplbmRvYmoKCjIwMDIgMCBvYmoKPDwKL1R5cGUg L1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIwMDIKL1dpZHRo IDgKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2Ug Wy9JbmRleGVkIC9EZXZpY2VSR0IgNCA8ODg4Mjg3Njg2NDc1NWQ1YTZjNWQ2 NDZjYmNiNWM4Pl0KL0xlbmd0aCAxMgovRmlsdGVyIC9GbGF0ZURlY29kZQo+ PgpzdHJlYW0KeNpjVFY2AQAA6wB8CmVuZHN0cmVhbQplbmRvYmoKCjIwMDMg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTIwMDMKL1dpZHRoIDQKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50 IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8NWQ2NDZj NWQ1YTZjNjg2NDZjPl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2Rl Cj4+CnN0cmVhbQp42hMDAAAXABcKZW5kc3RyZWFtCmVuZG9iagoKMjAwNCAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltMjAwNAovV2lkdGggNQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg MgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAzIDxkY2Q0ZGE1 ZDY0NmM1ZDVhNmM2ODY0NmM+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRl RGVjb2RlCj4+CnN0cmVhbQp42pM8AAAA9ADaCmVuZHN0cmVhbQplbmRvYmoK CjIwMDUgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdl Ci9OYW1lIC9JbTIwMDUKL1dpZHRoIDgKL0hlaWdodCAxCi9CaXRzUGVyQ29t cG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8 NWQ1YTZjNWQ2NDZjN2Q3ODg3Pl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0 ZURlY29kZQo+PgpzdHJlYW0KeNpjEAIAABQAEwplbmRzdHJlYW0KZW5kb2Jq CgoyMDA2IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFn ZQovTmFtZSAvSW0yMDA2Ci9XaWR0aCA3Ci9IZWlnaHQgMQovQml0c1BlckNv bXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIg PDVkNjQ2YzVkNWE2Y2RjZGVlMz5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxh dGVEZWNvZGUKPj4Kc3RyZWFtCnjaY/EAAABSAE0KZW5kc3RyZWFtCmVuZG9i agoKMjAwNyAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1h Z2UKL05hbWUgL0ltMjAwNwovV2lkdGggMTcKL0hlaWdodCAxCi9CaXRzUGVy Q29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0Ig NSA8YTdhYmI1NWQ2NDZjNWQ1YTZjODg4Mjg3Njg2NDZjYjJiNWJmPl0KL0xl bmd0aCAxNwovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjFFQW dHAUFAwAAATeAToKZW5kc3RyZWFtCmVuZG9iagoKMjAwOCAwIG9iago8PAov VHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjAwOAov V2lkdGggOQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JT cGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAzIDw2ODY0NmM1ZDY0NmM1ZDVh NmNlN2U4ZWQ+XQovTGVuZ3RoIDExCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+ CnN0cmVhbQp42hOZeQAAAjEBbgplbmRzdHJlYW0KZW5kb2JqCgoyMDA5IDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW0yMDA5Ci9XaWR0aCA1Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAy Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMgPDdkODI4NzVk NjQ2YzVkNWE2YzkyOGQ5YT5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVE ZWNvZGUKPj4Kc3RyZWFtCnjakzwAAAD0ANoKZW5kc3RyZWFtCmVuZG9iagoK MjAxMCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UK L05hbWUgL0ltMjAxMAovV2lkdGggNgovSGVpZ2h0IDEKL0JpdHNQZXJDb21w b25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA0IDxk Y2RlZTM2ODZlNzU1ZDVhNmM2ODY0NmM3Mjc4N2U+XQovTGVuZ3RoIDExCi9G aWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUVgEAAHAASQplbmRz dHJlYW0KZW5kb2JqCgoyMDExIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9T dWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMDExCi9XaWR0aCA1Ci9IZWlnaHQg MQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAv RGV2aWNlUkdCIDQgPGRjZGVkYTVkNWE2YzY4NjQ2YzVkNjQ2YzdkODI4Nz5d Ci9MZW5ndGggMTEKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja Y1R2AAAAjABlCmVuZHN0cmVhbQplbmRvYmoKCjIwMTIgMCBvYmoKPDwKL1R5 cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIwMTIKL1dp ZHRoIDcKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3Bh Y2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNCA8NzI2ZTc1NWQ2NDZjODg4ZDkx YzdjYWQxNjg2NDZjPl0KL0xlbmd0aCAxMgovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNpjFDJxAAAA5gCICmVuZHN0cmVhbQplbmRvYmoKCjIw MTMgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9O YW1lIC9JbTIwMTMKL1dpZHRoIDcKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9u ZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNCA8YmNi ZmJmNjg2NDc1NWQ2NDZjNWQ1YTZjZGNkZWRhPl0KL0xlbmd0aCAxMgovRmls dGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVDZ0AAABEwCWCmVuZHN0 cmVhbQplbmRvYmoKCjIwMTQgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1 YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIwMTQKL1dpZHRoIDQKL0hlaWdodCAx Ci9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9E ZXZpY2VSR0IgMyA8NzI3ODdlNTM1YTYzNWQ2NDZjODg4ZDkxPl0KL0xlbmd0 aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42pMGAAAcABwK ZW5kc3RyZWFtCmVuZG9iagoKMjAxNSAwIG9iago8PAovVHlwZSAvWE9iamVj dAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjAxNQovV2lkdGggNAovSGVp Z2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4 ZWQgL0RldmljZVJHQiAyIDw2ODZlNzU2ODY0NzU2ODZlNmM+XQovTGVuZ3Ro IDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjakwAAABkAGQpl bmRzdHJlYW0KZW5kb2JqCgoyMDE2IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0 Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMDE2Ci9XaWR0aCA3Ci9IZWln aHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhl ZCAvRGV2aWNlUkdCIDUgPDVkNWE2YzcyNmU3NWQyZDRkYTY4NjQ2YzVkNjQ2 Yzg4OGQ5MT5dCi9MZW5ndGggMTIKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4K c3RyZWFtCnjaYxAyCQAAAPIAlwplbmRzdHJlYW0KZW5kb2JqCgoyMDE3IDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW0yMDE3Ci9XaWR0aCAzCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAy Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPDY4NjQ2YzVk NjQ2YzdkNzg4Nz5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+ PgpzdHJlYW0KeNqTAAAAGQAZCmVuZHN0cmVhbQplbmRvYmoKCjIwMTggMCBv YmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9J bTIwMTgKL1dpZHRoIDUKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIK L0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8NWQ2NDZjNjg2 NDZjODg4ZDlhPl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+ PgpzdHJlYW0KeNoTaAAAAKIAkQplbmRzdHJlYW0KZW5kb2JqCgoyMDE5IDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW0yMDE5Ci9XaWR0aCA1Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAy Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMgPDlkYTFhMzY4 NmU3NTVkNjQ2Y2JjYmZjOD5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVE ZWNvZGUKPj4Kc3RyZWFtCnjakzwAAAD0ANoKZW5kc3RyZWFtCmVuZG9iagoK MjAyMCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UK L05hbWUgL0ltMjAyMAovV2lkdGggMwovSGVpZ2h0IDEKL0JpdHNQZXJDb21w b25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxIDw2 ODZlNzU1ZDY0NmM+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUK Pj4Kc3RyZWFtCnjaEwEAABUAFQplbmRzdHJlYW0KZW5kb2JqCgoyMDIxIDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW0yMDIxCi9XaWR0aCAxNQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg NAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA2IDxhN2ExYTM2 ODY0NmM1ZDY0NmNlN2U4ZWQ3Mjc4N2U3ZDc4ODc4ODhkOTE+XQovTGVuZ3Ro IDE2Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUMAkxExQ1 AAAFMQE2CmVuZHN0cmVhbQplbmRvYmoKCjIwMjIgMCBvYmoKPDwKL1R5cGUg L1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIwMjIKL1dpZHRo IDQKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2Ug Wy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8NzI2ZTc1NWQ1YTZjZGNkZWUzPl0K L0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hMD AAAXABcKZW5kc3RyZWFtCmVuZG9iagoKMjAyMyAwIG9iago8PAovVHlwZSAv WE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjAyMwovV2lkdGgg MwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiAyIDw1ZDVhNmM1MzVhNjM3Mjc4N2U+XQov TGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjakwAA ABkAGQplbmRzdHJlYW0KZW5kb2JqCgoyMDI0IDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMDI0Ci9XaWR0aCA1 Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsv SW5kZXhlZCAvRGV2aWNlUkdCIDEgPDVkNjQ2YzVkNWE2Yz5dCi9MZW5ndGgg MTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY3UAAABMAEYK ZW5kc3RyZWFtCmVuZG9iagoKMjAyNSAwIG9iago8PAovVHlwZSAvWE9iamVj dAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjAyNQovV2lkdGggNQovSGVp Z2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4 ZWQgL0RldmljZVJHQiAxIDw1ZDY0NmM1ZDVhNmM+XQovTGVuZ3RoIDEwCi9G aWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hN1AAAAbABWCmVuZHN0 cmVhbQplbmRvYmoKCjIwMjYgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1 YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIwMjYKL1dpZHRoIDUKL0hlaWdodCAx Ci9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9E ZXZpY2VSR0IgMiA8Njg2NDZjNWQ2NDZjYmNiZmJmPl0KL0xlbmd0aCAxMAov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTbQAAAKwAlgplbmRz dHJlYW0KZW5kb2JqCgoyMDI3IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9T dWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMDI3Ci9XaWR0aCAzCi9IZWlnaHQg MQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAv RGV2aWNlUkdCIDEgPDY4NjQ2YzdkNzg3ZT5dCi9MZW5ndGggOQovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjAQAABQAFCmVuZHN0cmVhbQpl bmRvYmoKCjIwMjggMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTIwMjgKL1dpZHRoIDQKL0hlaWdodCAxCi9CaXRz UGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VS R0IgMSA8OWQ5N2EzYmNiZmJmPl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRl RGVjb2RlCj4+CnN0cmVhbQp42mMEAAACAAIKZW5kc3RyZWFtCmVuZG9iagoK MjAyOSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UK L05hbWUgL0ltMjAyOQovV2lkdGggMwovSGVpZ2h0IDEKL0JpdHNQZXJDb21w b25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxIDw3 ZDc4N2VhN2ExYTM+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUK Pj4Kc3RyZWFtCnjaYwEAAAUABQplbmRzdHJlYW0KZW5kb2JqCgoyMDMwIDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW0yMDMwCi9XaWR0aCA0Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAy Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEgPDVkNjQ2Yzg4 OGQ5MT5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl YW0KeNpjBAAAAgACCmVuZHN0cmVhbQplbmRvYmoKCjIwMzEgMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIwMzEK L1dpZHRoIDkKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8OTI5NzlhOTI4ZDlhODg4 ZDkxPl0KL0xlbmd0aCAxMQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl YW0KeNoTnOoAAAGgAOcKZW5kc3RyZWFtCmVuZG9iagoKMjAzMiAwIG9iago8 PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjAz MgovV2lkdGggMwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29s b3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDw1ZDVhNmM1ZDY0NmM5 Mjk3OWE+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3Ry ZWFtCnjakwAAABkAGQplbmRzdHJlYW0KZW5kb2JqCgoyMDMzIDAgb2JqCjw8 Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMDMz Ci9XaWR0aCA0Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xv clNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPDVkNjQ2YzVkNWE2Yzg4 OGQ5MT5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl YW0KeNoTAgAAEwATCmVuZHN0cmVhbQplbmRvYmoKCjIwMzQgMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIwMzQK L1dpZHRoIDkKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8NWQ2NDZjNWQ1YTZjPl0K L0xlbmd0aCAxMQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoT FXEAAACqAGoKZW5kc3RyZWFtCmVuZG9iagoKMjAzNSAwIG9iago8PAovVHlw ZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjAzNQovV2lk dGggOQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFj ZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxIDw1ZDY0NmM1ZDVhNmM+XQovTGVu Z3RoIDExCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hMMdQAA ASAApwplbmRzdHJlYW0KZW5kb2JqCgoyMDM2IDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMDM2Ci9XaWR0aCAz Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsv SW5kZXhlZCAvRGV2aWNlUkdCIDEgPGU3ZThlZGQyZDRkYT5dCi9MZW5ndGgg OQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTAAAAEQARCmVu ZHN0cmVhbQplbmRvYmoKCjIwMzcgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QK L1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIwMzcKL1dpZHRoIDQKL0hlaWdo dCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVk IC9EZXZpY2VSR0IgMiA8NWQ2NDZjNWQ1YTZjODg4ZDkxPl0KL0xlbmd0aCA5 Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hMDAAAXABcKZW5k c3RyZWFtCmVuZG9iagoKMjAzOCAwIG9iago8PAovVHlwZSAvWE9iamVjdAov U3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjAzOAovV2lkdGggOQovSGVpZ2h0 IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQg L0RldmljZVJHQiA1IDw2ODY0NmM1ZDVhNmM1ZDY0NmM3ZDgyODc4ODgyODc4 ODhkOTE+XQovTGVuZ3RoIDEzCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0 cmVhbQp42mNUMnEJAAACBgDsCmVuZHN0cmVhbQplbmRvYmoKCjIwMzkgMCBv YmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9J bTIwMzkKL1dpZHRoIDQKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIK L0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8ZGNkZWUzYzdj YWM4ZDJkNGRhZjFlOGY2Pl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVj b2RlCj4+CnN0cmVhbQp42pMGAAAcABwKZW5kc3RyZWFtCmVuZG9iagoKMjA0 MCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05h bWUgL0ltMjA0MAovV2lkdGggMwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25l bnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDxkY2Rl ZTNiY2I1YzhiMmI1YjU+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjakwAAABkAGQplbmRzdHJlYW0KZW5kb2JqCgoyMDQx IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFt ZSAvSW0yMDQxCi9XaWR0aCAzCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVu dCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPDUzNWE2 MzVkNjQ2Yzg4OGQ5MT5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNqTAAAAGQAZCmVuZHN0cmVhbQplbmRvYmoKCjIwNDIg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTIwNDIKL1dpZHRoIDMKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50 IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8YmNiZmM4 YTdhMWEzYmNiZmJmPl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2Rl Cj4+CnN0cmVhbQp42pMAAAAZABkKZW5kc3RyZWFtCmVuZG9iagoKMjA0MyAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltMjA0MwovV2lkdGggNgovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg MgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDw5ZGExYTM1 ZDVhNmM1ZDY0NmM+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2Rl Cj4+CnN0cmVhbQp42hNNAAAAjAB2CmVuZHN0cmVhbQplbmRvYmoKCjIwNDQg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTIwNDQKL1dpZHRoIDQKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50 IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8Njg2NDZj NWQ2NDZjODg4ZDkxPl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2Rl Cj4+CnN0cmVhbQp42hMDAAAXABcKZW5kc3RyZWFtCmVuZG9iagoKMjA0NSAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltMjA0NQovV2lkdGggNwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg MgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAzIDw5Mjk3OWE1 ZDVhNmM1ZDY0NmM4ODgyODc+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRl RGVjb2RlCj4+CnN0cmVhbQp42hNdAwAA2ADCCmVuZHN0cmVhbQplbmRvYmoK CjIwNDYgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdl Ci9OYW1lIC9JbTIwNDYKL1dpZHRoIDYKL0hlaWdodCAxCi9CaXRzUGVyQ29t cG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8 NWQ1YTZjNWQ2NDZjN2Q3ODdlPl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0 ZURlY29kZQo+PgpzdHJlYW0KeNpjUQAAACoAJQplbmRzdHJlYW0KZW5kb2Jq CgoyMDQ3IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFn ZQovTmFtZSAvSW0yMDQ3Ci9XaWR0aCA2Ci9IZWlnaHQgMQovQml0c1BlckNv bXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIg PDcyNmU3NTVkNWE2YzVkNjQ2Yz5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxh dGVEZWNvZGUKPj4Kc3RyZWFtCnjak0oAAACWAHsKZW5kc3RyZWFtCmVuZG9i agoKMjA0OCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1h Z2UKL05hbWUgL0ltMjA0OAovV2lkdGggNwovSGVpZ2h0IDEKL0JpdHNQZXJD b21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAy IDxhN2FiYWM1ZDY0NmM1ZDVhNmM+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0Zs YXRlRGVjb2RlCj4+CnN0cmVhbQp42hObAQAAxgCvCmVuZHN0cmVhbQplbmRv YmoKCjIwNDkgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0lt YWdlCi9OYW1lIC9JbTIwNDkKL1dpZHRoIDE3Ci9IZWlnaHQgMQovQml0c1Bl ckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdC IDcgPDY4NjQ2YzVkNWE2YzVkNjQ2Y2IyYjViZmIyYjViNWJjYjVjOGM3Y2Fk MTg4ODI4Nz5dCi9MZW5ndGggMTcKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4K c3RyZWFtCnjaY1QycQ4TFBQqAAAG2QGVCmVuZHN0cmVhbQplbmRvYmoKCjIw NTAgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9O YW1lIC9JbTIwNTAKL1dpZHRoIDcKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9u ZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8NWQ2 NDZjNjg2NDZjOWRhMWFjPl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURl Y29kZQo+PgpzdHJlYW0KeNpj5AAAAAwACgplbmRzdHJlYW0KZW5kb2JqCgoy MDUxIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQov TmFtZSAvSW0yMDUxCi9XaWR0aCA5Ci9IZWlnaHQgMQovQml0c1BlckNvbXBv bmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMgPGJj YmZiZjVkNjQ2YzVkNWE2Yzg4OGQ5MT5dCi9MZW5ndGggMTEKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjak5p5AAACQwF0CmVuZHN0cmVhbQpl bmRvYmoKCjIwNTIgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTIwNTIKL1dpZHRoIDgKL0hlaWdodCAxCi9CaXRz UGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VS R0IgNCA8ODg4Mjg3NWQ2NDZjNTM1YTYzNWQ1YTZjNjg2ZTc1Pl0KL0xlbmd0 aCAxMgovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVFZWAQAA 2wBsCmVuZHN0cmVhbQplbmRvYmoKCjIwNTMgMCBvYmoKPDwKL1R5cGUgL1hP YmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIwNTMKL1dpZHRoIDQK L0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9J bmRleGVkIC9EZXZpY2VSR0IgMSA8NWQ2NDZjN2Q4Mjg3Pl0KL0xlbmd0aCA5 Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMEAAACAAIKZW5k c3RyZWFtCmVuZG9iagoKMjA1NCAwIG9iago8PAovVHlwZSAvWE9iamVjdAov U3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjA1NAovV2lkdGggMwovSGVpZ2h0 IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQg L0RldmljZVJHQiAyIDw3ZDc4N2U1ZDVhNmNiY2JmYzg+XQovTGVuZ3RoIDkK L0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjakwAAABkAGQplbmRz dHJlYW0KZW5kb2JqCgoyMDU1IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9T dWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMDU1Ci9XaWR0aCA0Ci9IZWlnaHQg MQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAv RGV2aWNlUkdCIDIgPDVkNjQ2YzY4NjQ2Yzg4OGQ5MT5dCi9MZW5ndGggOQov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjAwAABwAHCmVuZHN0 cmVhbQplbmRvYmoKCjIwNTYgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1 YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIwNTYKL1dpZHRoIDEzCi9IZWlnaHQg MQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAv RGV2aWNlUkdCIDMgPDY4NjQ2YzVkNjQ2YzVkNWE2Yzg4OGQ5MT5dCi9MZW5n dGggMTIKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjak5pp5QAA AusBLgplbmRzdHJlYW0KZW5kb2JqCgoyMDU3IDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMDU3Ci9XaWR0aCA5 Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsv SW5kZXhlZCAvRGV2aWNlUkdCIDQgPDY4NmU3NTVkNWE2YzVkNjQ2Yzg4OGQ5 MTcyNzg3ZT5dCi9MZW5ndGggMTMKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4K c3RyZWFtCnjaY1Q0ETIAAAF+AJkKZW5kc3RyZWFtCmVuZG9iagoKMjA1OCAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltMjA1OAovV2lkdGggOQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg NAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA0IDw2ODY0NmM1 ZDVhNmM1ZDY0NmNkY2RlZTNlN2U4ZWQ+XQovTGVuZ3RoIDEzCi9GaWx0ZXIg L0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUMhJyAAABjACoCmVuZHN0cmVh bQplbmRvYmoKCjIwNTkgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5 cGUgL0ltYWdlCi9OYW1lIC9JbTIwNTkKL1dpZHRoIDQKL0hlaWdodCAxCi9C aXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZp Y2VSR0IgMiA8NWQ1YTZjNWQ2NDZjYjJiNWI1Pl0KL0xlbmd0aCA5Ci9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hMDAAAXABcKZW5kc3RyZWFt CmVuZG9iagoKMjA2MCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlw ZSAvSW1hZ2UKL05hbWUgL0ltMjA2MAovV2lkdGggMwovSGVpZ2h0IDEKL0Jp dHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rldmlj ZVJHQiAyIDw5ZGExYWM1ZDY0NmM4ODgyODc+XQovTGVuZ3RoIDkKL0ZpbHRl ciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjakwAAABkAGQplbmRzdHJlYW0K ZW5kb2JqCgoyMDYxIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBl IC9JbWFnZQovTmFtZSAvSW0yMDYxCi9XaWR0aCAxNgovSGVpZ2h0IDEKL0Jp dHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rldmlj ZVJHQiA1IDw1ZDY0NmM1MzVhNjM1ZDVhNmM4ODhkOTE2ODY0NmNkY2RlZTM+ XQovTGVuZ3RoIDE2Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4 2mNUUFJiVmIxBQADFQDECmVuZHN0cmVhbQplbmRvYmoKCjIwNjIgMCBvYmoK PDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIw NjIKL1dpZHRoIDYKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0Nv bG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8YTdhYmFjN2Q3ODdl NWQ1YTZjPl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+Pgpz dHJlYW0KeNoTWwAAAM4AtwplbmRzdHJlYW0KZW5kb2JqCgoyMDYzIDAgb2Jq Cjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0y MDYzCi9XaWR0aCA4Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9D b2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDQgPDVkNjQ2Yzg4OGQ5 MWRjZGVlMzUzNWE2MzY4NmU3NT5dCi9MZW5ndGggMTIKL0ZpbHRlciAvRmxh dGVEZWNvZGUKPj4Kc3RyZWFtCnjaYxAyNgEAANQAegplbmRzdHJlYW0KZW5k b2JqCgoyMDY0IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9J bWFnZQovTmFtZSAvSW0yMDY0Ci9XaWR0aCA0Ci9IZWlnaHQgMQovQml0c1Bl ckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdC IDMgPDkyOGQ5YTVkNWE2YzVkNjQ2Y2JjYmZiZj5dCi9MZW5ndGggOQovRmls dGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTBgAAHAAcCmVuZHN0cmVh bQplbmRvYmoKCjIwNjUgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5 cGUgL0ltYWdlCi9OYW1lIC9JbTIwNjUKL1dpZHRoIDEyCi9IZWlnaHQgMQov Qml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2 aWNlUkdCIDQgPDVkNWE2YzVkNjQ2YzdkNzg3ZWU3ZThlZDcyNmU3NT5dCi9M ZW5ndGggMTQKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1Rm YGRgAQAAwgAqCmVuZHN0cmVhbQplbmRvYmoKCjIwNjYgMCBvYmoKPDwKL1R5 cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIwNjYKL1dp ZHRoIDE3Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNw YWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDYgPDVkNjQ2YzVkNWE2YzY4NmU2 YzcyNmU3NWU3ZThlZDY4NjQ2YzdkNzg3ZT5dCi9MZW5ndGggMTcKL0ZpbHRl ciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYxRUNjYJYBRMAAAFigFfCmVu ZHN0cmVhbQplbmRvYmoKCjIwNjcgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QK L1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIwNjcKL1dpZHRoIDgKL0hlaWdo dCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVk IC9EZXZpY2VSR0IgMiA8ZGNkZWUzNWQ2NDZjNWQ1YTZjPl0KL0xlbmd0aCAx MAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTXAkAAN0Awwpl bmRzdHJlYW0KZW5kb2JqCgoyMDY4IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0 Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMDY4Ci9XaWR0aCA4Ci9IZWln aHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhl ZCAvRGV2aWNlUkdCIDQgPDVkNWE2Yzg4ODI4N2RjZDRkYTVkNjQ2YzcyNmU3 NT5dCi9MZW5ndGggMTIKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFt CnjaYxBiMAEAAG4ARwplbmRzdHJlYW0KZW5kb2JqCgoyMDY5IDAgb2JqCjw8 Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMDY5 Ci9XaWR0aCA0Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xv clNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMgPDlkYTFhMzVkNWE2YzVk NjQ2Y2E3YWJiNT5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+ PgpzdHJlYW0KeNqTBgAAHAAcCmVuZHN0cmVhbQplbmRvYmoKCjIwNzAgMCBv YmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9J bTIwNzAKL1dpZHRoIDgKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIK L0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8NWQ1YTZjNWQ2 NDZjNjg2ZTc1Pl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+ PgpzdHJlYW0KeNoTZAMAACoAGAplbmRzdHJlYW0KZW5kb2JqCgoyMDcxIDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW0yMDcxCi9XaWR0aCA3Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0 Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDQgPGRjZDRkYTY4 NjQ2YzVkNWE2YzUzNWE2MzVkNjQ2Yz5dCi9MZW5ndGggMTIKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1RSdgAAAPQAhwplbmRzdHJlYW0K ZW5kb2JqCgoyMDcyIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBl IC9JbWFnZQovTmFtZSAvSW0yMDcyCi9XaWR0aCA4Ci9IZWlnaHQgMQovQml0 c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNl UkdCIDUgPDY4NjQ2YzUzNWE2MzVkNWE2YzY4NjQ3NWRjZGVlMzVkNjQ2Yz5d Ci9MZW5ndGggMTIKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja Y1R2CgAAAUUAtwplbmRzdHJlYW0KZW5kb2JqCgoyMDczIDAgb2JqCjw8Ci9U eXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMDczCi9X aWR0aCA4Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNw YWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDUgPDVkNjQ2YzVkNWE2Yzg4ODI4 N2U3ZGVlMzUzNWE2MzY4NmU3NT5dCi9MZW5ndGggMTIKL0ZpbHRlciAvRmxh dGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1QWdAUAANgAewplbmRzdHJlYW0KZW5k b2JqCgoyMDc0IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9J bWFnZQovTmFtZSAvSW0yMDc0Ci9XaWR0aCA0Ci9IZWlnaHQgMQovQml0c1Bl ckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdC IDIgPDkyOTc5YTVkNjQ2Y2JjYmZiZj5dCi9MZW5ndGggOQovRmlsdGVyIC9G bGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTAwAAFwAXCmVuZHN0cmVhbQplbmRv YmoKCjIwNzUgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0lt YWdlCi9OYW1lIC9JbTIwNzUKL1dpZHRoIDQKL0hlaWdodCAxCi9CaXRzUGVy Q29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0Ig MiA8NWQ2NDZjNWQ1YTZjODg4ZDkxPl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0Zs YXRlRGVjb2RlCj4+CnN0cmVhbQp42mMDAAAHAAcKZW5kc3RyZWFtCmVuZG9i agoKMjA3NiAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1h Z2UKL05hbWUgL0ltMjA3NgovV2lkdGggOQovSGVpZ2h0IDEKL0JpdHNQZXJD b21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA0 IDw2ODY0NmM1ZDVhNmM1ZDY0NmNiMmI1YmZiMmI1YjU+XQovTGVuZ3RoIDEz Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMUMjZ2AAABkQC6 CmVuZHN0cmVhbQplbmRvYmoKCjIwNzcgMCBvYmoKPDwKL1R5cGUgL1hPYmpl Y3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIwNzcKL1dpZHRoIDQKL0hl aWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRl eGVkIC9EZXZpY2VSR0IgMiA8Njg2NDZjNWQ2NDZjYzdiZmM4Pl0KL0xlbmd0 aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hMDAAAXABcK ZW5kc3RyZWFtCmVuZG9iagoKMjA3OCAwIG9iago8PAovVHlwZSAvWE9iamVj dAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjA3OAovV2lkdGggMwovSGVp Z2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4 ZWQgL0RldmljZVJHQiAxIDw1ZDVhNmM2ODY0NmM+XQovTGVuZ3RoIDkKL0Zp bHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYwEAAAUABQplbmRzdHJl YW0KZW5kb2JqCgoyMDc5IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0 eXBlIC9JbWFnZQovTmFtZSAvSW0yMDc5Ci9XaWR0aCA5Ci9IZWlnaHQgMQov Qml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2 aWNlUkdCIDUgPDY4NjQ3NTVkNWE2YzlkYTFhMzkyOTc5YTUzNWE2Mzg4OGQ5 MT5dCi9MZW5ndGggMTMKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFt CnjaYxRUdgwAAAGJAMcKZW5kc3RyZWFtCmVuZG9iagoKMjA4MCAwIG9iago8 PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjA4 MAovV2lkdGggNAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29s b3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxIDw1ZDVhNmM1ZDY0NmM+ XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja EwQAABIAEgplbmRzdHJlYW0KZW5kb2JqCgoyMDgxIDAgb2JqCjw8Ci9UeXBl IC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMDgxCi9XaWR0 aCA3Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNl IFsvSW5kZXhlZCAvRGV2aWNlUkdCIDQgPDdkNzg4NzVkNjQ2YzVkNWE2Y2E3 YWJhYzkyOTc5YT5dCi9MZW5ndGggMTIKL0ZpbHRlciAvRmxhdGVEZWNvZGUK Pj4Kc3RyZWFtCnjaY1RkdgAAALEAZgplbmRzdHJlYW0KZW5kb2JqCgoyMDgy IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFt ZSAvSW0yMDgyCi9XaWR0aCA0Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVu dCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPDVkNjQ2 YzY4NjQ3NTg4OGQ5MT5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNpjAwAABwAHCmVuZHN0cmVhbQplbmRvYmoKCjIwODMg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTIwODMKL1dpZHRoIDE3Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVu dCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDcgPDY4NjQ2 YzUzNWE2MzVkNWE2YzVkNjQ2Y2M3Y2FjODdkNzg3ZTkyOTc5YTY4NmU3NT5d Ci9MZW5ndGggMTcKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja Y1QyMjIxTVcyAAAHLQGqCmVuZHN0cmVhbQplbmRvYmoKCjIwODQgMCBvYmoK PDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIw ODQKL1dpZHRoIDgKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0Nv bG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8NWQ1YTZjNWQ2NDZj N2Q4Mjg3Njg2NDZjPl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNpjbQcAAJMAjQplbmRzdHJlYW0KZW5kb2JqCgoyMDg1 IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFt ZSAvSW0yMDg1Ci9XaWR0aCA5Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVu dCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDQgPGE3YTFh MzVkNjQ2YzVkNWE2YzUzNWE2Mzg4ODI4Nz5dCi9MZW5ndGggMTMKL0ZpbHRl ciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1RSMnIAAAGcALgKZW5kc3Ry ZWFtCmVuZG9iagoKMjA4NiAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3Vi dHlwZSAvSW1hZ2UKL05hbWUgL0ltMjA4NgovV2lkdGggNgovSGVpZ2h0IDEK L0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rl dmljZVJHQiAyIDw2ODY0NmM1ZDVhNmM1ZDY0NmM+XQovTGVuZ3RoIDEwCi9G aWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42pMMAAAAhABqCmVuZHN0 cmVhbQplbmRvYmoKCjIwODcgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1 YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIwODcKL1dpZHRoIDQKL0hlaWdodCAx Ci9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9E ZXZpY2VSR0IgMiA8NWQ2NDZjNWQ1YTZjODg4Mjg3Pl0KL0xlbmd0aCA5Ci9G aWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hMDAAAXABcKZW5kc3Ry ZWFtCmVuZG9iagoKMjA4OCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3Vi dHlwZSAvSW1hZ2UKL05hbWUgL0ltMjA4OAovV2lkdGggMTcKL0hlaWdodCAx Ci9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9E ZXZpY2VSR0IgMyA8NWQ2NDZjNWQ1YTZjYzdiZmM4OWRhMWEzPl0KL0xlbmd0 aCAxMwovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjFFBwOQAA AfIBNgplbmRzdHJlYW0KZW5kb2JqCgoyMDg5IDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMDg5Ci9XaWR0aCA4 Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsv SW5kZXhlZCAvRGV2aWNlUkdCIDIgPDcyNzg3ZTVkNjQ2YzVkNWE2Yz5dCi9M ZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaE00F AACRAHsKZW5kc3RyZWFtCmVuZG9iagoKMjA5MCAwIG9iago8PAovVHlwZSAv WE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjA5MAovV2lkdGgg OAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiA0IDw2ODZlNzU1ZDY0NmM1ZDVhNmM3MjZl NzU4ODgyODc+XQovTGVuZ3RoIDEyCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+ CnN0cmVhbQp42mNUMlIBAAD2AHoKZW5kc3RyZWFtCmVuZG9iagoKMjA5MSAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltMjA5MQovV2lkdGggNQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg MgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDw4ODgyODc1 ZDVhNmM2ODY0NmM+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2Rl Cj4+CnN0cmVhbQp42hNrAAAArgCXCmVuZHN0cmVhbQplbmRvYmoKCjIwOTIg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTIwOTIKL1dpZHRoIDQKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50 IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8Njg2ZTc1 Njg2NDZjOTI4ZDlhPl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2Rl Cj4+CnN0cmVhbQp42hMDAAAXABcKZW5kc3RyZWFtCmVuZG9iagoKMjA5MyAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltMjA5MwovV2lkdGggMTYKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50 IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNyA8Njg2NDc1 Njg2ZTc1Njg2NDZjNzI2ZTc1ZTdlOGVkODg4Mjg3NWQ2NDZjZDJkNGRhPl0K L0xlbmd0aCAxNgovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpj EGBiNglLMwcAA2gBPQplbmRzdHJlYW0KZW5kb2JqCgoyMDk0IDAgb2JqCjw8 Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMDk0 Ci9XaWR0aCA3Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xv clNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDUgPDg4ODI4NzVkNWE2YzY4 NjQ2Y2QyZDRkYTcyNzg3ZTcyNmU3NT5dCi9MZW5ndGggMTIKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1R2CQAAAUkAuQplbmRzdHJlYW0K ZW5kb2JqCgoyMDk1IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBl IC9JbWFnZQovTmFtZSAvSW0yMDk1Ci9XaWR0aCAzCi9IZWlnaHQgMQovQml0 c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNl UkdCIDIgPDdkNzg4NzdkNzg3ZTlkYTFhMz5dCi9MZW5ndGggOQovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTAAAAGQAZCmVuZHN0cmVhbQpl bmRvYmoKCjIwOTYgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTIwOTYKL1dpZHRoIDUKL0hlaWdodCAxCi9CaXRz UGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VS R0IgMyA8YTdhYmI1Njg2NDZjNWQ2NDZjOWQ5N2EzPl0KL0xlbmd0aCAxMAov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTOwAAAO4A1wplbmRz dHJlYW0KZW5kb2JqCgoyMDk4IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9T dWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMDk4Ci9XaWR0aCAxNgovSGVpZ2h0 IDE2Ci9CaXRzUGVyQ29tcG9uZW50IDEKL0ltYWdlTWFzayB0cnVlCi9EZWNv ZGUgWzAgMV0KL0RlY29kZVBhcm1zIDw8IC9LIC0xIC9Db2x1bW5zIDE2ID4+ Ci9MZW5ndGggMTA3Ci9GaWx0ZXIgL0NDSVRURmF4RGVjb2RlCj4+CnN0cmVh bQomqI6I6I6I6I6I6CWIiIiLlDmHMOCCxERyhyhyhyhyhyhwQSxERERcococ ocw5Q4ILERERyhyhyhyhyhyhwQSxERERcocw5hwQWIiOUOUOUOUOUOUOCCWI iIiLlDlDlDmHKHBBYiIiMAEAEAplbmRzdHJlYW0KZW5kb2JqCgoyMDk3IDAg b2JqCjw8Ci9UeXBlIC9QYXR0ZXJuCi9QYXR0ZXJuVHlwZSAxCi9QYWludFR5 cGUgMQovVGlsaW5nVHlwZSAxCi9CQm94IFswIDAgMSAxXQovWFN0ZXAgMS4w MDEKL1lTdGVwIDEuMDAxCi9NYXRyaXggWzEuNSAwIDAgMS41IDAgMF0KL1Jl c291cmNlcyA8PCAvUHJvY1NldCBbL1BERiAvSW1hZ2VDXSAvWE9iamVjdCA8 PCAvSW0yMDk4IDIwOTggMCBSID4+ID4+Ci9MZW5ndGggMzAKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaM9AzNjBSMEAii9K59D1zjQwsLRRc 8rkAaGsGsgplbmRzdHJlYW0KZW5kb2JqCgoyMTAwIDAgb2JqCjw8Ci9UeXBl IC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMTAwCi9XaWR0 aCAxNgovSGVpZ2h0IDE2Ci9CaXRzUGVyQ29tcG9uZW50IDEKL0ltYWdlTWFz ayB0cnVlCi9EZWNvZGUgWzAgMV0KL0RlY29kZVBhcm1zIDw8IC9LIC0xIC9D b2x1bW5zIDE2ID4+Ci9MZW5ndGggMTAyCi9GaWx0ZXIgL0NDSVRURmF4RGVj b2RlCj4+CnN0cmVhbQojojojojojojoEEqERERHOOYcw4SxERsocococococ ocJUIiIiOccococw5Q4SxEREbKHKHKHKHKHKHCVCIiIjnHMOYcJYiI2UOUOU OUOUOUOEqERERHOOUOUOYcocJYiIiMAEAEAKZW5kc3RyZWFtCmVuZG9iagoK MjA5OSAwIG9iago8PAovVHlwZSAvUGF0dGVybgovUGF0dGVyblR5cGUgMQov UGFpbnRUeXBlIDEKL1RpbGluZ1R5cGUgMQovQkJveCBbMCAwIDEgMV0KL1hT dGVwIDEuMDAxCi9ZU3RlcCAxLjAwMQovTWF0cml4IFsxLjUgMCAwIDEuNSAw IDBdCi9SZXNvdXJjZXMgPDwgL1Byb2NTZXQgWy9QREYgL0ltYWdlQ10gL1hP YmplY3QgPDwgL0ltMjEwMCAyMTAwIDAgUiA+PiA+PgovTGVuZ3RoIDMwCi9G aWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42jPQMzYwUjBAIovSufQ9 c40MDQwUXPK5AGgUBqIKZW5kc3RyZWFtCmVuZG9iagoKMjEwMiAwIG9iago8 PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjEw MgovV2lkdGggMTYKL0hlaWdodCAxNgovQml0c1BlckNvbXBvbmVudCAxCi9J bWFnZU1hc2sgdHJ1ZQovRGVjb2RlIFswIDFdCi9EZWNvZGVQYXJtcyA8PCAv SyAtMSAvQ29sdW1ucyAxNiA+PgovTGVuZ3RoIDEwMQovRmlsdGVyIC9DQ0lU VEZheERlY29kZQo+PgpzdHJlYW0KJqiOiOiOiOiOiOgliIiIi5hzDmHWIi5Q 5Q5Q5Q5Q5Q4IJYiIiIuYcococw4IJYiIi5Q5Q5Q5Q5Q5Q4IJYiIiIuYcw5h1 iIuUOUOUOUOUOUOCCWIiIiLmHKHKHMOCCWIiIsAEAEAKZW5kc3RyZWFtCmVu ZG9iagoKMjEwMSAwIG9iago8PAovVHlwZSAvUGF0dGVybgovUGF0dGVyblR5 cGUgMQovUGFpbnRUeXBlIDEKL1RpbGluZ1R5cGUgMQovQkJveCBbMCAwIDEg MV0KL1hTdGVwIDEuMDAxCi9ZU3RlcCAxLjAwMQovTWF0cml4IFsxLjUgMCAw IDEuNSAwIDBdCi9SZXNvdXJjZXMgPDwgL1Byb2NTZXQgWy9QREYgL0ltYWdl Q10gL1hPYmplY3QgPDwgL0ltMjEwMiAyMTAyIDAgUiA+PiA+PgovTGVuZ3Ro IDI5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42jPQMzYwUjBA IovSufQ9c40MgUyXfC4AaB4GpAplbmRzdHJlYW0KZW5kb2JqCgoyMTA0IDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW0yMTA0Ci9XaWR0aCAxNgovSGVpZ2h0IDE2Ci9CaXRzUGVyQ29tcG9uZW50 IDEKL0ltYWdlTWFzayB0cnVlCi9EZWNvZGUgWzAgMV0KL0RlY29kZVBhcm1z IDw8IC9LIC0xIC9Db2x1bW5zIDE2ID4+Ci9MZW5ndGggOTYKL0ZpbHRlciAv Q0NJVFRGYXhEZWNvZGUKPj4Kc3RyZWFtCiOiOiOiOiOiOgQSoREREbMOYcw9 CI2UOUOUOUOUOUOEqERERGzDlDlDmHCVCIiNlDlDlDlDlDlDhKhERERsw5hz D0IjZQ5Q5Q5Q5Q5Q4SoREREbMOUOUOYcJUIiIwAQAQplbmRzdHJlYW0KZW5k b2JqCgoyMTAzIDAgb2JqCjw8Ci9UeXBlIC9QYXR0ZXJuCi9QYXR0ZXJuVHlw ZSAxCi9QYWludFR5cGUgMQovVGlsaW5nVHlwZSAxCi9CQm94IFswIDAgMSAx XQovWFN0ZXAgMS4wMDEKL1lTdGVwIDEuMDAxCi9NYXRyaXggWzEuNSAwIDAg MS41IDAgMF0KL1Jlc291cmNlcyA8PCAvUHJvY1NldCBbL1BERiAvSW1hZ2VD XSAvWE9iamVjdCA8PCAvSW0yMTA0IDIxMDQgMCBSID4+ID4+Ci9MZW5ndGgg MzAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaM9AzNjBSMEAi i9K59D1zjQwNTBRc8rkAaCgGpgplbmRzdHJlYW0KZW5kb2JqCgoyMTA2IDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW0yMTA2Ci9XaWR0aCAxNgovSGVpZ2h0IDE2Ci9CaXRzUGVyQ29tcG9uZW50 IDEKL0ltYWdlTWFzayB0cnVlCi9EZWNvZGUgWzAgMV0KL0RlY29kZVBhcm1z IDw8IC9LIC0xIC9Db2x1bW5zIDE2ID4+Ci9MZW5ndGggMTAzCi9GaWx0ZXIg L0NDSVRURmF4RGVjb2RlCj4+CnN0cmVhbQomoLyhyhyhyhyhyhwQSxERERco cw5hwQWIiOUOUOUOUOUOUOCCWIiIiLlDmHKHKHBBLEREXKHKHKHKHKHKHBBL ERERFyhzDmHBBYiI5Q5Q5Q5Q5Q5Q4IJYiIiIuUOYcococEEoAIAICmVuZHN0 cmVhbQplbmRvYmoKCjIxMDUgMCBvYmoKPDwKL1R5cGUgL1BhdHRlcm4KL1Bh dHRlcm5UeXBlIDEKL1BhaW50VHlwZSAxCi9UaWxpbmdUeXBlIDEKL0JCb3gg WzAgMCAxIDFdCi9YU3RlcCAxLjAwMQovWVN0ZXAgMS4wMDEKL01hdHJpeCBb MS41IDAgMCAxLjUgMCAwXQovUmVzb3VyY2VzIDw8IC9Qcm9jU2V0IFsvUERG IC9JbWFnZUNdIC9YT2JqZWN0IDw8IC9JbTIxMDYgMjEwNiAwIFIgPj4gPj4K L0xlbmd0aCAzMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoz 0DM2MFIwQCKL0rn0PXONDA3MFFzyuQBoMgaoCmVuZHN0cmVhbQplbmRvYmoK CjIxMDggMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdl Ci9OYW1lIC9JbTIxMDgKL1dpZHRoIDE2Ci9IZWlnaHQgMTYKL0JpdHNQZXJD b21wb25lbnQgMQovSW1hZ2VNYXNrIHRydWUKL0RlY29kZSBbMCAxXQovRGVj b2RlUGFybXMgPDwgL0sgLTEgL0NvbHVtbnMgMTYgPj4KL0xlbmd0aCA5OAov RmlsdGVyIC9DQ0lUVEZheERlY29kZQo+PgpzdHJlYW0KJqC7KHKHKHKHKHKH CVCIiIjnHMOYcJYiI2UOUOUOUOUOUOEqERERGyhzDlDlDhKhERGyhyhyhyhy hyhwlQiIiI5xzDmHCWIiNlDlDlDlDlDlDhKhERERsocw5Q5Q4SgAgAgKZW5k c3RyZWFtCmVuZG9iagoKMjEwNyAwIG9iago8PAovVHlwZSAvUGF0dGVybgov UGF0dGVyblR5cGUgMQovUGFpbnRUeXBlIDEKL1RpbGluZ1R5cGUgMQovQkJv eCBbMCAwIDEgMV0KL1hTdGVwIDEuMDAxCi9ZU3RlcCAxLjAwMQovTWF0cml4 IFsxLjUgMCAwIDEuNSAwIDBdCi9SZXNvdXJjZXMgPDwgL1Byb2NTZXQgWy9Q REYgL0ltYWdlQ10gL1hPYmplY3QgPDwgL0ltMjEwOCAyMTA4IDAgUiA+PiA+ PgovTGVuZ3RoIDMwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4 2jPQMzYwUjBAIovSufQ9c40MDSwUXPK5AGg8BqoKZW5kc3RyZWFtCmVuZG9i agoKMjExMCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1h Z2UKL05hbWUgL0ltMjExMAovV2lkdGggMTYKL0hlaWdodCAxNgovQml0c1Bl ckNvbXBvbmVudCAxCi9JbWFnZU1hc2sgdHJ1ZQovRGVjb2RlIFswIDFdCi9E ZWNvZGVQYXJtcyA8PCAvSyAtMSAvQ29sdW1ucyAxNiA+PgovTGVuZ3RoIDEw MAovRmlsdGVyIC9DQ0lUVEZheERlY29kZQo+PgpzdHJlYW0KJqC8ococococ ococEEsREREXMOYcw6xEXKHKHKHKHKHKHBBLERERFyhyhzDlDlDrEREXKHKH KHKHKHKHBBLERERFzDmHMOsRFyhyhyhyhyhyhwQSxERERcococw5Q5Q6gAgA gAplbmRzdHJlYW0KZW5kb2JqCgoyMTA5IDAgb2JqCjw8Ci9UeXBlIC9QYXR0 ZXJuCi9QYXR0ZXJuVHlwZSAxCi9QYWludFR5cGUgMQovVGlsaW5nVHlwZSAx Ci9CQm94IFswIDAgMSAxXQovWFN0ZXAgMS4wMDEKL1lTdGVwIDEuMDAxCi9N YXRyaXggWzEuNSAwIDAgMS41IDAgMF0KL1Jlc291cmNlcyA8PCAvUHJvY1Nl dCBbL1BERiAvSW1hZ2VDXSAvWE9iamVjdCA8PCAvSW0yMTEwIDIxMTAgMCBS ID4+ID4+Ci9MZW5ndGggMzAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3Ry ZWFtCnjaM9AzNjBSMEAii9K59D1zjQwNDRRc8rkAaBoGowplbmRzdHJlYW0K ZW5kb2JqCgoyMTEyIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBl IC9JbWFnZQovTmFtZSAvSW0yMTEyCi9XaWR0aCAxNgovSGVpZ2h0IDE2Ci9C aXRzUGVyQ29tcG9uZW50IDEKL0ltYWdlTWFzayB0cnVlCi9EZWNvZGUgWzAg MV0KL0RlY29kZVBhcm1zIDw8IC9LIC0xIC9Db2x1bW5zIDE2ID4+Ci9MZW5n dGggOTcKL0ZpbHRlciAvQ0NJVFRGYXhEZWNvZGUKPj4Kc3RyZWFtCiaguyhy hyhyhyhyhwlQiIiI2Ycw5h6ERsococococococJUIiIiNlDlDmHKHKHoRERs ococococococJUIiIiNmHMOYehEbKHKHKHKHKHKHCVCIiIjZQ5Q5hyhyh4AI AIAKZW5kc3RyZWFtCmVuZG9iagoKMjExMSAwIG9iago8PAovVHlwZSAvUGF0 dGVybgovUGF0dGVyblR5cGUgMQovUGFpbnRUeXBlIDEKL1RpbGluZ1R5cGUg MQovQkJveCBbMCAwIDEgMV0KL1hTdGVwIDEuMDAxCi9ZU3RlcCAxLjAwMQov TWF0cml4IFsxLjUgMCAwIDEuNSAwIDBdCi9SZXNvdXJjZXMgPDwgL1Byb2NT ZXQgWy9QREYgL0ltYWdlQ10gL1hPYmplY3QgPDwgL0ltMjExMiAyMTEyIDAg UiA+PiA+PgovTGVuZ3RoIDMwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0 cmVhbQp42jPQMzYwUjBAIovSufQ9c40MDY0UXPK5AGgkBqUKZW5kc3RyZWFt CmVuZG9iagoKMjExNCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlw ZSAvSW1hZ2UKL05hbWUgL0ltMjExNAovV2lkdGggMTYKL0hlaWdodCAxNgov Qml0c1BlckNvbXBvbmVudCAxCi9JbWFnZU1hc2sgdHJ1ZQovRGVjb2RlIFsw IDFdCi9EZWNvZGVQYXJtcyA8PCAvSyAtMSAvQ29sdW1ucyAxNiA+PgovTGVu Z3RoIDEwNgovRmlsdGVyIC9DQ0lUVEZheERlY29kZQo+PgpzdHJlYW0KJqC8 ococococococEEsREREXKHMOYcEFiIjlDlDlDlDlDlDggliIiIi5Q5Q5Q5hy hwQWIiIjlDlDlDlDlDlDggliIiIi5Q5hzDggsREcococococococEEsREREX KHKHKHMOUOCCgAgAgAplbmRzdHJlYW0KZW5kb2JqCgoyMTEzIDAgb2JqCjw8 Ci9UeXBlIC9QYXR0ZXJuCi9QYXR0ZXJuVHlwZSAxCi9QYWludFR5cGUgMQov VGlsaW5nVHlwZSAxCi9CQm94IFswIDAgMSAxXQovWFN0ZXAgMS4wMDEKL1lT dGVwIDEuMDAxCi9NYXRyaXggWzEuNSAwIDAgMS41IDAgMF0KL1Jlc291cmNl cyA8PCAvUHJvY1NldCBbL1BERiAvSW1hZ2VDXSAvWE9iamVjdCA8PCAvSW0y MTE0IDIxMTQgMCBSID4+ID4+Ci9MZW5ndGggMzAKL0ZpbHRlciAvRmxhdGVE ZWNvZGUKPj4Kc3RyZWFtCnjaM9AzNjBSMEAii9K59D1zjQwNTRRc8rkAaC4G pwplbmRzdHJlYW0KZW5kb2JqCgoyMTE2IDAgb2JqCjw8Ci9UeXBlIC9YT2Jq ZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMTE2Ci9XaWR0aCAxNgov SGVpZ2h0IDE2Ci9CaXRzUGVyQ29tcG9uZW50IDEKL0ltYWdlTWFzayB0cnVl Ci9EZWNvZGUgWzAgMV0KL0RlY29kZVBhcm1zIDw8IC9LIC0xIC9Db2x1bW5z IDE2ID4+Ci9MZW5ndGggMTAxCi9GaWx0ZXIgL0NDSVRURmF4RGVjb2RlCj4+ CnN0cmVhbQomoLsococococococJUIiIiOccw5hwliIjZQ5Q5Q5Q5Q5Q4SoR EREc45Q5Q5hyhwliIiI2UOUOUOUOUOUOEqERERHOOYcw4SxERsocococococ ocJUIiIiOccococw5Q4SgAgAgAplbmRzdHJlYW0KZW5kb2JqCgoyMTE1IDAg b2JqCjw8Ci9UeXBlIC9QYXR0ZXJuCi9QYXR0ZXJuVHlwZSAxCi9QYWludFR5 cGUgMQovVGlsaW5nVHlwZSAxCi9CQm94IFswIDAgMSAxXQovWFN0ZXAgMS4w MDEKL1lTdGVwIDEuMDAxCi9NYXRyaXggWzEuNSAwIDAgMS41IDAgMF0KL1Jl c291cmNlcyA8PCAvUHJvY1NldCBbL1BERiAvSW1hZ2VDXSAvWE9iamVjdCA8 PCAvSW0yMTE2IDIxMTYgMCBSID4+ID4+Ci9MZW5ndGggMzAKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaM9AzNjBSMEAii9K59D1zjQwNzRRc 8rkAaDgGqQplbmRzdHJlYW0KZW5kb2JqCgoyMTE4IDAgb2JqCjw8Ci9UeXBl IC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMTE4Ci9XaWR0 aCAxNgovSGVpZ2h0IDE2Ci9CaXRzUGVyQ29tcG9uZW50IDEKL0ltYWdlTWFz ayB0cnVlCi9EZWNvZGUgWzAgMV0KL0RlY29kZVBhcm1zIDw8IC9LIC0xIC9D b2x1bW5zIDE2ID4+Ci9MZW5ndGggMTAwCi9GaWx0ZXIgL0NDSVRURmF4RGVj b2RlCj4+CnN0cmVhbQomoLyhyhyhyhyhyhwQSxERERcw5hzDrERcococococ ococEEsREREXMOUOUOYcEEsRERcococococococEEsREREXMOYcw6xEXKHKH KHKHKHKHBBLERERFzDlDlDmHBBKACACACmVuZHN0cmVhbQplbmRvYmoKCjIx MTcgMCBvYmoKPDwKL1R5cGUgL1BhdHRlcm4KL1BhdHRlcm5UeXBlIDEKL1Bh aW50VHlwZSAxCi9UaWxpbmdUeXBlIDEKL0JCb3ggWzAgMCAxIDFdCi9YU3Rl cCAxLjAwMQovWVN0ZXAgMS4wMDEKL01hdHJpeCBbMS41IDAgMCAxLjUgMCAw XQovUmVzb3VyY2VzIDw8IC9Qcm9jU2V0IFsvUERGIC9JbWFnZUNdIC9YT2Jq ZWN0IDw8IC9JbTIxMTggMjExOCAwIFIgPj4gPj4KL0xlbmd0aCAzMAovRmls dGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoz0DM2MFIwQCKL0rn0PXON DA0tFFzyuQBoQgarCmVuZHN0cmVhbQplbmRvYmoKCjIxMjAgMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIxMjAK L1dpZHRoIDE2Ci9IZWlnaHQgMTYKL0JpdHNQZXJDb21wb25lbnQgMQovSW1h Z2VNYXNrIHRydWUKL0RlY29kZSBbMCAxXQovRGVjb2RlUGFybXMgPDwgL0sg LTEgL0NvbHVtbnMgMTYgPj4KL0xlbmd0aCA5NgovRmlsdGVyIC9DQ0lUVEZh eERlY29kZQo+PgpzdHJlYW0KJqC7KHKHKHKHKHKHCVCIiIjZhzDmHoRGyhyh yhyhyhyhwlQiIiI2Ycococw4SoRERsococococococJUIiIiNmHMOYehEbKH KHKHKHKHKHCVCIiIjZhyhyhzDhKACACACmVuZHN0cmVhbQplbmRvYmoKCjIx MTkgMCBvYmoKPDwKL1R5cGUgL1BhdHRlcm4KL1BhdHRlcm5UeXBlIDEKL1Bh aW50VHlwZSAxCi9UaWxpbmdUeXBlIDEKL0JCb3ggWzAgMCAxIDFdCi9YU3Rl cCAxLjAwMQovWVN0ZXAgMS4wMDEKL01hdHJpeCBbMS41IDAgMCAxLjUgMCAw XQovUmVzb3VyY2VzIDw8IC9Qcm9jU2V0IFsvUERGIC9JbWFnZUNdIC9YT2Jq ZWN0IDw8IC9JbTIxMjAgMjEyMCAwIFIgPj4gPj4KL0xlbmd0aCAzMAovRmls dGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoz0DM2MFIwQCKL0rn0PXON DI0MFFzyuQBoIAakCmVuZHN0cmVhbQplbmRvYmoKCjIxMjEgMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIxMjEK L1dpZHRoIDEKL0hlaWdodCAyNTIKL0JpdHNQZXJDb21wb25lbnQgOAovQ29s b3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxNTQgPGE5YWFhYWE5YWFh YmE4YTlhYmE3YTlhY2E2YTlhY2E2YThhZGE1YThhZGE0YThhZGE0YThhZWEz YThhZWEyYTdhZWEyYTdhZmExYTdhZmEwYTdhZmEwYTdiMDlmYTZiMDllYTZi MTlkYTZiMTljYTViMTljYTViMjliYTViMjlhYTViMzk5YTViMzk4YTRiMzk4 YTRiNDk3YTRiNDk2YTNiNTk1YTNiNTk0YTNiNjkzYTJiNjkyYTJiNzkxYTJi NzkwYTFiNzhlYTFiODhkYTFiOThjYTBiOThiYTBiYThhYTBiYTg4OWZiYjg3 OWZiYjg2OWZiYzg0OWViYzgzOWViZDgyOWRiZDgwOWRiZTdmOWRiZTdlOWNi ZjdjOWNiZjdiOWJjMDdhOWJjMDc4OWJjMTc2OWFjMTc1OWFjMjczOWFjMjcy OTljMzcwOTljMzZmOThjNDZkOThjNDZiOThjNTZhOTdjNTY4OTdjNjY2OTdj NjY1OTZjNzYzOTZjNzYxOTVjNzYwOTVjODVlOTVjODVjOTRjOTVhOTRjOTU4 OTRjOTU3OTNjYTU1OTNjYTUzOTNjYTUyOTNjYjUwOTJjYjRlOTJjYjRjOTJj YzRiOTJjYzQ5OTFjYzQ3OTFjZDQ1OTFjZDQzOTBjZDQyOTBjZDQwOTBjZTNl OTBjZTNkOTBjZTNiOGZjZTM5OGZjZjM3OGZjZjM2OGZjZjM0OGVjZjMyOGVj ZjMwOGVkMDJlOGVkMDJkOGVkMDJiOGVkMDJhOGVkMDI4OGVkMTI2OGRkMTI0 OGRkMTIyOGRkMTIwOGRkMTFmOGRkMTFlOGRkMTFiOGRkMTE5OGRkMjE3OGNk MjE1OGNkMjEyOGNkMjBmOGNkMjBlOGNkMjBhOGNkMjAxOGNkMjBiOGNkMjFj OGRkMTIzOGRkMTI3OGRkMTI5OGVkMTJjOGVkMDJmOGVkMDMxOGVkMDM1OGVj ZjM4OGZjZjNhOGZjZjNjOGZjZTNmOTBjZTQxOTBjZTQ0OTBjZDQ2OTFjZDQ4 OTFjZDRhOTFjYzRkOTJjYzRmOTJjYjU3OTRjOTU5OTRjOTVjOTVjODYwOTVj NzYyOTZjNzY1OTdjNjY3OTdjNjY4OTdjNTZhOThjNTZjOThjNDZmOTljMzcx OTljMzcyOWFjMjc0OWFjMjc1OWFjMTc3OWJjMTc4OWJjMDgxOWRiZTg1OWVi Yzg5OWZiYjhmYTFiOGFhYWFhYT5dCi9MZW5ndGggMjUzCi9GaWx0ZXIgL0Zs YXRlRGVjb2RlCj4+CnN0cmVhbQp42mNgBAImIGBmZmZhYWVjY2Pn4OTk4ubh 5ePnFxAUEhYRFROXkJSSlpGVk1dQVFJWUVVT19DU0tbR1dM3MDQyNjE1M7ew tLK2sbWzd3B0cnZxdXP38PTy9vH18w8IDAoOCQ0Lj4iMio6JjYtPSExKTklN S8/IzMrOyc3LLyjMzc3JzsosSk9LLU4uKU0oiyuviK6MrKquCa2tC6pvaGzy bW7x8vRwb21zaXfq6LTv6u7p7bPsnzBx0uQpUw0N9PV0p2lrTddQn6Gqoqw0 U0FeTlZGWkpSQlxMVERYSFCAn5+Pl4ebi5OTgx3oM1YWFqAvQZ4FeZphFgB6 +DvaCmVuZHN0cmVhbQplbmRvYmoKCjIxMjIgMCBvYmoKPDwKL1R5cGUgL1hP YmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIxMjIKL1dpZHRoIDEK L0hlaWdodCAyNTYKL0JpdHNQZXJDb21wb25lbnQgOAovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiAxNTQgPGE5YWFhYWE5YWFhYmE4YTlhYmE3 YTlhY2E2YTlhY2E2YThhZGE1YThhZGE0YThhZGE0YThhZWEzYThhZWEyYTdh ZWEyYTdhZmExYTdhZmEwYTdhZmEwYTdiMDlmYTZiMDllYTZiMTlkYTZiMTlj YTViMTljYTViMjliYTViMjlhYTViMzk5YTViMzk4YTRiMzk4YTRiNDk3YTRi NDk2YTNiNTk1YTNiNTk0YTNiNjkzYTJiNjkyYTJiNzkxYTJiNzkwYTFiNzhl YTFiODhkYTFiOThjYTBiOThiYTBiYThhYTBiYTg4OWZiYjg3OWZiYjg2OWZi Yzg0OWViYzgzOWViZDgyOWRiZDgwOWRiZTdmOWRiZTdlOWNiZjdjOWNiZjdi OWJjMDdhOWJjMDc4OWJjMTc2OWFjMTc1OWFjMjczOWFjMjcyOTljMzcwOTlj MzZmOThjNDZkOThjNDZiOThjNTZhOTdjNTY4OTdjNjY2OTdjNjY1OTZjNzYz OTZjNzYxOTVjNzYwOTVjODVlOTVjODVjOTRjOTVhOTRjOTU4OTRjOTU3OTNj YTU1OTNjYTUzOTNjYTUyOTNjYjUwOTJjYjRlOTJjYjRjOTJjYzRiOTJjYzQ5 OTFjYzQ3OTFjZDQ1OTFjZDQzOTBjZDQyOTBjZDQwOTBjZTNlOTBjZTNkOTBj ZTNiOGZjZTM5OGZjZjM3OGZjZjM2OGZjZjM0OGVjZjMyOGVjZjMwOGVkMDJl OGVkMDJkOGVkMDJiOGVkMDJhOGVkMDI4OGVkMTI2OGRkMTI0OGRkMTIyOGRk MTIwOGRkMTFmOGRkMTFlOGRkMTFiOGRkMTE5OGRkMjE3OGNkMjE1OGNkMjEy OGNkMjBmOGNkMjBlOGNkMjBhOGNkMjAxOGNkMjBiOGNkMjFjOGRkMTIzOGRk MTI3OGRkMTI5OGVkMTJjOGVkMDJmOGVkMDMxOGVkMDM1OGVjZjM4OGZjZjNh OGZjZjNjOGZjZTNmOTBjZTQxOTBjZTQ0OTBjZDQ2OTFjZDQ4OTFjZDRhOTFj YzRkOTJjYzRmOTJjYjU3OTRjOTU5OTRjOTVjOTVjODYwOTVjNzYyOTZjNzY1 OTdjNjY3OTdjNjY4OTdjNTZhOThjNTZjOThjNDZmOTljMzcxOTljMzcyOWFj Mjc0OWFjMjc1OWFjMTc3OWJjMTc4OWJjMDgxOWRiZTg1OWViYzg5OWZiYjhm YTFiOGFhYWFhYT5dCi9MZW5ndGggMjU1Ci9GaWx0ZXIgL0ZsYXRlRGVjb2Rl Cj4+CnN0cmVhbQp42mNgBAImIGBmZmZhYWVjY2Pn4OTk4ubh5ePnFxAUEhYR FROXkJSSlpGVk1dQVFJWUVVT19DU0tbR1dM3MDQyNjE1M7ewtLK2sbWzd3B0 cnZxdXP38PTy9vH18w8IDAoOCQ0Lj4iMio6JjYtPSExKTklNS8/IzMrOyc3L LyjMzc3JzsosSk9LLU4uKU0oiyuviK6MrKquCa2tC6pvaGzybW7x8vRwb21z aXfq6LTv6u7p7bPsnzBx0uQpUw0N9PV0p2lrTddQn6Gqoqw0U0FeTlZGWkpS QlxMVERYSFCAn5+Pl4ebi5OTgx3oM1YWFqAvQZ4FeZphFggAAHBzPkIKZW5k c3RyZWFtCmVuZG9iagoKMjEyMyAwIG9iago8PAovVHlwZSAvWE9iamVjdAov U3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjEyMwovV2lkdGggMQovSGVpZ2h0 IDcyCi9CaXRzUGVyQ29tcG9uZW50IDgKL0NvbG9yU3BhY2UgWy9JbmRleGVk IC9EZXZpY2VSR0IgNTggPDZkOThjNDZmOTljMzcxOTljMzcyOWFjMjc0OWFj Mjc1OWFjMTc3OWJjMTc4OWJjMDdhOWJjMDdiOWJjMDdjOWNiZjdlOWNiZjdm OWRiZTgxOWRiZTgyOWRiZDgzOWViZDg1OWViYzg2OWZiYzg3OWZiYjg5OWZi YjhhYTBiYThiYTBiYThjYTBiOThkYTFiOThmYTFiODkwYTFiNzkxYTJiNzky YTJiNzkzYTJiNjk0YTNiNjk1YTNiNTk2YTNiNTk3YTRiNDk4YTRiNDk4YTRi Mzk5YTViMzlhYTViMzliYTViMjljYTViMjljYTViMTlkYTZiMTllYTZiMTlm YTZiMGEwYTdiMGEwYTdhZmExYTdhZmEyYTdhZmEyYTdhZWEzYThhZWE0YThh ZWE0YThhZGE1YThhZGE2YThhZGE2YTlhY2E3YTlhY2E4YTlhYmE5YWFhYmE5 YWFhYWFhYWFhYT5dCi9MZW5ndGggNzcKL0ZpbHRlciAvRmxhdGVEZWNvZGUK Pj4Kc3RyZWFtCnjaY2BkYmZhZWPn4OTi5uHl4xcQFBIWERUTl5CUkpaRlZNX UFRSVlFVU9fQ1NLS1tHV0zcwMDQyNjY2MTU1MzMzBwILILC0AgDtwwleCmVu ZHN0cmVhbQplbmRvYmoKCjIxMjQgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QK L1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIxMjQKL1dpZHRoIDEKL0hlaWdo dCAyNjAKL0JpdHNQZXJDb21wb25lbnQgOAovQ29sb3JTcGFjZSBbL0luZGV4 ZWQgL0RldmljZVJHQiAxNTQgPGFhYWFhYWE5YWFhYWE5YWFhYmE4YTlhYmE3 YTlhY2E2YTlhY2E2YThhZGE1YThhZGE0YThhZGE0YThhZWEzYThhZWEyYTdh ZWEyYTdhZmExYTdhZmEwYTdhZmEwYTdiMDlmYTZiMDllYTZiMTlkYTZiMTlj YTViMTljYTViMjliYTViMjlhYTViMzk5YTViMzk4YTRiMzk4YTRiNDk3YTRi NDk2YTNiNTk1YTNiNTk0YTNiNjkzYTJiNjkyYTJiNzkxYTJiNzkwYTFiNzhl YTFiODhkYTFiOThjYTBiOThiYTBiYThhYTBiYTg4OWZiYjg3OWZiYjg2OWZi Yzg0OWViYzgzOWViZDgyOWRiZDgwOWRiZTdmOWRiZTdlOWNiZjdjOWNiZjdi OWJjMDdhOWJjMDc4OWJjMTc2OWFjMTc1OWFjMjczOWFjMjcyOTljMzcwOTlj MzZmOThjNDZkOThjNDZiOThjNTZhOTdjNTY4OTdjNjY2OTdjNjY1OTZjNzYz OTZjNzYxOTVjNzYwOTVjODVlOTVjODVjOTRjOTVhOTRjOTU4OTRjOTU3OTNj YTU1OTNjYTUzOTNjYTUyOTNjYjUwOTJjYjRlOTJjYjRjOTJjYzRiOTJjYzQ5 OTFjYzQ3OTFjZDQ1OTFjZDQzOTBjZDQyOTBjZDQwOTBjZTNlOTBjZTNkOTBj ZTNiOGZjZTM5OGZjZjM3OGZjZjM2OGZjZjM0OGVjZjMyOGVjZjMwOGVkMDJl OGVkMDJkOGVkMDJiOGVkMDJhOGVkMDI4OGVkMTI2OGRkMTI0OGRkMTIyOGRk MTIwOGRkMTFmOGRkMTFlOGRkMTFiOGRkMTE5OGRkMjE3OGNkMjE1OGNkMjEy OGNkMjBmOGNkMjBlOGNkMjBhOGNkMjAxOGNkMjBiOGNkMjFjOGRkMTIzOGRk MTI3OGRkMTI5OGVkMTJjOGVkMDJmOGVkMDMxOGVkMDM1OGVjZjM4OGZjZjNh OGZjZjNjOGZjZTNmOTBjZTQxOTBjZTQ0OTBjZDQ2OTFjZDQ4OTFjZDRhOTFj YzRkOTJjYzRmOTJjYjU3OTRjOTU5OTRjOTVjOTVjODYwOTVjNzYyOTZjNzY1 OTdjNjY3OTdjNjY4OTdjNTZhOThjNTZjOThjNDZmOTljMzcxOTljMzcyOWFj Mjc0OWFjMjc1OWFjMTc3OWJjMTc4OWJjMDgxOWRiZTg1OWViYzg5OWZiYjhm YTFiOD5dCi9MZW5ndGggMjU5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0 cmVhbQp42mNgYGBgZAICZiBgYWFhZWVjZ2fn4OTi4ubh5eMXEBAUEhYRFROX kJSSlpGVk1dQVFJWUVVT19DU0tbR1dM3MDQyNjE1M7ewtLK2sbWzd3B0cnZx dXP38PTy9vH18w8IDAoOCQ0Lj4iMio6JjYtPSExKTklNS8/IzMrOyc3LLygs ysvLzcnOKs5ITytJKS1LLI+vqIypiqquqQ2rqw9uaGxq9mtp9fby9Ghrd+1w 7uxy6O7p7eu3mjBx0uQpU6cZGRro603X0Z6hqTFTTVVFeZaigrycrIy0lKSE uJioiLCQoIAAPx8vDzcXFycH0GdsrKxAX4I8C/I0IwMIAADn4jw7CmVuZHN0 cmVhbQplbmRvYmoKCjIxMjUgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1 YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIxMjUKL1dpZHRoIDM1Ci9IZWlnaHQg MwovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAv RGV2aWNlUkdCIDEzIDxkY2RlZTNkMmQ0ZGFkMmNhZDFjN2NhYzhjN2NhZDFj N2JmYzg4ODgyODc0ODUwNTA1MzUwNTA1MzUwNTk0ODQ1NTA1ZDUwNTk2ODY0 NmM1ZDY0NmM+XQovTGVuZ3RoIDU3Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+ CnN0cmVhbQp42mMUBAElJWNjYxMgNDY1SO+o6OzomFGxoqJjR0dHx8wVB7KW zwCKdHROr+iYAaQ6Ky4AANxiFo8KZW5kc3RyZWFtCmVuZG9iagoKMjEyNiAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltMjEyNgovV2lkdGggMwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg MgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDw4ODgyODc0 ODQ1NTA1MzUwNTA+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUK Pj4Kc3RyZWFtCnjakwAAABkAGQplbmRzdHJlYW0KZW5kb2JqCgoyMTI3IDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW0yMTI3Ci9XaWR0aCAzCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAy Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPDdkODI4NzQ4 NDU1MDUzNTA1MD5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+ PgpzdHJlYW0KeNqTAAAAGQAZCmVuZHN0cmVhbQplbmRvYmoKCjIxMjggMCBv YmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9J bTIxMjgKL1dpZHRoIDMKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIK L0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8ODg4Mjg3NDg1 MDUwNTM1MDUwPl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+ CnN0cmVhbQp42pMAAAAZABkKZW5kc3RyZWFtCmVuZG9iagoKMjEyOSAwIG9i ago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0lt MjEyOQovV2lkdGggMwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgov Q29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDw4ODgyODc0ODQ1 NTA1MzUwNTk+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4K c3RyZWFtCnjakwAAABkAGQplbmRzdHJlYW0KZW5kb2JqCgoyMTMwIDAgb2Jq Cjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0y MTMwCi9XaWR0aCAzCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9D b2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPDg4OGQ4NzVkNTA1 OTUzNTA1OT5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+Pgpz dHJlYW0KeNqTAAAAGQAZCmVuZHN0cmVhbQplbmRvYmoKCjIxMzEgMCBvYmoK PDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIx MzEKL1dpZHRoIDMKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0Nv bG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8ODg4ZDg3NTM1MDUw NTM1MDU5Pl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0 cmVhbQp42pMAAAAZABkKZW5kc3RyZWFtCmVuZG9iagoKMjEzMiAwIG9iago8 PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjEz MgovV2lkdGggMwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29s b3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDw4ODgyODc1MzUwNTA1 MzUwNTk+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3Ry ZWFtCnjakwAAABkAGQplbmRzdHJlYW0KZW5kb2JqCgoyMTMzIDAgb2JqCjw8 Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMTMz Ci9XaWR0aCAzCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xv clNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPDg4OGQ5MTUzNTA1MDUz NTA1OT5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl YW0KeNqTAAAAGQAZCmVuZHN0cmVhbQplbmRvYmoKCjIxMzQgMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIxMzQK L1dpZHRoIDMKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8ODg4ZDg3NDg1MDUwNTM1 MDU5Pl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVh bQp42pMAAAAZABkKZW5kc3RyZWFtCmVuZG9iagoKMjEzNSAwIG9iago8PAov VHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjEzNQov V2lkdGggMwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JT cGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDw5MjhkOWE0ODUwNTA1MzUw NTk+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFt CnjakwAAABkAGQplbmRzdHJlYW0KZW5kb2JqCgoyMTM2IDAgb2JqCjw8Ci9U eXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMTM2Ci9X aWR0aCA2Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNw YWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDQgPDY4YTE0N2U3ZjJlZDcyYWI1 OWU3ZGVlM2E3YWJiNT5dCi9MZW5ndGggMTEKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjaY1R2AQAAkABpCmVuZHN0cmVhbQplbmRvYmoKCjIx MzcgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9O YW1lIC9JbTIxMzcKL1dpZHRoIDMKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9u ZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8OTI4 ZDlhNTM1MDUwNTM1MDU5Pl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVj b2RlCj4+CnN0cmVhbQp42pMAAAAZABkKZW5kc3RyZWFtCmVuZG9iagoKMjEz OCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05h bWUgL0ltMjEzOAovV2lkdGggNgovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25l bnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA0IDw3MmEx NTlkY2U4ZTM4OGI1NzVlN2YyZWRjN2JmZWQ+XQovTGVuZ3RoIDExCi9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUMgEAAH4AWAplbmRzdHJl YW0KZW5kb2JqCgoyMTM5IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0 eXBlIC9JbWFnZQovTmFtZSAvSW0yMTM5Ci9XaWR0aCA2Ci9IZWlnaHQgMQov Qml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2 aWNlUkdCIDQgPDcyYTE2M2RjZThkYTg4YjU3NWQyZGVjOGQyYmZmNj5dCi9M ZW5ndGggMTEKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1Qy AQAAfgBYCmVuZHN0cmVhbQplbmRvYmoKCjIxNDAgMCBvYmoKPDwKL1R5cGUg L1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIxNDAKL1dpZHRo IDYKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2Ug Wy9JbmRleGVkIC9EZXZpY2VSR0IgNCA8NzJhMTU5ZGNlOGUzODhiNTc1Yzdk ZWM4ZDJjYWVkPl0KL0xlbmd0aCAxMQovRmlsdGVyIC9GbGF0ZURlY29kZQo+ PgpzdHJlYW0KeNpjVDIBAAB+AFgKZW5kc3RyZWFtCmVuZG9iagoKMjE0MSAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltMjE0MQovV2lkdGggMwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg MgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDw5MjhkOWE0 ODQ1NTA1MzUwNTk+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUK Pj4Kc3RyZWFtCnjakwAAABkAGQplbmRzdHJlYW0KZW5kb2JqCgoyMTQyIDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW0yMTQyCi9XaWR0aCAxMAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg NAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA4IDxmMTMxMzVm ZmRlZTNjNzMxMzVlN2RlZTM3MmExNTlkY2U4ZGE3ZGFiNmNjN2RlYzhhN2Nh OWE+XQovTGVuZ3RoIDEzCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVh bQp42mNUdk2rAAACqQFICmVuZHN0cmVhbQplbmRvYmoKCjIxNDMgMCBvYmoK PDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIx NDMKL1dpZHRoIDE2Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9D b2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDExIDw4ODUwMzVmY2Rl ZGFmYzMxMzVmY2U4ZWRmMTNiM2VmZmQ0ZGFmY2Q0ZGFjNzMxMzVkY2U4ZGE4 OGI1NzVjN2RlYmY5ZGJmODc+XQovTGVuZ3RoIDE2Ci9GaWx0ZXIgL0ZsYXRl RGVjb2RlCj4+CnN0cmVhbQp42mNUdlZVq5i5GgAHLQJvCmVuZHN0cmVhbQpl bmRvYmoKCjIxNDQgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTIxNDQKL1dpZHRoIDUKL0hlaWdodCAxCi9CaXRz UGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VS R0IgMyA8NWQ4ZDQ3ZmNjYWM4ZmMzMTM1ZmZkZWUzPl0KL0xlbmd0aCAxMAov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTbgAAALgAnAplbmRz dHJlYW0KZW5kb2JqCgoyMTQ1IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9T dWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMTQ1Ci9XaWR0aCAxMgovSGVpZ2h0 IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQg L0RldmljZVJHQiA4IDxmYzMxMzVmZmU4ZWRmY2Q0ZGFmYzQ1NDdmY2NhZDFm Y2FiYjU4ODhkNTlkMmRlYzg5ZGJmODc+XQovTGVuZ3RoIDE0Ci9GaWx0ZXIg L0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNkMmFNqwAAAjkBGwplbmRzdHJl YW0KZW5kb2JqCgoyMTQ2IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0 eXBlIC9JbWFnZQovTmFtZSAvSW0yMTQ2Ci9XaWR0aCAzCi9IZWlnaHQgMQov Qml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2 aWNlUkdCIDEgPDkyOGQ5YTUzNTA1MD5dCi9MZW5ndGggOQovRmlsdGVyIC9G bGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTAQAAFQAVCmVuZHN0cmVhbQplbmRv YmoKCjIxNDcgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0lt YWdlCi9OYW1lIC9JbTIxNDcKL1dpZHRoIDUKL0hlaWdodCAxCi9CaXRzUGVy Q29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0Ig MyA8YzczMTM1ZmNjYWM4ZmMzMTM1ZmZkZWUzPl0KL0xlbmd0aCAxMAovRmls dGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTbgAAALgAnAplbmRzdHJl YW0KZW5kb2JqCgoyMTQ4IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0 eXBlIC9JbWFnZQovTmFtZSAvSW0yMTQ4Ci9XaWR0aCAxMgovSGVpZ2h0IDEK L0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rl dmljZVJHQiA2IDxmMTMxMzVmY2RlZGFmYzMxMzVmY2NhZDFmY2FiYmZkMmRl Yzg5ZGJmOTE+XQovTGVuZ3RoIDE0Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+ CnN0cmVhbQp42mNUZGZRCgMAAWMAogplbmRzdHJlYW0KZW5kb2JqCgoyMTQ5 IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFt ZSAvSW0yMTQ5Ci9XaWR0aCAzCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVu dCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPDkyOGQ5 YTQ4NDU1MDUzNTA1MD5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNqTAAAAGQAZCmVuZHN0cmVhbQplbmRvYmoKCjIxNTAg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTIxNTAKL1dpZHRoIDgKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50 IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNSA8NzJhMTU5 ZmNiNWI1ZmMzMTM1ZmNjYWM4ZmNkZWRhZjEzMTM1Pl0KL0xlbmd0aCAxMgov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjFDJyBQAA5wCLCmVu ZHN0cmVhbQplbmRvYmoKCjIxNTEgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QK L1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIxNTEKL1dpZHRoIDEwCi9IZWln aHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhl ZCAvRGV2aWNlUkdCIDcgPGYxMzEzNWZjZDRkYWZjM2IzZWZjY2FkMWZjMzEz NWZjYWJiNWZjOTc5YWE3YmY5YT5dCi9MZW5ndGggMTMKL0ZpbHRlciAvRmxh dGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1R2dUkHAAJUARUKZW5kc3RyZWFtCmVu ZG9iagoKMjE1MiAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAv SW1hZ2UKL05hbWUgL0ltMjE1MgovV2lkdGggOAovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiA1IDw4OGFiNmNmY2I1YjVmYzMxMzVmZmNhYzhmY2RlZGFmMTMxMzU+XQov TGVuZ3RoIDEyCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMU MnIFAADnAIsKZW5kc3RyZWFtCmVuZG9iagoKMjE1MyAwIG9iago8PAovVHlw ZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjE1MwovV2lk dGggMTIKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3Bh Y2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgOCA8ZTczMTM1ZTdkZWUzZmNkNGRh ZjEzMTM1ZmNjYWQxZmMzYjNlZmNhYmI1ZmM5NzlhOTJhYjdlPl0KL0xlbmd0 aCAxNAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjZDIJC60A AAMKAVsKZW5kc3RyZWFtCmVuZG9iagoKMjE1NCAwIG9iago8PAovVHlwZSAv WE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjE1NAovV2lkdGgg MwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiAxIDw5ZDk3YTM1MzUwNTA+XQovTGVuZ3Ro IDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaEwEAABUAFQpl bmRzdHJlYW0KZW5kb2JqCgoyMTU1IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0 Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMTU1Ci9XaWR0aCAyMQovSGVp Z2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4 ZWQgL0RldmljZVJHQiAxNCA8ZmM5NzlhZmNiNWI1ZmMzMTM1ZmNjYWM4ZjEz MTM1ZTdkZWUzNTMxZDM1MWUxZDZjMjgxZDUwOWQ5N2EzZTczMTM1ZmNhYmI1 ZmMzYjNlZmM4ZDkxZjE4Mjg3Pl0KL0xlbmd0aCAxOQovRmlsdGVyIC9GbGF0 ZURlY29kZQo+PgpzdHJlYW0KeNpjFDIJKy+vmLXn7AMAFMcFBwplbmRzdHJl YW0KZW5kb2JqCgoyMTU2IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0 eXBlIC9JbWFnZQovTmFtZSAvSW0yMTU2Ci9XaWR0aCAzCi9IZWlnaHQgMQov Qml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2 aWNlUkdCIDIgPDlkOTdhMzQ4NTA1MDUzNDU1MD5dCi9MZW5ndGggOQovRmls dGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTAAAAGQAZCmVuZHN0cmVh bQplbmRvYmoKCjIxNTcgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5 cGUgL0ltYWdlCi9OYW1lIC9JbTIxNTcKL1dpZHRoIDIxCi9IZWlnaHQgMQov Qml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2 aWNlUkdCIDEwIDxmYzQ1NDdmZmI1YmZmYzMxMzVmZmNhYzg2ODFkMzUxZTFk NmMxMzFkNmMyODFkNTBhN2ExYTNmMTMxMzVmYzk3OWE+XQovTGVuZ3RoIDE5 Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMUMglLS0sL75zF AAAQpQNKCmVuZHN0cmVhbQplbmRvYmoKCjIxNTggMCBvYmoKPDwKL1R5cGUg L1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIxNTgKL1dpZHRo IDMKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2Ug Wy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8OWQ5N2EzNDg0NTUwNTM1MDUwPl0K L0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42pMA AAAZABkKZW5kc3RyZWFtCmVuZG9iagoKMjE1OSAwIG9iago8PAovVHlwZSAv WE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjE1OQovV2lkdGgg MjEKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2Ug Wy9JbmRleGVkIC9EZXZpY2VSR0IgOCA8ZmMzYjNlZmNiNWI1ZjEzMTM1MzMz MTc1MWUxZDZjMTMxZDZjMTMxZDc1N2QyNzM1ZmM4ZDkxPl0KL0xlbmd0aCAx OQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjFDIJDQtNdXGv YAAADmwCsAplbmRzdHJlYW0KZW5kb2JqCgoyMTYwIDAgb2JqCjw8Ci9UeXBl IC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMTYwCi9XaWR0 aCAyMQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFj ZSBbL0luZGV4ZWQgL0RldmljZVJHQiA3IDxmMTNiM2VmY2I1YjUyODI3NmMx MzFkNmMxMzFkNzUxZTFkNmM4ODgyODdmMTQ1NDc+XQovTGVuZ3RoIDE5Ci9G aWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMUMnZ2NnZ1MQ0rAAAL 2AKECmVuZHN0cmVhbQplbmRvYmoKCjIxNjEgMCBvYmoKPDwKL1R5cGUgL1hP YmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIxNjEKL1dpZHRoIDYK L0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9J bmRleGVkIC9EZXZpY2VSR0IgNCA8OWQ5N2EzNDg0NTUwNDg1MDUwNTM1MDUw YTdhYmFjPl0KL0xlbmd0aCAxMQovRmlsdGVyIC9GbGF0ZURlY29kZQo+Pgpz dHJlYW0KeNpjVDYBAACAAFkKZW5kc3RyZWFtCmVuZG9iagoKMjE2MiAwIG9i ago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0lt MjE2MgovV2lkdGggMjEKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQK L0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNiA8ZmMzYjNlYTdh YmQxMTMxZDYzMTMxZDc1MTMxZDZjMWUxZDZjZTczYjNlPl0KL0xlbmd0aCAx OQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjFDJxdjFxcXE2 TQAAC8ECYwplbmRzdHJlYW0KZW5kb2JqCgoyMTYzIDAgb2JqCjw8Ci9UeXBl IC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMTYzCi9XaWR0 aCA2Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNl IFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMgPDlkOTdhMzUzNTA1MDUzNDU1MGE3 YWJiNT5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3Ry ZWFtCnjaE90AAADcAMYKZW5kc3RyZWFtCmVuZG9iagoKMjE2NCAwIG9iago8 PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjE2 NAovV2lkdGggMjEKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0Nv bG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNiA8ZmM1MDUwMjgyNzZj MTMxZDc1MTMxZDZjMjgzMTdlMWUyNzc1N2QzMTNlPl0KL0xlbmd0aCAxOQov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjFFI2NjIJNjY2SgAA CfsCGwplbmRzdHJlYW0KZW5kb2JqCgoyMTY1IDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMTY1Ci9XaWR0aCA2 Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsv SW5kZXhlZCAvRGV2aWNlUkdCIDIgPGM3Y2FkMWE3YTFhM2RjZDRkYT5dCi9M ZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaE00A AACMAHYKZW5kc3RyZWFtCmVuZG9iagoKMjE2NiAwIG9iago8PAovVHlwZSAv WE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjE2NgovV2lkdGgg MjEKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2Ug Wy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8ZDJjYWQxMTMxZDc1MTMxZDZjMzMz MTc1Pl0KL0xlbmd0aCAxNAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl YW0KeNoTW7Vs1qoDAApWA2sKZW5kc3RyZWFtCmVuZG9iagoKMjE2NyAwIG9i ago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0lt MjE2NwovV2lkdGggMjEKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQK L0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNSA8NzI3OGFjMWUy NzdlMTMxZDZjMTMxZDc1MTMxZDYzMjgyNzZjPl0KL0xlbmd0aCAxOQovRmls dGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjFDJSVnYyVlJSCgAACKYB twplbmRzdHJlYW0KZW5kb2JqCgoyMTY4IDAgb2JqCjw8Ci9UeXBlIC9YT2Jq ZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMTY4Ci9XaWR0aCAyMgov SGVpZ2h0IDIKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0lu ZGV4ZWQgL0RldmljZVJHQiA3IDw0ODUwOTExMzFkNmMxMzFkNzUyODMxN2Uy ODMxNzVlN2U4ZjYzZDQ1ODdkY2RlZjY+XQovTGVuZ3RoIDI1Ci9GaWx0ZXIg L0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMUFBQUEhYSVBR0TRSEAEVBdwAW 7QJFCmVuZHN0cmVhbQplbmRvYmoKCjIxNjkgMCBvYmoKPDwKL1R5cGUgL1hP YmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIxNjkKL1dpZHRoIDIx Ci9IZWlnaHQgMwovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsv SW5kZXhlZCAvRGV2aWNlUkdCIDExIDw1ZDY0YTMzMzNiN2UxMzFkNmMxMzFk NzUxZTI3NmMxZTI3NzU4ODhkYjUxMzFkNjMyODI3NmNlN2U4ZWQxZTFkNmMz MzMxNzU+XQovTGVuZ3RoIDM2Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0 cmVhbQp42mMUUgIBZSWVgNTgCiCtZKRs7DBrkZIRUNBI2WoDAGhQBy4KZW5k c3RyZWFtCmVuZG9iagoKMjE3MCAwIG9iago8PAovVHlwZSAvWE9iamVjdAov U3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjE3MAovV2lkdGggMjAKL0hlaWdo dCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVk IC9EZXZpY2VSR0IgNSA8MjgzMTc1MTMxZDZjMTMxZDc1MWUyNzZjMWUyNzc1 YmNiZmRhPl0KL0xlbmd0aCAxOAovRmlsdGVyIC9GbGF0ZURlY29kZQo+Pgpz dHJlYW0KeNpjEBQSFBZUEhJ0BQADlgDjCmVuZHN0cmVhbQplbmRvYmoKCjIx NzEgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9O YW1lIC9JbTIxNzEKL1dpZHRoIDE5Ci9IZWlnaHQgMQovQml0c1BlckNvbXBv bmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDQgPGRj ZGVmNjFlMjc3NTEzMWQ2YzEzMWQ3NTMzMzE3NT5dCi9MZW5ndGggMTgKL0Zp bHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYxBSUlJUMlZScgAABdAB UQplbmRzdHJlYW0KZW5kb2JqCgoyMTcyIDAgb2JqCjw8Ci9UeXBlIC9YT2Jq ZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMTcyCi9XaWR0aCAxNgov SGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0lu ZGV4ZWQgL0RldmljZVJHQiA0IDw3Mjc4YWMxMzFkNzUxMzFkNmMxZTFkNmMx ZTI3NmM+XQovTGVuZ3RoIDE2Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0 cmVhbQp42mMUUlISUhJ2AQADHADjCmVuZHN0cmVhbQplbmRvYmoKCjIxNzMg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTIxNzMKL1dpZHRoIDE1Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVu dCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDUgPDY4NmVh MzFlMWQ2YzEzMWQ3NTEzMWQ2YzFlMjc3NWU3ZThmNj5dCi9MZW5ndGggMTYK L0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1Q2NlY2dg0AAAU1 AXYKZW5kc3RyZWFtCmVuZG9iagoKMjE3NCAwIG9iago8PAovVHlwZSAvWE9i amVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjE3NAovV2lkdGggMTEK L0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9J bmRleGVkIC9EZXZpY2VSR0IgNiA8YmNiZmRhMWUyNzc1MTMxZDc1MTMxZDZj MTMxZDYzMWUyNzZjM2Q0NTg3Pl0KL0xlbmd0aCAxNAovRmlsdGVyIC9GbGF0 ZURlY29kZQo+PgpzdHJlYW0KeNpjFDI2MU0AAAKYARAKZW5kc3RyZWFtCmVu ZG9iagoKMjE3NSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAv SW1hZ2UKL05hbWUgL0ltMjE3NQovV2lkdGggNwovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiA1IDxiY2JmZGEzZDNiODcyODI3NmMxZTI3NmMyODMxNzU2ODZlYTM+XQov TGVuZ3RoIDEyCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNU NgkAAAEpAKkKZW5kc3RyZWFtCmVuZG9iagoKMjE3NiAwIG9iago8PAovVHlw ZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjE3NgovV2lk dGggNQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFj ZSBbL0luZGV4ZWQgL0RldmljZVJHQiAxIDxlN2RlZTNkY2RlZTM+XQovTGVu Z3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hN1AAAA bABWCmVuZHN0cmVhbQplbmRvYmoKCjIxNzcgMCBvYmoKPDwKL1R5cGUgL1hP YmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIxNzcKL1dpZHRoIDIK L0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9J bmRleGVkIC9EZXZpY2VSR0IgMSA8ZGNkZWUzN2Q4Mjg3Pl0KL0xlbmd0aCA5 Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hMAAAARABEKZW5k c3RyZWFtCmVuZG9iagoKMjE3OCAwIG9iago8PAovVHlwZSAvWE9iamVjdAov U3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjE3OAovV2lkdGggNQovSGVpZ2h0 IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQg L0RldmljZVJHQiAxIDw2ODY0NmM1ZDY0NmM+XQovTGVuZ3RoIDEwCi9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hN1AAAAbABWCmVuZHN0cmVh bQplbmRvYmoKCjIxNzkgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5 cGUgL0ltYWdlCi9OYW1lIC9JbTIxNzkKL1dpZHRoIDQKL0hlaWdodCAxCi9C aXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZp Y2VSR0IgMiA8OWRhMWEzNWQ2NDZjNzI2ZTc1Pl0KL0xlbmd0aCA5Ci9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hMDAAAXABcKZW5kc3RyZWFt CmVuZG9iagoKMjE4MCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlw ZSAvSW1hZ2UKL05hbWUgL0ltMjE4MAovV2lkdGggNwovSGVpZ2h0IDEKL0Jp dHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rldmlj ZVJHQiAzIDxiMmI1YjU1ZDY0NmM1ZDVhNmM3Mjc4N2U+XQovTGVuZ3RoIDEw Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hOdAwAAyACyCmVu ZHN0cmVhbQplbmRvYmoKCjIxODEgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QK L1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIxODEKL1dpZHRoIDUKL0hlaWdo dCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVk IC9EZXZpY2VSR0IgMSA8Njg2ZTc1NWQ1YTZjPl0KL0xlbmd0aCAxMAovRmls dGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTdQAAAGwAVgplbmRzdHJl YW0KZW5kb2JqCgoyMTgyIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0 eXBlIC9JbWFnZQovTmFtZSAvSW0yMTgyCi9XaWR0aCA0Ci9IZWlnaHQgMQov Qml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2 aWNlUkdCIDEgPDVkNWE2YzcyNmU3NT5dCi9MZW5ndGggOQovRmlsdGVyIC9G bGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjBAAAAgACCmVuZHN0cmVhbQplbmRv YmoKCjIxODMgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0lt YWdlCi9OYW1lIC9JbTIxODMKL1dpZHRoIDQKL0hlaWdodCAxCi9CaXRzUGVy Q29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0Ig MiA8ZDJjYWQxYjJiNWI1YzdjYWM4Pl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0Zs YXRlRGVjb2RlCj4+CnN0cmVhbQp42mMDAAAHAAcKZW5kc3RyZWFtCmVuZG9i agoKMjE4NCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1h Z2UKL05hbWUgL0ltMjE4NAovV2lkdGggNwovSGVpZ2h0IDEKL0JpdHNQZXJD b21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAy IDw3MjZlNzU1ZDVhNmM1ZDY0NmM+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0Zs YXRlRGVjb2RlCj4+CnN0cmVhbQp42hOdAQAAxACuCmVuZHN0cmVhbQplbmRv YmoKCjIxODUgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0lt YWdlCi9OYW1lIC9JbTIxODUKL1dpZHRoIDUKL0hlaWdodCAxCi9CaXRzUGVy Q29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0Ig MiA8Njg2NDc1NWQ2NDZjNWQ1YTZjPl0KL0xlbmd0aCAxMAovRmlsdGVyIC9G bGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTbQAAAKwAlgplbmRzdHJlYW0KZW5k b2JqCgoyMTg2IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9J bWFnZQovTmFtZSAvSW0yMTg2Ci9XaWR0aCA0Ci9IZWlnaHQgMQovQml0c1Bl ckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdC IDIgPDVkNjQ2YzVkNWE2YzcyNmU3NT5dCi9MZW5ndGggOQovRmlsdGVyIC9G bGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjAwAABwAHCmVuZHN0cmVhbQplbmRv YmoKCjIxODcgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0lt YWdlCi9OYW1lIC9JbTIxODcKL1dpZHRoIDgKL0hlaWdodCAxCi9CaXRzUGVy Q29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0Ig NCA8NWQ2NDZjNTM1YTYzNWQ1YTZjN2Q4MjkxZTdlOGVkPl0KL0xlbmd0aCAx MgovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVGZiAQAAeQAr CmVuZHN0cmVhbQplbmRvYmoKCjIxODggMCBvYmoKPDwKL1R5cGUgL1hPYmpl Y3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIxODgKL1dpZHRoIDQKL0hl aWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRl eGVkIC9EZXZpY2VSR0IgMiA8ZTdkZWUzYzdiZmM4YmNiZmM4Pl0KL0xlbmd0 aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42pMAAAAZABkK ZW5kc3RyZWFtCmVuZG9iagoKMjE4OSAwIG9iago8PAovVHlwZSAvWE9iamVj dAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjE4OQovV2lkdGggNQovSGVp Z2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4 ZWQgL0RldmljZVJHQiAzIDxkMmQ0ZGFiY2I1YzhjN2JmYzhlN2U4ZWQ+XQov TGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mM7 AAAAzgDHCmVuZHN0cmVhbQplbmRvYmoKCjIxOTAgMCBvYmoKPDwKL1R5cGUg L1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIxOTAKL1dpZHRo IDUKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2Ug Wy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8Njg2NDZjNWQ1YTZjNWQ2NDZjPl0K L0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqT agAAALYAmwplbmRzdHJlYW0KZW5kb2JqCgoyMTkxIDAgb2JqCjw8Ci9UeXBl IC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMTkxCi9XaWR0 aCA3Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNl IFsvSW5kZXhlZCAvRGV2aWNlUkdCIDQgPDY4NmU3NTY4NjQ2YzVkNWE2YzVk NjQ2YzcyNzg3ZT5dCi9MZW5ndGggMTIKL0ZpbHRlciAvRmxhdGVEZWNvZGUK Pj4Kc3RyZWFtCnjaY1QWcQAAANkAeQplbmRzdHJlYW0KZW5kb2JqCgoyMTky IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFt ZSAvSW0yMTkyCi9XaWR0aCA4Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVu dCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDQgPGM3Y2Fj ODY4NjQ2YzVkNjQ2YzVkNWE2Y2JjYmZiZj5dCi9MZW5ndGggMTIKL0ZpbHRl ciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1RWUgEAANkAawplbmRzdHJl YW0KZW5kb2JqCgoyMTkzIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0 eXBlIC9JbWFnZQovTmFtZSAvSW0yMTkzCi9XaWR0aCA3Ci9IZWlnaHQgMQov Qml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2 aWNlUkdCIDMgPDkyOTc5YTVkNjQ2YzVkNWE2YzY4NmU3NT5dCi9MZW5ndGgg MTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaE50DAADIALIK ZW5kc3RyZWFtCmVuZG9iagoKMjE5NCAwIG9iago8PAovVHlwZSAvWE9iamVj dAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjE5NAovV2lkdGggMTMKL0hl aWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRl eGVkIC9EZXZpY2VSR0IgNyA8ZDJkNGRhNWQ2NDZjYzdiZmM4ODg4Mjg3YjJi NWI1NzI2ZTc1Njg2NDZjNWQ1YTZjPl0KL0xlbmd0aCAxNQovRmlsdGVyIC9G bGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjFFQWCU0XAAADUAEWCmVuZHN0cmVh bQplbmRvYmoKCjIxOTUgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5 cGUgL0ltYWdlCi9OYW1lIC9JbTIxOTUKL1dpZHRoIDcKL0hlaWdodCAxCi9C aXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZp Y2VSR0IgMyA8NWQ2NDZjNjg2NDZjNWQ1YTZjODg4Mjg3Pl0KL0xlbmd0aCAx MAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjyAEAAG4AbQpl bmRzdHJlYW0KZW5kb2JqCgoyMTk2IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0 Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMTk2Ci9XaWR0aCA2Ci9IZWln aHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhl ZCAvRGV2aWNlUkdCIDMgPGRjZGVlMzY4NjQ2YzVkNjQ2Y2E3YWJiNT5dCi9M ZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaE9sA AADeAMcKZW5kc3RyZWFtCmVuZG9iagoKMjE5NyAwIG9iago8PAovVHlwZSAv WE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjE5NwovV2lkdGgg NAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiAyIDxkY2RlZTM1ZDVhNmM1ZDY0NmM+XQov TGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaEwMA ABcAFwplbmRzdHJlYW0KZW5kb2JqCgoyMTk4IDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMTk4Ci9XaWR0aCAx MAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiA0IDw1ZDY0NmM1ZDVhNmNjN2JmYzg2ODY0 NmNlN2U4ZWQ+XQovTGVuZ3RoIDEzCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+ CnN0cmVhbQp42mNkUBYwAQAAxwBpCmVuZHN0cmVhbQplbmRvYmoKCjIxOTkg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTIxOTkKL1dpZHRoIDExCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVu dCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDQgPGJjYmZj ODVkNjQ2Y2RjZDRlM2U3ZThlZDlkOTdhMz5dCi9MZW5ndGggMTQKL0ZpbHRl ciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYxRUFhR0AAABggCYCmVuZHN0 cmVhbQplbmRvYmoKCjIyMDAgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1 YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIyMDAKL1dpZHRoIDcKL0hlaWdodCAx Ci9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9E ZXZpY2VSR0IgNCA8N2Q3ODdlNWQ2NDZjNWQ1YTZjNjg2NDZjYmNiZmM4Pl0K L0xlbmd0aCAxMgovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpj FBJ2AAAApABnCmVuZHN0cmVhbQplbmRvYmoKCjIyMDEgMCBvYmoKPDwKL1R5 cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIyMDEKL1dp ZHRoIDgKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3Bh Y2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8YzdiZmM4NWQ2NDZjNWQ1YTZj Njg2NDc1Pl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+Pgpz dHJlYW0KeNpjSwcAAHUAbgplbmRzdHJlYW0KZW5kb2JqCgoyMjAyIDAgb2Jq Cjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0y MjAyCi9XaWR0aCA3Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9D b2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPDY4NmU3NTVkNjQ2 YzVkNWE2Yz5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4K c3RyZWFtCnjaE10BAADUAL4KZW5kc3RyZWFtCmVuZG9iagoKMjIwMyAwIG9i ago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0lt MjIwMwovV2lkdGggOAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgov Q29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAzIDw3ZDgyODc1ZDY0 NmM2ODY0NmM5Mjk3YTM+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVj b2RlCj4+CnN0cmVhbQp42hOdDQAAxwCxCmVuZHN0cmVhbQplbmRvYmoKCjIy MDQgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9O YW1lIC9JbTIyMDQKL1dpZHRoIDYKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9u ZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8Njg2 ZTc1NWQ2NDZjNWQ1YTZjZTdlOGVkPl0KL0xlbmd0aCAxMAovRmlsdGVyIC9G bGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTKgAAAKYAiwplbmRzdHJlYW0KZW5k b2JqCgoyMjA1IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9J bWFnZQovTmFtZSAvSW0yMjA1Ci9XaWR0aCA5Ci9IZWlnaHQgMQovQml0c1Bl ckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdC IDEgPDVkNjQ2YzVkNWE2Yz5dCi9MZW5ndGggMTEKL0ZpbHRlciAvRmxhdGVE ZWNvZGUKPj4Kc3RyZWFtCnjaEw1lAAAA7ABrCmVuZHN0cmVhbQplbmRvYmoK CjIyMDYgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdl Ci9OYW1lIC9JbTIyMDYKL1dpZHRoIDgKL0hlaWdodCAxCi9CaXRzUGVyQ29t cG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8 YzdiZmM4NWQ2NDZjNWQ1YTZjYjJiNWJmPl0KL0xlbmd0aCAxMAovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTSgcAAJ0AggplbmRzdHJlYW0K ZW5kb2JqCgoyMjA3IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBl IC9JbWFnZQovTmFtZSAvSW0yMjA3Ci9XaWR0aCA5Ci9IZWlnaHQgMQovQml0 c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNl UkdCIDMgPDg4ODI4NzVkNWE2YzVkNjQ2YzcyNzg3ZT5dCi9MZW5ndGggMTEK L0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaE116AAACTAF7CmVu ZHN0cmVhbQplbmRvYmoKCjIyMDggMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QK L1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIyMDgKL1dpZHRoIDEzCi9IZWln aHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhl ZCAvRGV2aWNlUkdCIDUgPGRjZDRkYTUzNWE2MzVkNWE2YzVkNjQ2Y2E3YWJi NTY4NmU3NT5dCi9MZW5ndGggMTUKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4K c3RyZWFtCnjaY1R2MglVMgAABG0BQgplbmRzdHJlYW0KZW5kb2JqCgoyMjA5 IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFt ZSAvSW0yMjA5Ci9XaWR0aCA4Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVu dCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPDVkNjQ2 YzVkNWE2YzkyOGQ5YT5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjaYxADAAAYABcKZW5kc3RyZWFtCmVuZG9iagoKMjIx MCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05h bWUgL0ltMjIxMAovV2lkdGggOQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25l bnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDw5ZGEx YTM1ZDY0NmNiY2I1Yzg+XQovTGVuZ3RoIDExCi9GaWx0ZXIgL0ZsYXRlRGVj b2RlCj4+CnN0cmVhbQp42mMNbQAAATwA2wplbmRzdHJlYW0KZW5kb2JqCgoy MjExIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQov TmFtZSAvSW0yMjExCi9XaWR0aCA1Ci9IZWlnaHQgMQovQml0c1BlckNvbXBv bmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPDVk NjQ2YzVkNWE2YzdkNzg4Nz5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVE ZWNvZGUKPj4Kc3RyZWFtCnjaY20AAACMAIYKZW5kc3RyZWFtCmVuZG9iagoK MjIxMiAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UK L05hbWUgL0ltMjIxMgovV2lkdGggNAovSGVpZ2h0IDEKL0JpdHNQZXJDb21w b25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDw5 Mjk3OWE1ZDVhNmM1ZDY0NmM+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVE ZWNvZGUKPj4Kc3RyZWFtCnjaEwMAABcAFwplbmRzdHJlYW0KZW5kb2JqCgoy MjEzIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQov TmFtZSAvSW0yMjEzCi9XaWR0aCAxMAovSGVpZ2h0IDEKL0JpdHNQZXJDb21w b25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDw1 ZDVhNmM2ODZlNzU2ODY0NmM+XQovTGVuZ3RoIDExCi9GaWx0ZXIgL0ZsYXRl RGVjb2RlCj4+CnN0cmVhbQp42mNwUAAAAKMAYQplbmRzdHJlYW0KZW5kb2Jq CgoyMjE0IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFn ZQovTmFtZSAvSW0yMjE0Ci9XaWR0aCAxMQovSGVpZ2h0IDEKL0JpdHNQZXJD b21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA1 IDxiY2JmYmY1ZDY0NmNkMmQ0ZGFlN2U4ZWQ1ZDVhNmM5Mjk3YTM+XQovTGVu Z3RoIDE0Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMUVBZ0 DAAAAfIA2AplbmRzdHJlYW0KZW5kb2JqCgoyMjE1IDAgb2JqCjw8Ci9UeXBl IC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMjE1Ci9XaWR0 aCA4Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNl IFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPDdkNzg4NzVkNWE2YzVkNjQ2Yz5d Ci9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja k1wFAADeAMQKZW5kc3RyZWFtCmVuZG9iagoKMjIxNiAwIG9iago8PAovVHlw ZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjIxNgovV2lk dGggOAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFj ZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDw1ZDY0NmM1ZDVhNmM2ODY0NmM+ XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4 2mNkAgAABgAECmVuZHN0cmVhbQplbmRvYmoKCjIyMTcgMCBvYmoKPDwKL1R5 cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIyMTcKL1dp ZHRoIDcKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3Bh Y2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8Njg2ZTc1NWQ2NDZjNWQ1YTZj Njg2NDc1Pl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+Pgpz dHJlYW0KeNoTzQEAAJgAggplbmRzdHJlYW0KZW5kb2JqCgoyMjE4IDAgb2Jq Cjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0y MjE4Ci9XaWR0aCA4Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9D b2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDQgPDY4NjQ2YzVkNjQ2 YzVkNWE2YzUzNWE2MzcyNmU3NT5dCi9MZW5ndGggMTIKL0ZpbHRlciAvRmxh dGVEZWNvZGUKPj4Kc3RyZWFtCnjaYxASFgEAAHQAOgplbmRzdHJlYW0KZW5k b2JqCgoyMjE5IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9J bWFnZQovTmFtZSAvSW0yMjE5Ci9XaWR0aCA5Ci9IZWlnaHQgMQovQml0c1Bl ckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdC IDUgPGIyYjViZjVkNWE2YzVkNjQ2YzY4NjQ3NTY4NjQ2YzkyOTc5YT5dCi9M ZW5ndGggMTMKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1Q2 dAwAAAH7AOcKZW5kc3RyZWFtCmVuZG9iagoKMjIyMCAwIG9iago8PAovVHlw ZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjIyMAovV2lk dGggNQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFj ZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDw2ODY0NzU1ZDVhNmM1ZDY0NmM+ XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4 2hNtAAAArACWCmVuZHN0cmVhbQplbmRvYmoKCjIyMjEgMCBvYmoKPDwKL1R5 cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIyMjEKL1dp ZHRoIDE5Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNw YWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDcgPDg4ODI4NzVkNjQ2YzVkNWE2 YzY4NjQ3NWE3YWJiNWM3YmZjODY4NjQ2Y2IyYjViZj5dCi9MZW5ndGggMTgK L0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYxQyVBRyFVRSKwAA BlABhgplbmRzdHJlYW0KZW5kb2JqCgoyMjIyIDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMjIyCi9XaWR0aCA1 Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsv SW5kZXhlZCAvRGV2aWNlUkdCIDMgPDY4NjQ2YzUzNWE2MzVkNWE2YzlkOTdh Mz5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFt CnjakzoAAAD2ANsKZW5kc3RyZWFtCmVuZG9iagoKMjIyMyAwIG9iago8PAov VHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjIyMwov V2lkdGggMTMKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNSA8ZDJkNGRhNTM1YTYzNWQ2 NDZjNWQ1YTZjYTdhYmI1Njg2ZTc1Pl0KL0xlbmd0aCAxNQovRmlsdGVyIC9G bGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVDZWCVVWAAAD1AEUCmVuZHN0cmVh bQplbmRvYmoKCjIyMjQgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5 cGUgL0ltYWdlCi9OYW1lIC9JbTIyMjQKL1dpZHRoIDUKL0hlaWdodCAxCi9C aXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZp Y2VSR0IgMyA8Njg2NDZjNWQ2NDZjNWQ1YTZjNjg2ZTc1Pl0KL0xlbmd0aCAx MAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjOwAAAM4Axwpl bmRzdHJlYW0KZW5kb2JqCgoyMjI1IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0 Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMjI1Ci9XaWR0aCA1Ci9IZWln aHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhl ZCAvRGV2aWNlUkdCIDMgPDY4NmU3NTVkNjQ2YzVkNWE2YzY4NjQ3NT5dCi9M ZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYzsA AADOAMcKZW5kc3RyZWFtCmVuZG9iagoKMjIyNiAwIG9iago8PAovVHlwZSAv WE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjIyNgovV2lkdGgg NAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiAyIDw2ODY0NmM1ZDVhNmM4ODgyODc+XQov TGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaEwMA ABcAFwplbmRzdHJlYW0KZW5kb2JqCgoyMjI3IDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMjI3Ci9XaWR0aCAy MgovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiA3IDw1ZDY0NmM1ZDVhNmM2ODY0NmNmMWU4 ZjZiY2I1YzhkMmQ0ZGFlN2U4ZWQ5Mjk3OWE+XQovTGVuZ3RoIDE5Ci9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNkEBIUNBFkTWBkBwAEgQDo CmVuZHN0cmVhbQplbmRvYmoKCjIyMjggMCBvYmoKPDwKL1R5cGUgL1hPYmpl Y3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIyMjgKL1dpZHRoIDQKL0hl aWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRl eGVkIC9EZXZpY2VSR0IgMiA8NWQ2NDZjNWQ1YTZjOWRhMWFjPl0KL0xlbmd0 aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hMCAAATABMK ZW5kc3RyZWFtCmVuZG9iagoKMjIyOSAwIG9iago8PAovVHlwZSAvWE9iamVj dAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjIyOQovV2lkdGggOQovSGVp Z2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4 ZWQgL0RldmljZVJHQiA0IDw2ODY0NmM1ZDY0NmM5ZDk3YTNjN2NhZDE1ZDVh NmM+XQovTGVuZ3RoIDEzCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVh bQp42mMUMhR0AAABRwCWCmVuZHN0cmVhbQplbmRvYmoKCjIyMzAgMCBvYmoK PDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIy MzAKL1dpZHRoIDcKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0Nv bG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNCA8ODg4ZDkxNzI3ODdl NWQ2NDZjNWQ1YTZjN2Q4Mjg3Pl0KL0xlbmd0aCAxMgovRmlsdGVyIC9GbGF0 ZURlY29kZQo+PgpzdHJlYW0KeNpjVDZ0AAABEwCWCmVuZHN0cmVhbQplbmRv YmoKCjIyMzEgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0lt YWdlCi9OYW1lIC9JbTIyMzEKL1dpZHRoIDUKL0hlaWdodCAxCi9CaXRzUGVy Q29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0Ig MyA8NzI3ODdlNWQ2NDZjNWQ1YTZjNjg2NDc1Pl0KL0xlbmd0aCAxMAovRmls dGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTPgAAAPgA3AplbmRzdHJl YW0KZW5kb2JqCgoyMjMyIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0 eXBlIC9JbWFnZQovTmFtZSAvSW0yMjMyCi9XaWR0aCA2Ci9IZWlnaHQgMQov Qml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2 aWNlUkdCIDMgPDY4NjQ3NTVkNWE2YzVkNjQ2Y2U3ZThmNj5dCi9MZW5ndGgg MTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaE90AAADcAMYK ZW5kc3RyZWFtCmVuZG9iagoKMjIzMyAwIG9iago8PAovVHlwZSAvWE9iamVj dAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjIzMwovV2lkdGggNgovSGVp Z2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4 ZWQgL0RldmljZVJHQiAzIDxlN2U4ZWQ1ZDVhNmM1MzVhNjM2ODY0NzU+XQov TGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42pMq AAAApgCLCmVuZHN0cmVhbQplbmRvYmoKCjIyMzQgMCBvYmoKPDwKL1R5cGUg L1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIyMzQKL1dpZHRo IDQKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2Ug Wy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8NWQ2NDZjNjg2ZTc1Pl0KL0xlbmd0 aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMEAAACAAIK ZW5kc3RyZWFtCmVuZG9iagoKMjIzNSAwIG9iago8PAovVHlwZSAvWE9iamVj dAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjIzNQovV2lkdGggNgovSGVp Z2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4 ZWQgL0RldmljZVJHQiAzIDxkMmQ0ZGE1ZDY0NmM1ZDVhNmNlN2U4ZWQ+XQov TGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42pPa AAAA5gDLCmVuZHN0cmVhbQplbmRvYmoKCjIyMzYgMCBvYmoKPDwKL1R5cGUg L1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIyMzYKL1dpZHRo IDE3Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNl IFsvSW5kZXhlZCAvRGV2aWNlUkdCIDggPDY4NmU3NTVkNjQ2Y2JjYmZjOGQy ZDRkYTVkNWE2YzUzNWE2MzdkODI4N2IyYjViNTY4NjQ3NT5dCi9MZW5ndGgg MTcKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYxQycRVMZ3Bs AAAGnwHGCmVuZHN0cmVhbQplbmRvYmoKCjIyMzcgMCBvYmoKPDwKL1R5cGUg L1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIyMzcKL1dpZHRo IDcKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2Ug Wy9JbmRleGVkIC9EZXZpY2VSR0IgNSA8ZTdkZWUzYjJiNWI1YTdhYmFjYTdh YmI1NWQ2NDZjNWQ1YTZjPl0KL0xlbmd0aCAxMgovRmlsdGVyIC9GbGF0ZURl Y29kZQo+PgpzdHJlYW0KeNpjVHZ1AAABOwCqCmVuZHN0cmVhbQplbmRvYmoK CjIyMzggMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdl Ci9OYW1lIC9JbTIyMzgKL1dpZHRoIDcKL0hlaWdodCAxCi9CaXRzUGVyQ29t cG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNSA8 Njg2ZTc1NWQ2NDZjNTM1YTYzNWQ1YTZjN2Q4Mjg3YmNiZmM4Pl0KL0xlbmd0 aCAxMgovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjEDIJAAAA 8gCXCmVuZHN0cmVhbQplbmRvYmoKCjIyMzkgMCBvYmoKPDwKL1R5cGUgL1hP YmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIyMzkKL1dpZHRoIDUK L0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9J bmRleGVkIC9EZXZpY2VSR0IgMSA8YjJiNWJmNWQ1YTZjPl0KL0xlbmd0aCAx MAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjdQAAAEwARgpl bmRzdHJlYW0KZW5kb2JqCgoyMjQwIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0 Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMjQwCi9XaWR0aCAxMAovSGVp Z2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4 ZWQgL0RldmljZVJHQiA0IDw1ZDVhNmNiMmI1YmZlN2U4ZWRjN2NhZDE1ZDY0 NmM+XQovTGVuZ3RoIDEzCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVh bQp42mNgVGZwBgAAtQBoCmVuZHN0cmVhbQplbmRvYmoKCjIyNDEgMCBvYmoK PDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIy NDEKL1dpZHRoIDUKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0Nv bG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8NWQ2NDZjNWQ1YTZj Njg2ZTc1Pl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+Pgpz dHJlYW0KeNoTbQAAAKwAlgplbmRzdHJlYW0KZW5kb2JqCgoyMjQyIDAgb2Jq Cjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0y MjQyCi9XaWR0aCAyMQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAov Q29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA4IDw5MjhkOWE1ZDY0 NmM1MzVhNjNjN2JmYzhiY2JmYmY1ZDVhNmNkMmNhZDFlN2U4ZWRkY2RlZTM+ XQovTGVuZ3RoIDE5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4 2mNUNAkNKxQVaAxNAAAOEgLOCmVuZHN0cmVhbQplbmRvYmoKCjIyNDMgMCBv YmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9J bTIyNDMKL1dpZHRoIDEyCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0 Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDYgPDg4ODI4NzVk NWE2YzVkNjQ2YzcyNmU3NWQyZDRkYTdkODI4N2M3Y2FkMT5dCi9MZW5ndGgg MTQKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1R2FFQKAwAC jADvCmVuZHN0cmVhbQplbmRvYmoKCjIyNDQgMCBvYmoKPDwKL1R5cGUgL1hP YmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIyNDQKL1dpZHRoIDE2 Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsv SW5kZXhlZCAvRGV2aWNlUkdCIDkgPGQyY2FkMTg4OGQ5MTg4ODI4NzkyOTc5 YTVkNWE2YzUzNWE2MzVkNjQ2Y2U3ZThlZDdkODI4N2RjZGVlMz5dCi9MZW5n dGggMTYKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1R2TW9z S5MEAAh1AhwKZW5kc3RyZWFtCmVuZG9iagoKMjI0NSAwIG9iago8PAovVHlw ZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjI0NQovV2lk dGggNgovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFj ZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDw2ODZlNzU1ZDY0NmNlN2U4ZWQ+ XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4 2hNNAAAAjAB2CmVuZHN0cmVhbQplbmRvYmoKCjIyNDYgMCBvYmoKPDwKL1R5 cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIyNDYKL1dp ZHRoIDUKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3Bh Y2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8NWQ1YTZjNWQ2NDZjNjg2NDZj Pl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0K eNpjbAAAAIQAggplbmRzdHJlYW0KZW5kb2JqCgoyMjQ3IDAgb2JqCjw8Ci9U eXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMjQ3Ci9X aWR0aCA0Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNw YWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPDVkNjQ2YzUzNWE2MzcyNmU3 NT5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0K eNoTAgAAEwATCmVuZHN0cmVhbQplbmRvYmoKCjIyNDggMCBvYmoKPDwKL1R5 cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIyNDgKL1dp ZHRoIDE2Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNw YWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDUgPGIyYjViNTVkNjQ2YzUzNWE2 MzVkNWE2YzkyOGQ5YWQyZDRkYT5dCi9MZW5ndGggMTYKL0ZpbHRlciAvRmxh dGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1RSNDZ2FTYEAAS1ATQKZW5kc3RyZWFt CmVuZG9iagoKMjI0OSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlw ZSAvSW1hZ2UKL05hbWUgL0ltMjI0OQovV2lkdGggNQovSGVpZ2h0IDEKL0Jp dHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rldmlj ZVJHQiAyIDw2ODZlNzU1ZDVhNmM1ZDY0NmM+XQovTGVuZ3RoIDEwCi9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNtAAAAjACGCmVuZHN0cmVh bQplbmRvYmoKCjIyNTAgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5 cGUgL0ltYWdlCi9OYW1lIC9JbTIyNTAKL1dpZHRoIDgKL0hlaWdodCAxCi9C aXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZp Y2VSR0IgMiA8Njg2NDZjNWQ1YTZjNWQ2NDZjPl0KL0xlbmd0aCAxMAovRmls dGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTTQMAAJIAfAplbmRzdHJl YW0KZW5kb2JqCgoyMjUxIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0 eXBlIC9JbWFnZQovTmFtZSAvSW0yMjUxCi9XaWR0aCA5Ci9IZWlnaHQgMQov Qml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2 aWNlUkdCIDMgPDlkYTFhMzVkNjQ2YzVkNWE2Y2JjYmZiZj5dCi9MZW5ndGgg MTEKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY0s9AAABnwEs CmVuZHN0cmVhbQplbmRvYmoKCjIyNTIgMCBvYmoKPDwKL1R5cGUgL1hPYmpl Y3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIyNTIKL1dpZHRoIDcKL0hl aWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRl eGVkIC9EZXZpY2VSR0IgMyA8NWQ1YTZjZDJkNGRhNWQ2NDZjNjg2NDc1Pl0K L0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpj 1AEAADAALgplbmRzdHJlYW0KZW5kb2JqCgoyMjUzIDAgb2JqCjw8Ci9UeXBl IC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMjUzCi9XaWR0 aCAxMgovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFj ZSBbL0luZGV4ZWQgL0RldmljZVJHQiA0IDxiY2JmYzg1ZDY0NmM1ZDVhNmM1 MzVhNjM3ZDc4N2U+XQovTGVuZ3RoIDE0Ci9GaWx0ZXIgL0ZsYXRlRGVjb2Rl Cj4+CnN0cmVhbQp42mMQUlISVgEAAZgAjgplbmRzdHJlYW0KZW5kb2JqCgoy MjU0IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQov TmFtZSAvSW0yMjU0Ci9XaWR0aCA1Ci9IZWlnaHQgMQovQml0c1BlckNvbXBv bmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMgPDVk NjQ2YzUzNWE2MzVkNWE2YzdkODI4Nz5dCi9MZW5ndGggMTAKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjakzoAAAD2ANsKZW5kc3RyZWFtCmVu ZG9iagoKMjI1NSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAv SW1hZ2UKL05hbWUgL0ltMjI1NQovV2lkdGggMjYKL0hlaWdodCAxCi9CaXRz UGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VS R0IgOCA8YmNiZmM4NWQ1YTZjYTdhYmFjNTM1YTYzNWQ2NDZjZDJkNGRhZTdl OGVkOTI5NzlhNjg2NDZjPl0KL0xlbmd0aCAyMQovRmlsdGVyIC9GbGF0ZURl Y29kZQo+PgpzdHJlYW0KeNpjFFQwdE0UcQ8UFBT0AAAOUQIxCmVuZHN0cmVh bQplbmRvYmoKCjIyNTYgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5 cGUgL0ltYWdlCi9OYW1lIC9JbTIyNTYKL1dpZHRoIDgKL0hlaWdodCAxCi9C aXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZp Y2VSR0IgMyA8NWQ1YTZjNTM1YTYzNWQ2NDZjNjg2NDZjPl0KL0xlbmd0aCAx MAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjUQYAAC0AKApl bmRzdHJlYW0KZW5kb2JqCgoyMjU3IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0 Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMjU3Ci9XaWR0aCA4Ci9IZWln aHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhl ZCAvRGV2aWNlUkdCIDIgPDY4NjQ2YzVkNjQ2YzVkNWE2Yz5dCi9MZW5ndGgg MTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaE4sEAACHAHAK ZW5kc3RyZWFtCmVuZG9iagoKMjI1OCAwIG9iago8PAovVHlwZSAvWE9iamVj dAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjI1OAovV2lkdGggOQovSGVp Z2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4 ZWQgL0RldmljZVJHQiAzIDxkMmQ0ZGE1ZDY0NmM1ZDVhNmM4ODgyODc+XQov TGVuZ3RoIDExCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42pOa eQAAAkMBdAplbmRzdHJlYW0KZW5kb2JqCgoyMjU5IDAgb2JqCjw8Ci9UeXBl IC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMjU5Ci9XaWR0 aCA2Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNl IFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMgPDY4NjQ2YzVkNWE2YzVkNjQ2Y2U3 ZThlZD5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3Ry ZWFtCnjaE90AAADcAMYKZW5kc3RyZWFtCmVuZG9iagoKMjI2MCAwIG9iago8 PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjI2 MAovV2lkdGggNQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29s b3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDw1ZDVhNmM1ZDY0NmM2 ODY0NzU+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0 cmVhbQp42mNsAAAAhACCCmVuZHN0cmVhbQplbmRvYmoKCjIyNjEgMCBvYmoK PDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIy NjEKL1dpZHRoIDQKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0Nv bG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8NWQ2NDZjNWQ1YTZj NzI2ZTc1Pl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0 cmVhbQp42hMCAAATABMKZW5kc3RyZWFtCmVuZG9iagoKMjI2MiAwIG9iago8 PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjI2 MgovV2lkdGggMTcKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0Nv bG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgOCA8ZGNkZWRhYmNiZmJm NWQ1YTZjNWQ2NDZjNjg2NDZjODg4ZDlhZGNkNGRhNTM1YTYzNzI2ZTc1Pl0K L0xlbmd0aCAxNwovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpj VFZSVjFNKmoAAAb8AhcKZW5kc3RyZWFtCmVuZG9iagoKMjI2MyAwIG9iago8 PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjI2 MwovV2lkdGggOQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29s b3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA0IDw3ZDgyODc1ZDY0NmM1 ZDVhNmNhN2ExYTNhN2FiYWM+XQovTGVuZ3RoIDEzCi9GaWx0ZXIgL0ZsYXRl RGVjb2RlCj4+CnN0cmVhbQp42mMUMlEUAAABQAB5CmVuZHN0cmVhbQplbmRv YmoKCjIyNjQgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0lt YWdlCi9OYW1lIC9JbTIyNjQKL1dpZHRoIDcKL0hlaWdodCAxCi9CaXRzUGVy Q29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0Ig MiA8Njg2NDZjNWQ1YTZjODg4Mjg3Pl0KL0xlbmd0aCAxMAovRmlsdGVyIC9G bGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTiwAAAIYAbwplbmRzdHJlYW0KZW5k b2JqCgoyMjY1IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9J bWFnZQovTmFtZSAvSW0yMjY1Ci9XaWR0aCAxMgovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiAzIDw3Mjc4N2U1ZDY0NmM1MzVhNjM1ZDVhNmM+XQovTGVuZ3RoIDExCi9G aWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mP7fxUAAugB2wplbmRz dHJlYW0KZW5kb2JqCgoyMjY2IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9T dWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMjY2Ci9XaWR0aCA1Ci9IZWlnaHQg MQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAv RGV2aWNlUkdCIDMgPDVkNWE2YzUzNWE2MzVkNjQ2YzdkODI4Nz5dCi9MZW5n dGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjakzoAAAD2 ANsKZW5kc3RyZWFtCmVuZG9iagoKMjI2NyAwIG9iago8PAovVHlwZSAvWE9i amVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjI2NwovV2lkdGggMjYK L0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9J bmRleGVkIC9EZXZpY2VSR0IgOSA8YmNiZmJmNWQ1YTZjNTM1YTYzYTdhYmFj NWQ2NDZjZDJkNGRhZTdlOGVkOTI4ZDlhZGNkZWUzNjg2NDZjPl0KL0xlbmd0 aCAyMQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVDQQcU1x dG8UFJwoAgARrgLgCmVuZHN0cmVhbQplbmRvYmoKCjIyNjggMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIyNjgK L1dpZHRoIDcKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8NzI3ODdlNWQ1YTZjNWQ2 NDZjYmNiZmM4Pl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+ PgpzdHJlYW0KeNqTygEAAKIAhwplbmRzdHJlYW0KZW5kb2JqCgoyMjY5IDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW0yMjY5Ci9XaWR0aCA4Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0 Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDQgPGQyZDRkYTY4 NjQ3NTVkNjQ2YzVkNWE2YzY4NjQ2Yz5dCi9MZW5ndGggMTIKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1RSVgEAANgAawplbmRzdHJlYW0K ZW5kb2JqCgoyMjcwIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBl IC9JbWFnZQovTmFtZSAvSW0yMjcwCi9XaWR0aCAxNQovSGVpZ2h0IDEKL0Jp dHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rldmlj ZVJHQiA0IDw2ODY0NzU1ZDVhNmM1ZDY0NmNkY2RlZjY2ODY0NmM+XQovTGVu Z3RoIDE2Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMUFFIS MlFSAAAC5QDPCmVuZHN0cmVhbQplbmRvYmoKCjIyNzEgMCBvYmoKPDwKL1R5 cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIyNzEKL1dp ZHRoIDYKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3Bh Y2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8ZGNkZWUzNWQ1YTZjNWQ2NDZj NzI3ODdlPl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+Pgpz dHJlYW0KeNoT3QAAANwAxgplbmRzdHJlYW0KZW5kb2JqCgoyMjcyIDAgb2Jq Cjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0y MjcyCi9XaWR0aCA2Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9D b2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPGU3ZThlZDVkNjQ2 Y2QyZDRkYT5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4K c3RyZWFtCnjaE00AAACMAHYKZW5kc3RyZWFtCmVuZG9iagoKMjI3MyAwIG9i ago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0lt MjI3MwovV2lkdGggNwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgov Q29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAzIDw4ODhkOTE1ZDVh NmM1MzVhNjNkMmNhZDE+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVj b2RlCj4+CnN0cmVhbQp42hOLAQAAigBzCmVuZHN0cmVhbQplbmRvYmoKCjIy NzQgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9O YW1lIC9JbTIyNzQKL1dpZHRoIDEzCi9IZWlnaHQgMQovQml0c1BlckNvbXBv bmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMgPDVk NjQ2YzVkNWE2YzUzNWE2M2U3ZGVlMz5dCi9MZW5ndGggMTIKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYwhNOQAAAosBegplbmRzdHJlYW0K ZW5kb2JqCgoyMjc1IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBl IC9JbWFnZQovTmFtZSAvSW0yMjc1Ci9XaWR0aCA1Ci9IZWlnaHQgMQovQml0 c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNl UkdCIDIgPDVkNWE2YzUzNWE2MzY4NjQ3NT5dCi9MZW5ndGggMTAKL0ZpbHRl ciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaE2gAAACiAJEKZW5kc3RyZWFt CmVuZG9iagoKMjI3NiAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlw ZSAvSW1hZ2UKL05hbWUgL0ltMjI3NgovV2lkdGggMTYKL0hlaWdodCAxCi9C aXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZp Y2VSR0IgOCA8N2Q4Mjg3NWQ1YTZjYzdjYWQxYmNiNWM4NWQ2NDZjYTdhMWEz YzdiZmM4NTM1YTYzOTI4ZDlhPl0KL0xlbmd0aCAxNgovRmlsdGVyIC9GbGF0 ZURlY29kZQo+PgpzdHJlYW0KeNpjFFQWEU1xqQAABD0BfwplbmRzdHJlYW0K ZW5kb2JqCgoyMjc3IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBl IC9JbWFnZQovTmFtZSAvSW0yMjc3Ci9XaWR0aCA0Ci9IZWlnaHQgMQovQml0 c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNl UkdCIDIgPDVkNjQ2YzVkNWE2YzlkYTFhYz5dCi9MZW5ndGggOQovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTAwAAFwAXCmVuZHN0cmVhbQpl bmRvYmoKCjIyNzggMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTIyNzgKL1dpZHRoIDUKL0hlaWdodCAxCi9CaXRz UGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VS R0IgMiA8ZTdlOGY2NWQ1YTZjYTdhMWEzPl0KL0xlbmd0aCAxMAovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTbQAAAKwAlgplbmRzdHJlYW0K ZW5kb2JqCgoyMjc5IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBl IC9JbWFnZQovTmFtZSAvSW0yMjc5Ci9XaWR0aCA2Ci9IZWlnaHQgMQovQml0 c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNl UkdCIDMgPGQyZDRkYTVkNWE2YzcyNzg3ZWU3ZThlZD5dCi9MZW5ndGggMTAK L0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaE90AAADcAMYKZW5k c3RyZWFtCmVuZG9iagoKMjI4MCAwIG9iago8PAovVHlwZSAvWE9iamVjdAov U3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjI4MAovV2lkdGggMjIKL0hlaWdo dCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVk IC9EZXZpY2VSR0IgNSA8NzI2ZTc1NWQ2NDZjNWQ1YTZjZTdkZWUzYTdhYmFj ZDJkNGRhPl0KL0xlbmd0aCAxOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+Pgpz dHJlYW0KeNpjVBJUEjIRFBQSVAUABd8BBwplbmRzdHJlYW0KZW5kb2JqCgoy MjgxIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQov TmFtZSAvSW0yMjgxCi9XaWR0aCA2Ci9IZWlnaHQgMQovQml0c1BlckNvbXBv bmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPDVk NjQ2YzVkNWE2Y2IyYjViNT5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVE ZWNvZGUKPj4Kc3RyZWFtCnjaY0gAAABiAGEKZW5kc3RyZWFtCmVuZG9iagoK MjI4MiAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UK L05hbWUgL0ltMjI4MgovV2lkdGggOQovSGVpZ2h0IDEKL0JpdHNQZXJDb21w b25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA1IDw2 ODY0NmM1ZDY0NmM1ZDVhNmNiMmI1YjVkMmQ0ZGE2ODY0NzU+XQovTGVuZ3Ro IDEzCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMUVHYOAAAB jQDJCmVuZHN0cmVhbQplbmRvYmoKCjIyODMgMCBvYmoKPDwKL1R5cGUgL1hP YmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIyODMKL1dpZHRoIDUK L0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9J bmRleGVkIC9EZXZpY2VSR0IgMSA8Njg2ZTc1NWQ2NDZjPl0KL0xlbmd0aCAx MAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjdQAAAEwARgpl bmRzdHJlYW0KZW5kb2JqCgoyMjg0IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0 Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMjg0Ci9XaWR0aCA5Ci9IZWln aHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhl ZCAvRGV2aWNlUkdCIDIgPDY4NjQ2YzVkNjQ2Y2IyYjViNT5dCi9MZW5ndGgg MTEKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaE53qAAABrADr CmVuZHN0cmVhbQplbmRvYmoKCjIyODUgMCBvYmoKPDwKL1R5cGUgL1hPYmpl Y3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIyODUKL1dpZHRoIDkKL0hl aWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRl eGVkIC9EZXZpY2VSR0IgNiA8ODg4ZDkxNjg2ZTc1YTdhMWEzYjJiNWI1Njg2 NDc1NWQ1YTZjNWQ2NDZjPl0KL0xlbmd0aCAxMwovRmlsdGVyIC9GbGF0ZURl Y29kZQo+PgpzdHJlYW0KeNpjEDIJCwAAAeUA7QplbmRzdHJlYW0KZW5kb2Jq CgoyMjg2IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFn ZQovTmFtZSAvSW0yMjg2Ci9XaWR0aCA2Ci9IZWlnaHQgMQovQml0c1BlckNv bXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMg PGRjZGVlMzUzNWE2MzVkNWE2YzVkNjQ2Yz5dCi9MZW5ndGggMTAKL0ZpbHRl ciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjak/wAAAEkAQoKZW5kc3RyZWFt CmVuZG9iagoKMjI4NyAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlw ZSAvSW1hZ2UKL05hbWUgL0ltMjI4NwovV2lkdGggNgovSGVpZ2h0IDEKL0Jp dHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rldmlj ZVJHQiAyIDxlN2U4ZWQ1ZDY0NmM4ODgyODc+XQovTGVuZ3RoIDEwCi9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hNNAAAAjAB2CmVuZHN0cmVh bQplbmRvYmoKCjIyODggMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5 cGUgL0ltYWdlCi9OYW1lIC9JbTIyODgKL1dpZHRoIDEwCi9IZWlnaHQgMQov Qml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2 aWNlUkdCIDEgPDVkNWE2YzVkNjQ2Yz5dCi9MZW5ndGggMTEKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaE3ARAAAAywBlCmVuZHN0cmVhbQpl bmRvYmoKCjIyODkgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTIyODkKL1dpZHRoIDExCi9IZWlnaHQgMQovQml0 c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNl UkdCIDMgPGQyZDRkYTVkNjQ2YzVkNWE2YzkyOTc5YT5dCi9MZW5ndGggMTEK L0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaE1uaAwAB+wEoCmVu ZHN0cmVhbQplbmRvYmoKCjIyOTAgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QK L1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIyOTAKL1dpZHRoIDkKL0hlaWdo dCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVk IC9EZXZpY2VSR0IgNyA8Njg2ZTc1NWQ2NDZjNWQ1YTZjNzI3ODdlOTI5Nzlh ODg4ZDkxNjg2NDZjZGNkZWUzPl0KL0xlbmd0aCAxMwovRmlsdGVyIC9GbGF0 ZURlY29kZQo+PgpzdHJlYW0KeNpjVDIJKwAAAkoBHgplbmRzdHJlYW0KZW5k b2JqCgoyMjkxIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9J bWFnZQovTmFtZSAvSW0yMjkxCi9XaWR0aCA5Ci9IZWlnaHQgMQovQml0c1Bl ckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdC IDYgPDY4NjQ2YzcyNmU3NTg4OGQ5MTdkNzg3ZTVkNWE2YzVkNjQ2Y2QyZDRk YT5dCi9MZW5ndGggMTMKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFt CnjaYxAycU0AAAHTAOwKZW5kc3RyZWFtCmVuZG9iagoKMjI5MiAwIG9iago8 PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjI5 MgovV2lkdGggNgovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29s b3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDxlN2U4ZWQ1ZDVhNmM1 ZDY0NmM+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0 cmVhbQp42hNLAAAAjgB3CmVuZHN0cmVhbQplbmRvYmoKCjIyOTMgMCBvYmoK PDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIy OTMKL1dpZHRoIDkKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0Nv bG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNCA8Njg2ZTc1NWQ2NDZj NWQ1YTZjNjg2NDZjOTI4ZDlhPl0KL0xlbmd0aCAxMwovRmlsdGVyIC9GbGF0 ZURlY29kZQo+PgpzdHJlYW0KeNpjVHYWEgAAAZMAigplbmRzdHJlYW0KZW5k b2JqCgoyMjk0IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9J bWFnZQovTmFtZSAvSW0yMjk0Ci9XaWR0aCA5Ci9IZWlnaHQgMQovQml0c1Bl ckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdC IDUgPGIyYjViNTVkNjQ2YzdkNzg3ZTg4OGQ5MTY4NjQ2YzY4NjQ3NT5dCi9M ZW5ndGggMTMKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1Q2 CRQAAAHkALoKZW5kc3RyZWFtCmVuZG9iagoKMjI5NSAwIG9iago8PAovVHlw ZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjI5NQovV2lk dGggMTEKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3Bh Y2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8Njg2ZTc1NWQ1YTZjNWQ2NDZj ZTdkZWUzPl0KL0xlbmd0aCAxMQovRmlsdGVyIC9GbGF0ZURlY29kZQo+Pgpz dHJlYW0KeNoTnbUGAAIiAVwKZW5kc3RyZWFtCmVuZG9iagoKMjI5NiAwIG9i ago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0lt MjI5NgovV2lkdGggOQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgov Q29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAzIDw2ODY0NmM1ZDY0 NmM1ZDVhNmM2ODZlNzU+XQovTGVuZ3RoIDExCi9GaWx0ZXIgL0ZsYXRlRGVj b2RlCj4+CnN0cmVhbQp42hNdegAAAkwBewplbmRzdHJlYW0KZW5kb2JqCgoy Mjk3IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQov TmFtZSAvSW0yMjk3Ci9XaWR0aCA2Ci9IZWlnaHQgMQovQml0c1BlckNvbXBv bmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMgPDdk Nzg3ZTVkNjQ2YzVkNWE2Y2IyYjViNT5dCi9MZW5ndGggMTAKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjakyoAAACmAIsKZW5kc3RyZWFtCmVu ZG9iagoKMjI5OCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAv SW1hZ2UKL05hbWUgL0ltMjI5OAovV2lkdGggOQovSGVpZ2h0IDEKL0JpdHNQ ZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJH QiAyIDxjN2NhZDE1ZDVhNmM1ZDY0NmM+XQovTGVuZ3RoIDExCi9GaWx0ZXIg L0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hNNawAAAY4A/AplbmRzdHJlYW0K ZW5kb2JqCgoyMjk5IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBl IC9JbWFnZQovTmFtZSAvSW0yMjk5Ci9XaWR0aCA1Ci9IZWlnaHQgMQovQml0 c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNl UkdCIDIgPDY4NjQ2YzVkNWE2YzVkNjQ2Yz5dCi9MZW5ndGggMTAKL0ZpbHRl ciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY20AAACMAIYKZW5kc3RyZWFt CmVuZG9iagoKMjMwMCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlw ZSAvSW1hZ2UKL05hbWUgL0ltMjMwMAovV2lkdGggOQovSGVpZ2h0IDEKL0Jp dHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rldmlj ZVJHQiA0IDw3ZDc4ODc1ZDVhNmM1MzVhNjM3MjZlNzU1ZDY0NmM+XQovTGVu Z3RoIDEzCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUFBZ0 AAABKQCHCmVuZHN0cmVhbQplbmRvYmoKCjIzMDEgMCBvYmoKPDwKL1R5cGUg L1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIzMDEKL1dpZHRo IDkKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2Ug Wy9JbmRleGVkIC9EZXZpY2VSR0IgNCA8ODg4Mjg3Njg2NDc1NWQ1YTZjNWQ2 NDZjYmNiNWM4Pl0KL0xlbmd0aCAxMwovRmlsdGVyIC9GbGF0ZURlY29kZQo+ PgpzdHJlYW0KeNpjEDIydgAAAYkAuAplbmRzdHJlYW0KZW5kb2JqCgoyMzAy IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFt ZSAvSW0yMzAyCi9XaWR0aCA1Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVu dCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPDVkNjQ2 YzVkNWE2YzY4NjQ2Yz5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjaE2kAAACqAJUKZW5kc3RyZWFtCmVuZG9iagoKMjMw MyAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05h bWUgL0ltMjMwMwovV2lkdGggNgovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25l bnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAzIDw5ZGEx YTM1ZDY0NmM1ZDVhNmNjN2JmYzg+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0Zs YXRlRGVjb2RlCj4+CnN0cmVhbQp42hPdAAAA3ADGCmVuZHN0cmVhbQplbmRv YmoKCjIzMDQgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0lt YWdlCi9OYW1lIC9JbTIzMDQKL1dpZHRoIDEwCi9IZWlnaHQgMQovQml0c1Bl ckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdC IDIgPDVkNjQ2YzVkNWE2YzdkNzg4Nz5dCi9MZW5ndGggMTEKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaEw1JAAABSgDKCmVuZHN0cmVhbQpl bmRvYmoKCjIzMDUgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTIzMDUKL1dpZHRoIDEwCi9IZWlnaHQgMQovQml0 c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNl UkdCIDQgPDVkNjQ2YzUzNWE2MzcyNzg4NzVkNWE2YzkyOTc5YT5dCi9MZW5n dGggMTMKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYxBQNmAB AAESAGgKZW5kc3RyZWFtCmVuZG9iagoKMjMwNiAwIG9iago8PAovVHlwZSAv WE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjMwNgovV2lkdGgg OAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiAyIDw1ZDY0NmM1ZDVhNmNkY2RlZTM+XQov TGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMU AgAAFgAUCmVuZHN0cmVhbQplbmRvYmoKCjIzMDcgMCBvYmoKPDwKL1R5cGUg L1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIzMDcKL1dpZHRo IDgKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2Ug Wy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8NWQ2NDZjNzI2ZTc1Pl0KL0xlbmd0 aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjYAQAAAMA AgplbmRzdHJlYW0KZW5kb2JqCgoyMzA4IDAgb2JqCjw8Ci9UeXBlIC9YT2Jq ZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMzA4Ci9XaWR0aCA1Ci9I ZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5k ZXhlZCAvRGV2aWNlUkdCIDIgPDVkNjQ2YzVkNWE2YzY4NjQ2Yz5dCi9MZW5n dGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY2kAAACK AIUKZW5kc3RyZWFtCmVuZG9iagoKMjMwOSAwIG9iago8PAovVHlwZSAvWE9i amVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjMwOQovV2lkdGggOQov SGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0lu ZGV4ZWQgL0RldmljZVJHQiA0IDxhN2FiYjU1ZDY0NmM1ZDVhNmM4ODgyODc2 ODY0NmM+XQovTGVuZ3RoIDEzCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0 cmVhbQp42mMUVBZ0AAABGQCHCmVuZHN0cmVhbQplbmRvYmoKCjIzMTAgMCBv YmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9J bTIzMTAKL1dpZHRoIDkKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIK L0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8YTdhYmI1Njg2 NDZjNWQ2NDZjYjJiNWJmPl0KL0xlbmd0aCAxMQovRmlsdGVyIC9GbGF0ZURl Y29kZQo+PgpzdHJlYW0KeNqTWnUAAAJlAYUKZW5kc3RyZWFtCmVuZG9iagoK MjMxMSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UK L05hbWUgL0ltMjMxMQovV2lkdGggMTEKL0hlaWdodCAxCi9CaXRzUGVyQ29t cG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8 Njg2NDZjNWQ2NDZjNWQ1YTZjZTdlOGVkPl0KL0xlbmd0aCAxMQovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoT9ZwDAAFwAPsKZW5kc3RyZWFt CmVuZG9iagoKMjMxMiAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlw ZSAvSW1hZ2UKL05hbWUgL0ltMjMxMgovV2lkdGggNwovSGVpZ2h0IDEKL0Jp dHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rldmlj ZVJHQiAzIDw3ZDgyODc1ZDY0NmM1ZDVhNmM5MjhkOWE+XQovTGVuZ3RoIDEw Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hOrAQAAqgCTCmVu ZHN0cmVhbQplbmRvYmoKCjIzMTMgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QK L1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIzMTMKL1dpZHRoIDgKL0hlaWdo dCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVk IC9EZXZpY2VSR0IgNSA8ZGNkZWUzNjg2ZTc1NWQ1YTZjNjg2NDZjNWQ2NDZj NzI3ODdlPl0KL0xlbmd0aCAxMgovRmlsdGVyIC9GbGF0ZURlY29kZQo+Pgpz dHJlYW0KeNpjFDJyBQAA5wCLCmVuZHN0cmVhbQplbmRvYmoKCjIzMTQgMCBv YmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9J bTIzMTQKL1dpZHRoIDUKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIK L0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8Njg2ZTc1NWQ2 NDZjNzI2ZTc1Pl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+ PgpzdHJlYW0KeNpjbQAAAIwAhgplbmRzdHJlYW0KZW5kb2JqCgoyMzE1IDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW0yMzE1Ci9XaWR0aCA4Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0 Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDQgPDcyNmU3NTVk NjQ2Yzg4OGQ5MWM3Y2FkMTY4NjQ2Yz5dCi9MZW5ndGggMTIKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYxQycQEAAOoAjAplbmRzdHJlYW0K ZW5kb2JqCgoyMzE2IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBl IC9JbWFnZQovTmFtZSAvSW0yMzE2Ci9XaWR0aCA4Ci9IZWlnaHQgMQovQml0 c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNl UkdCIDQgPGJjYmZiZjY4NjQ3NTVkNjQ2YzVkNWE2Y2RjZGVkYT5dCi9MZW5n dGggMTIKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYxAyFgEA ALQAWgplbmRzdHJlYW0KZW5kb2JqCgoyMzE3IDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMzE3Ci9XaWR0aCA1 Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsv SW5kZXhlZCAvRGV2aWNlUkdCIDQgPDcyNzg3ZTUzNWE2MzVkNjQ2YzVkNWE2 Yzg4OGQ5MT5dCi9MZW5ndGggMTEKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4K c3RyZWFtCnjaY1R2AAAAjABlCmVuZHN0cmVhbQplbmRvYmoKCjIzMTggMCBv YmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9J bTIzMTgKL1dpZHRoIDUKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIK L0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8Njg2NDZjNjg2 NDc1Njg2ZTc1Pl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+ PgpzdHJlYW0KeNoTcwAAAG4AVwplbmRzdHJlYW0KZW5kb2JqCgoyMzE5IDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW0yMzE5Ci9XaWR0aCA5Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0 Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDUgPDVkNjQ2YzVk NWE2YzcyNmU3NWQyZDRkYTY4NjQ2Yzg4OGQ5MT5dCi9MZW5ndGggMTMKL0Zp bHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYxRUdggAAAGHAMYKZW5k c3RyZWFtCmVuZG9iagoKMjMyMCAwIG9iago8PAovVHlwZSAvWE9iamVjdAov U3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjMyMAovV2lkdGggNAovSGVpZ2h0 IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQg L0RldmljZVJHQiAzIDxkMmQ0ZGE2ODY0NmM1ZDY0NmM3ZDc4ODc+XQovTGVu Z3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjakwYAABwA HAplbmRzdHJlYW0KZW5kb2JqCgoyMzIxIDAgb2JqCjw8Ci9UeXBlIC9YT2Jq ZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMzIxCi9XaWR0aCA1Ci9I ZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5k ZXhlZCAvRGV2aWNlUkdCIDMgPDY4NmU3NTcyNzg3ZTcyNmU3NTlkYTFhMz5d Ci9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja YzsAAADOAMcKZW5kc3RyZWFtCmVuZG9iagoKMjMyMiAwIG9iago8PAovVHlw ZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjMyMgovV2lk dGggNgovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFj ZSBbL0luZGV4ZWQgL0RldmljZVJHQiAzIDw5MjhkOWE1ZDY0NmM2ODY0NmM4 ODhkOWE+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0 cmVhbQp42pMsAAAApACKCmVuZHN0cmVhbQplbmRvYmoKCjIzMjMgMCBvYmoK PDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIz MjMKL1dpZHRoIDcKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0Nv bG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8OWRhMWEzNjg2ZTc1 NWQ2NDZjYmNiZmM4Pl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNpjmwMAAKoAowplbmRzdHJlYW0KZW5kb2JqCgoyMzI0 IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFt ZSAvSW0yMzI0Ci9XaWR0aCA0Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVu dCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPDY4NmU3 NTVkNjQ2Yzg4ODI4Nz5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNoTAwAAFwAXCmVuZHN0cmVhbQplbmRvYmoKCjIzMjUg MCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1l IC9JbTIzMjUKL1dpZHRoIDgKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50 IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNSA8YTdhMWEz Njg2NDZjNWQ2NDZjZTdlOGVkNzI3ODdlN2Q3ODg3Pl0KL0xlbmd0aCAxMgov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVDAJAQABJACqCmVu ZHN0cmVhbQplbmRvYmoKCjIzMjYgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QK L1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIzMjYKL1dpZHRoIDgKL0hlaWdo dCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVk IC9EZXZpY2VSR0IgMyA8ZTdlOGVkODg4ZDkxNjg2NDZjN2Q3ODg3Pl0KL0xl bmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTWgMA AOIAxwplbmRzdHJlYW0KZW5kb2JqCgoyMzI3IDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMzI3Ci9XaWR0aCA1 Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsv SW5kZXhlZCAvRGV2aWNlUkdCIDMgPDcyNmU3NTVkNWE2YzVkNjQ2Y2RjZGVl Mz5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFt CnjaEzsAAADuANcKZW5kc3RyZWFtCmVuZG9iagoKMjMyOCAwIG9iago8PAov VHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjMyOAov V2lkdGggNQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JT cGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAzIDw1ZDY0NmM1ZDVhNmM1MzVh NjM3Mjc4N2U+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+ CnN0cmVhbQp42pM6AAAA9gDbCmVuZHN0cmVhbQplbmRvYmoKCjIzMjkgMCBv YmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9J bTIzMjkKL1dpZHRoIDcKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIK L0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8NWQ2NDZjNWQ1 YTZjPl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl YW0KeNpjDAAAAFQAUgplbmRzdHJlYW0KZW5kb2JqCgoyMzMwIDAgb2JqCjw8 Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMzMw Ci9XaWR0aCA1Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xv clNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPDVkNjQ2YzVkNWE2Yzcy Nzg3ZT5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3Ry ZWFtCnjaE20AAACsAJYKZW5kc3RyZWFtCmVuZG9iagoKMjMzMSAwIG9iago8 PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjMz MQovV2lkdGggNwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29s b3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDw1ZDY0NmM1ZDVhNmNi Y2JmYzg+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0 cmVhbQp42mONAAAAZABeCmVuZHN0cmVhbQplbmRvYmoKCjIzMzIgMCBvYmoK PDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIz MzIKL1dpZHRoIDYKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0Nv bG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8Njg2NDZjNWQ2NDZj YmNiZmJmPl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+Pgpz dHJlYW0KeNpjTQAAAGwAZgplbmRzdHJlYW0KZW5kb2JqCgoyMzMzIDAgb2Jq Cjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0y MzMzCi9XaWR0aCA1Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9D b2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEgPDY4NjQ2YzdkNzg3 ZT5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFt CnjaY3AAAABCAEEKZW5kc3RyZWFtCmVuZG9iagoKMjMzNCAwIG9iago8PAov VHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjMzNAov V2lkdGggNQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JT cGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAzIDxhN2FiYjVhN2ExYTM5ZGEx YWNiMmI1YjU+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+ CnN0cmVhbQp42mM7AAAAzgDHCmVuZHN0cmVhbQplbmRvYmoKCjIzMzUgMCBv YmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9J bTIzMzUKL1dpZHRoIDUKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIK L0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8OWQ5N2EzYmNi ZmJmPl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl YW0KeNpjcAAAAEIAQQplbmRzdHJlYW0KZW5kb2JqCgoyMzM2IDAgb2JqCjw8 Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMzM2 Ci9XaWR0aCA0Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xv clNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPDdkODI4NzdkNzg3ZWE3 YTFhMz5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJl YW0KeNoTAwAAFwAXCmVuZHN0cmVhbQplbmRvYmoKCjIzMzcgMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIzMzcK L1dpZHRoIDUKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMSA8NWQ2NDZjN2Q3ODg3Pl0K L0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpj cAAAAEIAQQplbmRzdHJlYW0KZW5kb2JqCgoyMzM4IDAgb2JqCjw8Ci9UeXBl IC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMzM4Ci9XaWR0 aCA1Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNl IFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEgPDVkNjQ2Yzg4OGQ5MT5dCi9MZW5n dGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY3AAAABC AEEKZW5kc3RyZWFtCmVuZG9iagoKMjMzOSAwIG9iago8PAovVHlwZSAvWE9i amVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjMzOQovV2lkdGggMTAK L0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9J bmRleGVkIC9EZXZpY2VSR0IgMiA8OTI5NzlhOTI4ZDlhODg4ZDkxPl0KL0xl bmd0aCAxMQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTXBoA AAHQAQcKZW5kc3RyZWFtCmVuZG9iagoKMjM0MCAwIG9iago8PAovVHlwZSAv WE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjM0MAovV2lkdGgg NAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiAyIDw1ZDY0NmM1ZDVhNmM5Mjk3OWE+XQov TGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaEwIA ABMAEwplbmRzdHJlYW0KZW5kb2JqCgoyMzQxIDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMzQxCi9XaWR0aCA1 Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsv SW5kZXhlZCAvRGV2aWNlUkdCIDIgPDVkNWE2YzVkNjQ2YzdkNzg4Nz5dCi9M ZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY2wA AACEAIIKZW5kc3RyZWFtCmVuZG9iagoKMjM0MiAwIG9iago8PAovVHlwZSAv WE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjM0MgovV2lkdGgg NQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiAyIDw1ZDY0NmM1ZDVhNmM4ODhkOTE+XQov TGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNp AAAAigCFCmVuZHN0cmVhbQplbmRvYmoKCjIzNDMgMCBvYmoKPDwKL1R5cGUg L1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIzNDMKL1dpZHRo IDEwCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNl IFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEgPDVkNjQ2YzVkNWE2Yz5dCi9MZW5n dGggMTEKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaE2UVAAAA XAArCmVuZHN0cmVhbQplbmRvYmoKCjIzNDQgMCBvYmoKPDwKL1R5cGUgL1hP YmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIzNDQKL1dpZHRoIDQK L0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9J bmRleGVkIC9EZXZpY2VSR0IgMiA8OWQ5N2EzNWQ1YTZjNjg2NDc1Pl0KL0xl bmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hMDAAAX ABcKZW5kc3RyZWFtCmVuZG9iagoKMjM0NSAwIG9iago8PAovVHlwZSAvWE9i amVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjM0NQovV2lkdGggNAov SGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0lu ZGV4ZWQgL0RldmljZVJHQiAyIDw1ZDY0NmM1ZDVhNmM5MjhkOWE+XQovTGVu Z3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaEwMAABcA FwplbmRzdHJlYW0KZW5kb2JqCgoyMzQ2IDAgb2JqCjw8Ci9UeXBlIC9YT2Jq ZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMzQ2Ci9XaWR0aCA1Ci9I ZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5k ZXhlZCAvRGV2aWNlUkdCIDIgPDVkNjQ2YzVkNWE2YzdkNzg4Nz5dCi9MZW5n dGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY2kAAACK AIUKZW5kc3RyZWFtCmVuZG9iagoKMjM0NyAwIG9iago8PAovVHlwZSAvWE9i amVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjM0NwovV2lkdGggMTAK L0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9J bmRleGVkIC9EZXZpY2VSR0IgMSA8NWQ2NDZjNWQ1YTZjPl0KL0xlbmd0aCAx MQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTDA0AAAEwALcK ZW5kc3RyZWFtCmVuZG9iagoKMjM0OCAwIG9iago8PAovVHlwZSAvWE9iamVj dAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjM0OAovV2lkdGggNAovSGVp Z2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4 ZWQgL0RldmljZVJHQiAyIDw3ZDgyODc1ZDY0NmM1ZDVhNmM+XQovTGVuZ3Ro IDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjakwQAABoAGgpl bmRzdHJlYW0KZW5kb2JqCgoyMzQ5IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0 Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMzQ5Ci9XaWR0aCA0Ci9IZWln aHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhl ZCAvRGV2aWNlUkdCIDIgPDVkNWE2YzVkNjQ2YzkyOGQ5YT5dCi9MZW5ndGgg OQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTAgAAEwATCmVu ZHN0cmVhbQplbmRvYmoKCjIzNTAgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QK L1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIzNTAKL1dpZHRoIDUKL0hlaWdo dCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVk IC9EZXZpY2VSR0IgMiA8NWQ2NDZjNWQ1YTZjN2Q3ODdlPl0KL0xlbmd0aCAx MAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjbQAAAIwAhgpl bmRzdHJlYW0KZW5kb2JqCgoyMzUxIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0 Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMzUxCi9XaWR0aCA1Ci9IZWln aHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhl ZCAvRGV2aWNlUkdCIDIgPDVkNjQ2YzVkNWE2Yzg4OGQ5MT5dCi9MZW5ndGgg MTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY20AAACMAIYK ZW5kc3RyZWFtCmVuZG9iagoKMjM1MiAwIG9iago8PAovVHlwZSAvWE9iamVj dAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjM1MgovV2lkdGggMTAKL0hl aWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRl eGVkIC9EZXZpY2VSR0IgNSA8Njg2NDZjNWQ1YTZjNWQ2NDZjN2Q4Mjg3ODg4 Mjg3ODg4ZDkxPl0KL0xlbmd0aCAxMwovRmlsdGVyIC9GbGF0ZURlY29kZQo+ PgpzdHJlYW0KeNpjVDJ2cQUAAfgA4AplbmRzdHJlYW0KZW5kb2JqCgoyMzUz IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFt ZSAvSW0yMzUzCi9XaWR0aCA0Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVu dCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEgPDdkNzg3 ZTVkNWE2Yz5dCi9MZW5ndGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+Pgpz dHJlYW0KeNoTBQAAFgAWCmVuZHN0cmVhbQplbmRvYmoKCjIzNTQgMCBvYmoK PDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIz NTQKL1dpZHRoIDQKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0Nv bG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8ZGNkZWUzYmNiNWM4 YjJiNWI1ZDJkNGRhPl0KL0xlbmd0aCA5Ci9GaWx0ZXIgL0ZsYXRlRGVjb2Rl Cj4+CnN0cmVhbQp42pMGAAAcABwKZW5kc3RyZWFtCmVuZG9iagoKMjM1NSAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltMjM1NQovV2lkdGggNAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg MgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDw1ZDY0NmM1 MzVhNjM4ODhkOTE+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUK Pj4Kc3RyZWFtCnjaEwIAABMAEwplbmRzdHJlYW0KZW5kb2JqCgoyMzU2IDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW0yMzU2Ci9XaWR0aCAxMAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg NAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA0IDw2ODZlNmM1 ZDVhNmM1ZDY0NmNjN2NhZDE3ZDc4N2U+XQovTGVuZ3RoIDEzCi9GaWx0ZXIg L0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMUMhRUAQABKwB6CmVuZHN0cmVh bQplbmRvYmoKCjIzNTcgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5 cGUgL0ltYWdlCi9OYW1lIC9JbTIzNTcKL1dpZHRoIDcKL0hlaWdodCAxCi9C aXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZp Y2VSR0IgMyA8OWRhMWEzNWQ1YTZjNWQ2NDZjZTdkZWUzPl0KL0xlbmd0aCAx MAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTzQEAAJgAggpl bmRzdHJlYW0KZW5kb2JqCgoyMzU4IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0 Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMzU4Ci9XaWR0aCA1Ci9IZWln aHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhl ZCAvRGV2aWNlUkdCIDIgPDY4NjQ2YzVkNjQ2Yzg4OGQ5MT5dCi9MZW5ndGgg MTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY20AAACMAIYK ZW5kc3RyZWFtCmVuZG9iagoKMjM1OSAwIG9iago8PAovVHlwZSAvWE9iamVj dAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjM1OQovV2lkdGggOAovSGVp Z2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4 ZWQgL0RldmljZVJHQiAyIDw1ZDY0NmM1ZDVhNmM2ODZlNzU+XQovTGVuZ3Ro IDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMUAgAAFgAU CmVuZHN0cmVhbQplbmRvYmoKCjIzNjAgMCBvYmoKPDwKL1R5cGUgL1hPYmpl Y3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIzNjAKL1dpZHRoIDgKL0hl aWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRl eGVkIC9EZXZpY2VSR0IgMiA8NWQ1YTZjNWQ2NDZjN2Q3ODdlPl0KL0xlbmd0 aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpj8QIAAFQA TwplbmRzdHJlYW0KZW5kb2JqCgoyMzYxIDAgb2JqCjw8Ci9UeXBlIC9YT2Jq ZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMzYxCi9XaWR0aCA5Ci9I ZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5k ZXhlZCAvRGV2aWNlUkdCIDQgPDY4NmU3NTVkNWE2YzVkNjQ2Y2JjYjVjODg4 OGQ5MT5dCi9MZW5ndGggMTMKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3Ry ZWFtCnjaY1Q0FHIAAAGFAKYKZW5kc3RyZWFtCmVuZG9iagoKMjM2MiAwIG9i ago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0lt MjM2MgovV2lkdGggNwovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgov Q29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAzIDw3MjZlNzU1ZDVh NmM1ZDY0NmM2ODZlNmM+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVj b2RlCj4+CnN0cmVhbQp42pPKAQAAogCHCmVuZHN0cmVhbQplbmRvYmoKCjIz NjMgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9O YW1lIC9JbTIzNjMKL1dpZHRoIDExCi9IZWlnaHQgMQovQml0c1BlckNvbXBv bmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMgPGE3 YWJhYzVkNjQ2YzVkNWE2YzdkNzg3ZT5dCi9MZW5ndGggMTEKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjak5oVAwAB4QERCmVuZHN0cmVhbQpl bmRvYmoKCjIzNjQgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTIzNjQKL1dpZHRoIDgKL0hlaWdodCAxCi9CaXRz UGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VS R0IgMiA8YTdhYmFjNWQ2NDZjNWQ1YTZjPl0KL0xlbmd0aCAxMAovRmlsdGVy IC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTmwkAAMcAsAplbmRzdHJlYW0K ZW5kb2JqCgoyMzY1IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBl IC9JbWFnZQovTmFtZSAvSW0yMzY1Ci9XaWR0aCAxMAovSGVpZ2h0IDEKL0Jp dHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rldmlj ZVJHQiA1IDw2ODY0NmM1ZDVhNmM1ZDY0NmNiMmI1YmZiMmI1YjViY2I1Yzg+ XQovTGVuZ3RoIDEzCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4 2mNUMnYxBQAB6ADQCmVuZHN0cmVhbQplbmRvYmoKCjIzNjYgMCBvYmoKPDwK L1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIzNjYK L1dpZHRoIDgKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9y U3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8YzdjYWQxNWQ1YTZjNWQ2 NDZjODg4Mjg3Pl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+ PgpzdHJlYW0KeNoTjQYAAIcAcQplbmRzdHJlYW0KZW5kb2JqCgoyMzY3IDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW0yMzY3Ci9XaWR0aCA4Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAy Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPDVkNjQ2YzVk NWE2YzY4NjQ2Yz5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUK Pj4Kc3RyZWFtCnjaYwwCAABWAFQKZW5kc3RyZWFtCmVuZG9iagoKMjM2OCAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltMjM2OAovV2lkdGggOQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg MgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAzIDw1ZDY0NmM2 ODY0NmM1ZDVhNmM5ZGExYWM+XQovTGVuZ3RoIDExCi9GaWx0ZXIgL0ZsYXRl RGVjb2RlCj4+CnN0cmVhbQp42mNsOAAAAcYBQgplbmRzdHJlYW0KZW5kb2Jq CgoyMzY5IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFn ZQovTmFtZSAvSW0yMzY5Ci9XaWR0aCAxMAovSGVpZ2h0IDEKL0JpdHNQZXJD b21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAz IDxiY2JmYmY1ZDY0NmM1ZDVhNmM4ODhkOTE+XQovTGVuZ3RoIDExCi9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42pOaVQAAAfUBJQplbmRzdHJl YW0KZW5kb2JqCgoyMzcwIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0 eXBlIC9JbWFnZQovTmFtZSAvSW0yMzcwCi9XaWR0aCAxMAovSGVpZ2h0IDEK L0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rl dmljZVJHQiA0IDw4ODgyODc1ZDY0NmM1MzVhNjM1ZDVhNmM2ODZlNzU+XQov TGVuZ3RoIDEzCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMQ MjISAQABWwCLCmVuZHN0cmVhbQplbmRvYmoKCjIzNzEgMCBvYmoKPDwKL1R5 cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIzNzEKL1dp ZHRoIDExCi9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNw YWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDQgPDY4NjQ2YzVkNjQ2YzVkNWE2 YzY4NmU3NTdkNzg3ZT5dCi9MZW5ndGggMTQKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjaY1RiFhR0AAABVwCJCmVuZHN0cmVhbQplbmRvYmoK CjIzNzIgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdl Ci9OYW1lIC9JbTIzNzIKL1dpZHRoIDUKL0hlaWdodCAxCi9CaXRzUGVyQ29t cG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8 NWQ2NDZjNjg2NDZjODg4ZDkxPl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0 ZURlY29kZQo+PgpzdHJlYW0KeNpjbAAAAIQAggplbmRzdHJlYW0KZW5kb2Jq CgoyMzczIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFn ZQovTmFtZSAvSW0yMzczCi9XaWR0aCAxMAovSGVpZ2h0IDEKL0JpdHNQZXJD b21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAy IDw2ODY0NmM1ZDY0NmM1ZDVhNmM+XQovTGVuZ3RoIDExCi9GaWx0ZXIgL0Zs YXRlRGVjb2RlCj4+CnN0cmVhbQp42pNa5gAAAd0BAQplbmRzdHJlYW0KZW5k b2JqCgoyMzc0IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9J bWFnZQovTmFtZSAvSW0yMzc0Ci9XaWR0aCA4Ci9IZWlnaHQgMQovQml0c1Bl ckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdC IDQgPDg4ODI4NzY4NjQ2YzUzNWE2MzVkNWE2YzkyOGQ5YT5dCi9MZW5ndGgg MTIKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYxAyZgEAAKQA SgplbmRzdHJlYW0KZW5kb2JqCgoyMzc1IDAgb2JqCjw8Ci9UeXBlIC9YT2Jq ZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMzc1Ci9XaWR0aCA1Ci9I ZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5k ZXhlZCAvRGV2aWNlUkdCIDIgPDY4NjQ2YzVkNjQ2YzVkNWE2Yz5dCi9MZW5n dGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjak3IAAAB2 AFsKZW5kc3RyZWFtCmVuZG9iagoKMjM3NiAwIG9iago8PAovVHlwZSAvWE9i amVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjM3NgovV2lkdGggMTAK L0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9J bmRleGVkIC9EZXZpY2VSR0IgNSA8Njg2ZTc1NWQ1YTZjNWQ2NDZjODg4ZDkx NzI3ODdlNTM1YTYzPl0KL0xlbmd0aCAxMwovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNpjVDQJVAYAAe8AywplbmRzdHJlYW0KZW5kb2JqCgoy Mzc3IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQov TmFtZSAvSW0yMzc3Ci9XaWR0aCAxMQovSGVpZ2h0IDEKL0JpdHNQZXJDb21w b25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA0IDw2 ODY0NmM1ZDVhNmM1ZDY0NmNkY2RlZTNlN2U4ZWQ+XQovTGVuZ3RoIDE0Ci9G aWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mMQUlYUcgAAAbMAqQpl bmRzdHJlYW0KZW5kb2JqCgoyMzc4IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0 Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMzc4Ci9XaWR0aCA1Ci9IZWln aHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhl ZCAvRGV2aWNlUkdCIDIgPDVkNjQ2YzVkNWE2YzcyNzg3ZT5dCi9MZW5ndGgg MTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY20AAACMAIYK ZW5kc3RyZWFtCmVuZG9iagoKMjM3OSAwIG9iago8PAovVHlwZSAvWE9iamVj dAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjM3OQovV2lkdGggMTAKL0hl aWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRl eGVkIC9EZXZpY2VSR0IgMiA8NWQ2NDZjNTM1YTYzNWQ1YTZjPl0KL0xlbmd0 aCAxMQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTWNUAAAIf AUMKZW5kc3RyZWFtCmVuZG9iagoKMjM4MCAwIG9iago8PAovVHlwZSAvWE9i amVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjM4MAovV2lkdGggNwov SGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0lu ZGV4ZWQgL0RldmljZVJHQiA0IDw4ODhkOTE1ZDVhNmM1ZDY0NmM2ODY0NmNk Y2RlZTM+XQovTGVuZ3RoIDEyCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0 cmVhbQp42mMUMnAAAADeAIQKZW5kc3RyZWFtCmVuZG9iagoKMjM4MSAwIG9i ago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0lt MjM4MQovV2lkdGggNAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgov Q29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDw3ZDc4ODc1ZDY0 NmM1ZDVhNmM+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4K c3RyZWFtCnjakwQAABoAGgplbmRzdHJlYW0KZW5kb2JqCgoyMzgyIDAgb2Jq Cjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0y MzgyCi9XaWR0aCA4Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9D b2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMgPGE3YWJhYzdkNzg3 ZTcyNmU3NTVkNWE2Yz5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjaE/sPAAEtARYKZW5kc3RyZWFtCmVuZG9iagoKMjM4 MyAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05h bWUgL0ltMjM4MwovV2lkdGggMTAKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9u ZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNSA8NWQ1 YTZjNWQ2NDZjODg4ZDkxZGNkZWUzNTM1YTYzNjg2ZTc1Pl0KL0xlbmd0aCAx MwovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjFDJxcQUAAbsA 0QplbmRzdHJlYW0KZW5kb2JqCgoyMzg0IDAgb2JqCjw8Ci9UeXBlIC9YT2Jq ZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMzg0Ci9XaWR0aCA1Ci9I ZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5k ZXhlZCAvRGV2aWNlUkdCIDMgPDkyOGQ5YTVkNWE2YzVkNjQ2Y2JjYmZiZj5d Ci9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja EzsAAADuANcKZW5kc3RyZWFtCmVuZG9iagoKMjM4NSAwIG9iago8PAovVHlw ZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjM4NQovV2lk dGggMTUKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3Bh Y2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNCA8NWQ1YTZjNWQ2NDZjN2Q3ODdl ZTdlOGVkNzI2ZTc1Pl0KL0xlbmd0aCAxNgovRmlsdGVyIC9GbGF0ZURlY29k ZQo+PgpzdHJlYW0KeNpjYFRmYGRgcAAAASUAZgplbmRzdHJlYW0KZW5kb2Jq CgoyMzg2IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFn ZQovTmFtZSAvSW0yMzg2Ci9XaWR0aCAxMAovSGVpZ2h0IDEKL0JpdHNQZXJD b21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAz IDw1ZDY0NmM1ZDVhNmM2ODZlNmM3MjZlNzU+XQovTGVuZ3RoIDExCi9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hNd/wEAApABtQplbmRzdHJl YW0KZW5kb2JqCgoyMzg3IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0 eXBlIC9JbWFnZQovTmFtZSAvSW0yMzg3Ci9XaWR0aCA4Ci9IZWlnaHQgMQov Qml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2 aWNlUkdCIDQgPGU3ZThlZDY4NjQ2YzVkNjQ2YzVkNWE2YzdkNzg3ZT5dCi9M ZW5ndGggMTIKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1Qy NgEAAQgAiwplbmRzdHJlYW0KZW5kb2JqCgoyMzg4IDAgb2JqCjw8Ci9UeXBl IC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMzg4Ci9XaWR0 aCA0Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNl IFsvSW5kZXhlZCAvRGV2aWNlUkdCIDEgPDg4ODI4NzVkNjQ2Yz5dCi9MZW5n dGggOQovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNoTBQAAFgAW CmVuZHN0cmVhbQplbmRvYmoKCjIzODkgMCBvYmoKPDwKL1R5cGUgL1hPYmpl Y3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIzODkKL1dpZHRoIDEwCi9I ZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5k ZXhlZCAvRGV2aWNlUkdCIDIgPGRjZGVlMzVkNjQ2YzVkNWE2Yz5dCi9MZW5n dGggMTEKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjak5w1AQAC EgFECmVuZHN0cmVhbQplbmRvYmoKCjIzOTAgMCBvYmoKPDwKL1R5cGUgL1hP YmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIzOTAKL1dpZHRoIDEw Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsv SW5kZXhlZCAvRGV2aWNlUkdCIDQgPDVkNWE2Yzg4ODI4N2RjZDRkYTVkNjQ2 YzcyNmU3NT5dCi9MZW5ndGggMTMKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4K c3RyZWFtCnjaY2BUYDABAACdAFYKZW5kc3RyZWFtCmVuZG9iagoKMjM5MSAw IG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUg L0ltMjM5MQovV2lkdGggNQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg MgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAzIDw5ZGExYTM1 ZDVhNmM1ZDY0NmNhN2FiYjU+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRl RGVjb2RlCj4+CnN0cmVhbQp42hM7AAAA7gDXCmVuZHN0cmVhbQplbmRvYmoK CjIzOTIgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdl Ci9OYW1lIC9JbTIzOTIKL1dpZHRoIDUKL0hlaWdodCAxCi9CaXRzUGVyQ29t cG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8 NWQ1YTZjNTM1YTYzN2Q3ODdlPl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0 ZURlY29kZQo+PgpzdHJlYW0KeNpjaQAAAIoAhQplbmRzdHJlYW0KZW5kb2Jq CgoyMzkzIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFn ZQovTmFtZSAvSW0yMzkzCi9XaWR0aCA5Ci9IZWlnaHQgMQovQml0c1BlckNv bXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMg PDVkNWE2YzVkNjQ2YzY4NjQ2YzY4NmU3NT5dCi9MZW5ndGggMTEKL0ZpbHRl ciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaE2Q7AAABAgDYCmVuZHN0cmVh bQplbmRvYmoKCjIzOTQgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5 cGUgL0ltYWdlCi9OYW1lIC9JbTIzOTQKL1dpZHRoIDQKL0hlaWdodCAxCi9C aXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZp Y2VSR0IgMiA8N2Q3ODg3NWQ1YTZjNWQ2NDZjPl0KL0xlbmd0aCA5Ci9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hMDAAAXABcKZW5kc3RyZWFt CmVuZG9iagoKMjM5NSAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlw ZSAvSW1hZ2UKL05hbWUgL0ltMjM5NQovV2lkdGggMTAKL0hlaWdodCAxCi9C aXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZp Y2VSR0IgNiA8Njg2NDZjNTM1YTYzNWQ1YTZjNjg2NDc1ZGNkZWUzOWQ5N2Ez NWQ2NDZjPl0KL0xlbmd0aCAxMwovRmlsdGVyIC9GbGF0ZURlY29kZQo+Pgpz dHJlYW0KeNpjVHZVSwAAAhEA8AplbmRzdHJlYW0KZW5kb2JqCgoyMzk2IDAg b2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAv SW0yMzk2Ci9XaWR0aCAxMAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQg NAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA1IDw1MzVhNjM1 ZDY0NmM1ZDVhNmM4ODgyODdlN2RlZTM2ODZlNzU+XQovTGVuZ3RoIDEzCi9G aWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNUdlJiBQABpQCOCmVu ZHN0cmVhbQplbmRvYmoKCjIzOTcgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QK L1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTIzOTcKL1dpZHRoIDUKL0hlaWdo dCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVk IC9EZXZpY2VSR0IgMyA8OTI5NzlhNWQ2NDZjNWQ1YTZjYmNiZmJmPl0KL0xl bmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTPAAA APQA2gplbmRzdHJlYW0KZW5kb2JqCgoyMzk4IDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yMzk4Ci9XaWR0aCAx MQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBb L0luZGV4ZWQgL0RldmljZVJHQiA0IDw1ZDY0NmM1ZDVhNmNiMmI1YjVjN2Nh ZDE3Mjc4N2U+XQovTGVuZ3RoIDE0Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+ CnN0cmVhbQp42mMQVGYQcAAAAUcAhQplbmRzdHJlYW0KZW5kb2JqCgoyMzk5 IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFt ZSAvSW0yMzk5Ci9XaWR0aCA1Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVu dCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDIgPDVkNjQ2 YzVkNWE2Yzg4OGQ5MT5dCi9MZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjaY2wAAACEAIIKZW5kc3RyZWFtCmVuZG9iagoKMjQw MCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05h bWUgL0ltMjQwMAovV2lkdGggMTAKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9u ZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNCA8Njg2 NDZjNWQ1YTZjNWQ2NDZjYjJiNWJmYjJiNWI1Pl0KL0xlbmd0aCAxMwovRmls dGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjFDI2NgEAAYUArgplbmRz dHJlYW0KZW5kb2JqCgoyNDAxIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9T dWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yNDAxCi9XaWR0aCA2Ci9IZWlnaHQg MQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAv RGV2aWNlUkdCIDQgPDg4OGQ5MTVkNjQ2YzVkNWE2Y2E3YWJhY2RjZGVlMz5d Ci9MZW5ndGggMTEKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnja YxQyAQAAXgBICmVuZHN0cmVhbQplbmRvYmoKCjI0MDIgMCBvYmoKPDwKL1R5 cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTI0MDIKL1dp ZHRoIDUKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3Bh Y2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8N2Q3ODg3NWQ1YTZjNjg2NDZj Pl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0K eNoTbQAAAKwAlgplbmRzdHJlYW0KZW5kb2JqCgoyNDAzIDAgb2JqCjw8Ci9U eXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yNDAzCi9X aWR0aCAxMAovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JT cGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA1IDw2ODY0NzU1ZDVhNmM5ZGEx YTM5Mjk3OWE1MzVhNjM4ODhkOTE+XQovTGVuZ3RoIDEzCi9GaWx0ZXIgL0Zs YXRlRGVjb2RlCj4+CnN0cmVhbQp42mMUVBYRBQAA9ABfCmVuZHN0cmVhbQpl bmRvYmoKCjI0MDQgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTI0MDQKL1dpZHRoIDUKL0hlaWdodCAxCi9CaXRz UGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VS R0IgMSA8NWQ1YTZjNWQ2NDZjPl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0 ZURlY29kZQo+PgpzdHJlYW0KeNpjcQAAAEoARQplbmRzdHJlYW0KZW5kb2Jq CgoyNDA1IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFn ZQovTmFtZSAvSW0yNDA1Ci9XaWR0aCA1Ci9IZWlnaHQgMQovQml0c1BlckNv bXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDQg PDY4NmU3NTVkNWE2YzUzNWE2MzVkNjQ2Y2U3ZThlZD5dCi9MZW5ndGggMTEK L0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY1R2AAAAjABlCmVu ZHN0cmVhbQplbmRvYmoKCjI0MDYgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QK L1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTI0MDYKL1dpZHRoIDExCi9IZWln aHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhl ZCAvRGV2aWNlUkdCIDMgPDcyNzg3ZTVkNjQ2YzVkNWE2YzY4NjQ2Yz5dCi9M ZW5ndGggMTEKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjak3o1 AQACtQGVCmVuZHN0cmVhbQplbmRvYmoKCjI0MDcgMCBvYmoKPDwKL1R5cGUg L1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTI0MDcKL1dpZHRo IDgKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2Ug Wy9JbmRleGVkIC9EZXZpY2VSR0IgNSA8N2Q3ODg3NWQ2NDZjNWQ1YTZjYTdh YmFjOTI5NzlhNjg2NDZjPl0KL0xlbmd0aCAxMgovRmlsdGVyIC9GbGF0ZURl Y29kZQo+PgpzdHJlYW0KeNpjVGR2BQAAtgBrCmVuZHN0cmVhbQplbmRvYmoK CjI0MDggMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdl Ci9OYW1lIC9JbTI0MDgKL1dpZHRoIDUKL0hlaWdodCAxCi9CaXRzUGVyQ29t cG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMiA8 NWQ2NDZjNjg2NDc1ODg4ZDkxPl0KL0xlbmd0aCAxMAovRmlsdGVyIC9GbGF0 ZURlY29kZQo+PgpzdHJlYW0KeNpjbAAAAIQAggplbmRzdHJlYW0KZW5kb2Jq CgoyNDA5IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFn ZQovTmFtZSAvSW0yNDA5Ci9XaWR0aCAxOQovSGVpZ2h0IDEKL0JpdHNQZXJD b21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiA4 IDw2ODY0NmM1MzVhNjM1ZDVhNmM1ZDY0NmNkY2RlZTNjN2NhYzg3ZDc4N2U5 Mjk3OWE2ODZlNzU+XQovTGVuZ3RoIDE4Ci9GaWx0ZXIgL0ZsYXRlRGVjb2Rl Cj4+CnN0cmVhbQp42mNUMlZWdjWrUDIAAAiyAeIKZW5kc3RyZWFtCmVuZG9i agoKMjQxMCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1h Z2UKL05hbWUgL0ltMjQxMAovV2lkdGggNgovSGVpZ2h0IDEKL0JpdHNQZXJD b21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAz IDxhN2FiYWM1ZDY0NmM1ZDVhNmM2ODY0NzU+XQovTGVuZ3RoIDEwCi9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hPbAAAA3gDHCmVuZHN0cmVh bQplbmRvYmoKCjI0MTEgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5 cGUgL0ltYWdlCi9OYW1lIC9JbTI0MTEKL1dpZHRoIDEwCi9IZWlnaHQgMQov Qml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2 aWNlUkdCIDMgPDVkNWE2YzVkNjQ2YzdkODI4NzY4NjQ2Yz5dCi9MZW5ndGgg MTEKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaY51YAAABpAEH CmVuZHN0cmVhbQplbmRvYmoKCjI0MTIgMCBvYmoKPDwKL1R5cGUgL1hPYmpl Y3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTI0MTIKL1dpZHRoIDEwCi9I ZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5k ZXhlZCAvRGV2aWNlUkdCIDQgPGE3YTFhMzVkNjQ2YzVkNWE2YzUzNWE2Mzg4 ODI4Nz5dCi9MZW5ndGggMTMKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3Ry ZWFtCnjaY1RSUlYBAAFiAI0KZW5kc3RyZWFtCmVuZG9iagoKMjQxMyAwIG9i ago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0lt MjQxMwovV2lkdGggMTAKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIK L0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgMyA8NzI3ODdlNWQ2 NDZjNTM1YTYzNWQ1YTZjPl0KL0xlbmd0aCAxMQovRmlsdGVyIC9GbGF0ZURl Y29kZQo+PgpzdHJlYW0KeNpj+38BAALjAdYKZW5kc3RyZWFtCmVuZG9iagoK MjQxNCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UK L05hbWUgL0ltMjQxNAovV2lkdGggMTEKL0hlaWdodCAxCi9CaXRzUGVyQ29t cG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VSR0IgNCA8 ZTdlOGVkNjg2NDZjNWQ2NDZjNWQ1YTZjNzI3ODdlPl0KL0xlbmd0aCAxNAov RmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVFJWMnIAAAJMANsK ZW5kc3RyZWFtCmVuZG9iagoKMjQxNSAwIG9iago8PAovVHlwZSAvWE9iamVj dAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjQxNQovV2lkdGggNwovSGVp Z2h0IDEKL0JpdHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4 ZWQgL0RldmljZVJHQiAyIDw2ODY0NmM1ZDVhNmM1ZDY0NmM+XQovTGVuZ3Ro IDEwCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42pOMAAAAjABy CmVuZHN0cmVhbQplbmRvYmoKCjI0MTYgMCBvYmoKPDwKL1R5cGUgL1hPYmpl Y3QKL1N1YnR5cGUgL0ltYWdlCi9OYW1lIC9JbTI0MTYKL1dpZHRoIDUKL0hl aWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRl eGVkIC9EZXZpY2VSR0IgMiA8NWQ2NDZjNWQ1YTZjODg4Mjg3Pl0KL0xlbmd0 aCAxMAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjbQAAAIwA hgplbmRzdHJlYW0KZW5kb2JqCgoyNDE3IDAgb2JqCjw8Ci9UeXBlIC9YT2Jq ZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yNDE3Ci9XaWR0aCAxOQov SGVpZ2h0IDEKL0JpdHNQZXJDb21wb25lbnQgNAovQ29sb3JTcGFjZSBbL0lu ZGV4ZWQgL0RldmljZVJHQiA0IDw1ZDY0NmM1ZDVhNmNkY2RlZTNjN2JmYzg5 ZGExYTM+XQovTGVuZ3RoIDE4Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0 cmVhbQp42mNgZBBgUGYQEHAAAAHCAJUKZW5kc3RyZWFtCmVuZG9iagoKMjQx OCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05h bWUgL0ltMjQxOAovV2lkdGggNQovSGVpZ2h0IDEKL0JpdHNQZXJDb21wb25l bnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDw2ODY0 NmM1ZDVhNmM1ZDY0NmM+XQovTGVuZ3RoIDEwCi9GaWx0ZXIgL0ZsYXRlRGVj b2RlCj4+CnN0cmVhbQp42hNtAAAArACWCmVuZHN0cmVhbQplbmRvYmoKCjI0 MTkgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUgL0ltYWdlCi9O YW1lIC9JbTI0MTkKL1dpZHRoIDEwCi9IZWlnaHQgMQovQml0c1BlckNvbXBv bmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMgPDcy Nzg3ZTVkNjQ2YzdkNzg4NzVkNWE2Yz5dCi9MZW5ndGggMTEKL0ZpbHRlciAv RmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaE80NAAABbADTCmVuZHN0cmVhbQpl bmRvYmoKCjI0MjAgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5cGUg L0ltYWdlCi9OYW1lIC9JbTI0MjAKL1dpZHRoIDkKL0hlaWdodCAxCi9CaXRz UGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZpY2VS R0IgNCA8Njg2ZTc1NWQ2NDZjNWQ1YTZjNzI2ZTc1ODg4Mjg3Pl0KL0xlbmd0 aCAxMwovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNpjVDJUcgAA AakAtwplbmRzdHJlYW0KZW5kb2JqCgoyNDIxIDAgb2JqCjw8Ci9UeXBlIC9Y T2JqZWN0Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yNDIxCi9XaWR0aCA4 Ci9IZWlnaHQgMQovQml0c1BlckNvbXBvbmVudCAyCi9Db2xvclNwYWNlIFsv SW5kZXhlZCAvRGV2aWNlUkdCIDIgPDVkNWE2YzVkNjQ2Y2U3ZThmNj5dCi9M ZW5ndGggMTAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaYwwD AABaAFgKZW5kc3RyZWFtCmVuZG9iagoKMjQyMiAwIG9iago8PAovVHlwZSAv WE9iamVjdAovU3VidHlwZSAvSW1hZ2UKL05hbWUgL0ltMjQyMgovV2lkdGgg MTAKL0hlaWdodCAxCi9CaXRzUGVyQ29tcG9uZW50IDQKL0NvbG9yU3BhY2Ug Wy9JbmRleGVkIC9EZXZpY2VSR0IgNSA8YzdjYWM4NWQ1YTZjNWQ2NDZjZTdl OGVkNjg2NDZjN2Q3ODdlPl0KL0xlbmd0aCAxMwovRmlsdGVyIC9GbGF0ZURl Y29kZQo+PgpzdHJlYW0KeNpjVDRxUQUAAdcAwAplbmRzdHJlYW0KZW5kb2Jq CgoyNDIzIDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0Ci9TdWJ0eXBlIC9JbWFn ZQovTmFtZSAvSW0yNDIzCi9XaWR0aCA2Ci9IZWlnaHQgMQovQml0c1BlckNv bXBvbmVudCAyCi9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDMg PDg4ODI4NzVkNWE2YzY4NjQ2YzdkODI4Nz5dCi9MZW5ndGggMTAKL0ZpbHRl ciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjaE9sAAADeAMcKZW5kc3RyZWFt CmVuZG9iagoKMjQyNCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlw ZSAvSW1hZ2UKL05hbWUgL0ltMjQyNAovV2lkdGggNQovSGVpZ2h0IDEKL0Jp dHNQZXJDb21wb25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0Rldmlj ZVJHQiAyIDw2ODZlNzU2ODY0NmM5MjhkOWE+XQovTGVuZ3RoIDEwCi9GaWx0 ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42mNtAAAAjACGCmVuZHN0cmVh bQplbmRvYmoKCjI0MjUgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5 cGUgL0ltYWdlCi9OYW1lIC9JbTI0MjUKL1dpZHRoIDE4Ci9IZWlnaHQgMQov Qml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2 aWNlUkdCIDggPDY4NjQ3NTY4NmU3NTY4NjQ2YzcyNmU3NWU3ZGVlM2U3ZThl ZDg4ODI4NzVkNjQ2Y2QyZDRkYT5dCi9MZW5ndGggMTcKL0ZpbHRlciAvRmxh dGVEZWNvZGUKPj4Kc3RyZWFtCnjaYxBgUDB2TS+3AAAFtwG/CmVuZHN0cmVh bQplbmRvYmoKCjI0MjYgMCBvYmoKPDwKL1R5cGUgL1hPYmplY3QKL1N1YnR5 cGUgL0ltYWdlCi9OYW1lIC9JbTI0MjYKL1dpZHRoIDUKL0hlaWdodCAxCi9C aXRzUGVyQ29tcG9uZW50IDIKL0NvbG9yU3BhY2UgWy9JbmRleGVkIC9EZXZp Y2VSR0IgMyA8YzdjYWM4Njg2NDZjNWQ1YTZjYTdhMWEzPl0KL0xlbmd0aCAx MAovRmlsdGVyIC9GbGF0ZURlY29kZQo+PgpzdHJlYW0KeNqTPAAAAPQA2gpl bmRzdHJlYW0KZW5kb2JqCgoyNDI3IDAgb2JqCjw8Ci9UeXBlIC9YT2JqZWN0 Ci9TdWJ0eXBlIC9JbWFnZQovTmFtZSAvSW0yNDI3Ci9XaWR0aCA5Ci9IZWln aHQgMQovQml0c1BlckNvbXBvbmVudCA0Ci9Db2xvclNwYWNlIFsvSW5kZXhl ZCAvRGV2aWNlUkdCIDYgPDg4ODI4NzVkNWE2YzY4NjQ2Y2QyZDRkYWE3YWJi NTcyNzg3ZTcyNmU3NT5dCi9MZW5ndGggMTMKL0ZpbHRlciAvRmxhdGVEZWNv ZGUKPj4Kc3RyZWFtCnjaY1R2DU0AAAJvAR8KZW5kc3RyZWFtCmVuZG9iagoK MjQyOCAwIG9iago8PAovVHlwZSAvWE9iamVjdAovU3VidHlwZSAvSW1hZ2UK L05hbWUgL0ltMjQyOAovV2lkdGggNAovSGVpZ2h0IDEKL0JpdHNQZXJDb21w b25lbnQgMgovQ29sb3JTcGFjZSBbL0luZGV4ZWQgL0RldmljZVJHQiAyIDw3 ZDc4N2U3ZDc4ODc5ZGExYTM+XQovTGVuZ3RoIDkKL0ZpbHRlciAvRmxhdGVE ZWNvZGUKPj4Kc3RyZWFtCnjaEwIAABMAEwplbmRzdHJlYW0KZW5kb2JqCgox IDAgb2JqCjw8Ci9Db3VudCAwCj4+CmVuZG9iagoKMyAwIG9iago8PAovVHlw ZSAvQ2F0YWxvZwovUGFnZXMgNCAwIFIKPj4KZW5kb2JqCgoyNDI5IDAgb2Jq Cjw8Ci9MZW5ndGggMTEyMzY4Ci9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0 cmVhbQp42uy9yZIsOa4luL9f4esWcX/KCaTua9O7qlWtS0JeVS86X8sb/l/a lMREKkhV8+GGR6RLptxQMztO5QSCBECcf//1L//9f/3Xf/3rf/zbyx//+fJ4 zi//+ce//fr3F/eyPf7nXmJ6y/4lh/Lm48sf/6jf/uPX6/ZS///mPD48fn08 /PGrPYa3WPBbeNsBH932FmPDPP6ufXr80fBw/H481pL39teP/z5qUX/Zj7+t BZQ3iPTky+PX+pLyth3fBnjJb/uBfNQkv7Wf6yOUx5clPp4SvLjHa+rDH79C e4gHoD5Bw9cfayvqc65/UTHBY8n5qPfxWB9qDSq2vMX66wNd3jK0v6sNwKfa KHze8ffadHqKrQB61k+7V4DHB6zi4ym0iu++DcnxR48H/g8U+r52hY/UKdI9 Ui/HleF+8Uf7sNH+6Hl8Sr71iT/G5fj9eMzQKubfSmk9Wp/++FX7uT6H9h9X 8aWNVInteWt/8SilDikWjc/Jt+rXStSJgFVr8wsb6tpM2ngGbW1yvtCkrZ3x //z63//Xr//x+N+/jxKxDxKRwlGJHLa3rSiJaK8Ltcxw1O+1tvY1HVV6pfkb jpa1T6+1Wfjsjo5llDuKxl9qvR/PVYgqxqMMHe+o0wrFr847fIbjPSRp7VP/ rCBHmSjHzh1dWZ+CllX8OH443qSA9aNvNT0qVwutnfAoN0MD4cfksT30ytYN rg3g4+Mh94/5vdfO8fW5UD/VZ+7N9gt9/VoXA4bwJ9A/JVAfQu1zOIaq1CGs hdYm1teFo9H1bXVlO1pVBzVgf2bPkGPOt69RJo7RyW2m1yXqtUrwUc0mwG8e n2rH1N/rhwD8vSNIW1/pkYb7eHCAP9ZH/xbxy4itdsfCsGF/1MVpoxqMj/SG +v7ykmrZuDDir4+GxaPTXusfxFpA7YWIBRzI9nWV4fZYR5QQ+CHUSVCO8tqE qo8JZwq8JJzR8ahIxGmV2hqA2oW1DCuczO9w1Dz9KL9j92ytwy7XAefMhQD2 3C8EbSZvNIW2oxc8LrmvslTR4zHS+NhmgGMN9XgMOEfqiuC4a/ZDc+20OrT6 v8lMrUWRDo4yArUfScDqh0QiCvRfrEVdXVuv1m5qj3WYgafqRt/XSUGPVXUG aJD64VgYqhTwrGpD2J4jzr9YW4SPwfNUjDJFQ10W8DELpH5oc5seHTAEBYC+ Zvk/niP2R/3b9glF8/RML3useCy/oU4heo4K5OsIVnH3KM7HYwMc+tTh4nDs Qtp6WHvx8RxZznBxrD2Nz3UI2nMVNeBf6pDxchqLoOhTplF+VMlHec4ya7DZ x2xyCUXSPcarzcxH+YAL4/HeXLF19j6eHfAMf3xSP4B6zljS0biMFToahM8C 2Y4Klyo3Cf97JaDhLKCPOkHJVdMpTd0Wgked2sKJ+npri3xghUrPx7/0HIug SOU3aW6tzICbAJKh14DK/uiqNpXbwkBznD7FKL+AQqE4HgUfHx7/eHyqYkQI +gDqh6MAem4va+u5FNGUXUMGbFz9tbWqyRu1qkTsM1G92ANto7IDP7dyUuve RJsK6mRcrXEyD5uU1nfq2MDPkUThdWPh5xfntkw2vVQfd4F4FCPedWVuI0Ha 6tNeRYsdyWetT9tiQe3StnHT27sdWvdubUNCewTcX8iHhLhSCAe4wdtpq1A3 e7RMvAb5AfcNwKeSVzyRJMDFY3ykdSRjv0TR/XXBLrLU0Cr9ACbsovqYuIto L7ChFmmdFbGf8QP2W5uHtcz6WKdDxA9tDFD7tj+DQjqfvg5Y2tbKEJUecQOE m4OXRIc/55tiwQ2B56cS6XBYK49PwdNT7Sg8MiZ40U9yAsSTSD1cxjou+Hvb PfOOvO2lq9Kmx90LqH0qbfzxOYM8J0QFTztUmt68Sc4oyxvO0qJ2/Y7FKaGg brQobK3OvPC133iTwtuWi0U2jQaCx4HkBaDqz9ubIGjfBapswIo32Q+onAKt pe2kQEvwDnoJ9rhwYQ+2Z49KRH1qjadHPn9VUD6mAn0fZB2jnj7+tIkQHq37 R3oR4MSom9Qij0mOD02GQpvTO7Ucp3dg8QCRFF+UeET8cDS7PgT6MfBvoW3F 61Mh0QksqvUptdPBVqh2scp33azjBi++cftjs3QE3JfhEy0rx+90JKhPrXJN nRX6uWqVtuOHWvYr7sObSqxTnQ7HDk0Yj8cqum12tMWzzZ12MGz6uz3/8YuP hvVctfHZjg7QgaX4tfAy8YoGj6aAInYzbyZRwdF5vb6aNlWhPhfeAeA2L8gx WGapxzlV52kQbXt82GUC4cc2Vfk5+w6H5+TCirf2Ej5nnCr1SNBUvxKRDTVk E/2NLAFkEEHRD2hz+8cvT5sy1OQEpH6sIkqP8oTrbSz6ZNM6BsVsb2ORq96t C22JuGS5pjtTG9K2gymo+6DZeBzg4x9YQ2hTxpNuDqKaj9lTaANEou3oEU9U 9GEr+H07TO1wuRpm+0wYoQ7X0jgEsnkoUduGShTbUIliG2oosg21VX+0DQXQ tqFSbNvQDto21BqsnhVkZhtK0NmGEryMH9A2REAUirbdQ5no7EOl3LMPOVD2 IYdC6pWtKKk1QSxEdXPHT2z72X1nJJraiNrJDmoZZwORWIfINER2ITYKWRYh B2IRkmOknHY3PkXvnper99qEfDkbhWiY65+BnK3HR3pF02onuxB8umFI7EK9 iYj3iLtne4YvlmEoyeQHOdJ1U1/NfJr4Mu/FNuRvnT1HK3HM1eDtt6otlN+E CqQXSJUCGim2N9rTo5+isNyTUgqHz6Mqv+ZwcMCWI/p+94ze2cfRjqFt/+Lb oANuB6n35ENbvOkxKkSrVH3Y8YQY0abAFoBmYailnZ+pJijoDp0ZTYDF8dHE a8fV2b/sOJLQ3CmHgqimqYC2HtzbFBSoP37hc+JvY6SnqgbVybUtHGQ0yx5V CW/GATeZfAZ1aK6K0pxX7BbHSwc9l8J9i+sySWTBjlQgVt2+WVGSb4906kWl 2vYkDk6P9KaNB5eUsQNeVND4gT807dCGkqcYH1dwUW0GeOj/pXnH/yaQf3mJ ZDsH/RK8/Nt6c1Obr00pCvyXJFD2HP/4hfZR8kMdfYTKvbYRN891S1rPsugY xI0enjFjJN8SPqCRZy7s3rYEpz3W9z5lCfbRsgTDew3BpDbnlmBZOB0oQzBE NgCzWoY3UKZgYEswsCEYlB0YLs3AgVQfoAIrLyRjvSU4iek1aqNqZHfJZxmC WRW6iP1BhmAHYvwdnpUhmC3WS0vwzuZf7Jv62BuDSxFjMEQxBpP9hUzDv9kY 7ICMwTgvmj2Y/JTVIJzANgj7og3CydsW4VK0RbgUsQg3qy9DlEUYbqhkO5Ih FT8I6RORDGxpYa8hRTLUbcr4QJEMzdz8sVAG7Z/nUAY6OX0olCEBhTLA7VgG iLdjGbbCj8FLMAPGTtDT7hWgbjtL/FgwQwB6gs+PZchAsQx1+cJYhuPk2f7j CM+xDBmejWVAA7YdywAUyhDgY6EMj9qkXN/RiYQ2wSU0UOKSzbuCZhUJ7F2P eAyDIp4G/Kkt+Dsa10sUS2dGs3vdF0U6XJU35QooVa0HOZHwUbWgW65+tbcT tadJVevDghjo2zriOxsPxZhaTxCx7fk7fxPvQx7V+Qd+crI/DxwmsMvGqu3u A2qyZl1rda2qluznuP9oJl1yG+HpkJ2PeKTalYU0S1xEe6TtJyjjZ0Y7E9DB Pr7xPjbyKJWChhf+l6wl9ZHNsemNNqRJThhcjuMeZz8QufZefXe2p70mW29V 777D/Z7S9mNq+SuaWuC72Vq6+JsfW8s3trUE09aSfPw6W4svbGvxRdlafPmx tbzf1hLgx9aytLXwyUpZUc5Wlj/Z1lIXzmdtLcnfNLacHc6llrXDW7dnPToU dR+v568YQ0zjVAoJYeHDeHsuPFLH7r2gLeYxL87P5MB+fOLAHzys0jPJbvu0 0cR6HJWhyHPwNAUfHzaapo/DNcfZ8EGbPuHMeDxFWpDaM/Zw+9DEPTXTTxFI XeHbh+p1qwU2owG+KL5RBfCJvMZU3apxWzvaY25L2Cbtpg+FIKVFZmzSgc3R V5oiUY++KIiv9odM37u2QHqK5k/NloPqsT1skX/c8OyKT77Qk9Rx53rtpOcw jie+YRh+5AUy4hk2td8TWY9anx6eo9bVLezYo3kJT+0Uu0xQkmP6vq3IQKsD hwlRMZHNJRtHM9EmtSkGIA3hcP0qHI5HUUHHE7AGkTjP+JI4WC8istrMiiy2 6OF+K2hixHVgk20ymjirF3iHySHV3YowybbAP06p8a8n8K0/27PIe8Jx+Cby nv0T8k5C9RvlHZTAA0s8sMjDnyPzIEIPWupBxB6U3EMn+PDJkv+XF3vbOBVT G97eOOW8aZyCzjoFTxqnShTjVNS2qRYyxDE2aJxy3jRO8bGfhuJsnKJwKN56 BxnqwTgV42icCpZl6vEGsUxBWVum0DBFgcDkCELDlAMyTCVgw1QAZZhK3rRM Oa8tU3yw5r07R7Yp01QLYPz9tilx8vruYlJvnNrKi+7hpUswmNap6L/B5ZBn fIJXl0M+1yF4vhdieQO7eyF/A2+geS/kbX415Bt5A997NaT3BP7+qyE+2eK5 5afClj/JY0+rzCCdPirphN/psAcWTzKC/rP56xN8ub8+ioBGLZ9RxDOKdEYt nKWIQAYlqCX+PVz1Ppt7v7CnQTz/eR2Tvvx4Jr+pZ9LbJ5eQ0lsZDRZNt9D1 wwysWmpUgKMNKamWzAbSV7x6tJOtFy3EGydUaG3qrvqKithFdRReKHaUpR1k OtZ1oq5Edeqg67AdTv2bMoaEdq3gmHHND1nfzEtpPUW3H456PB7b1Q9etY4p xjugtkLKMrqxn4tCS6qEFzx7FOUqK3xdrfCZpc55/D2QkoW2MY51ege0HWFF VNIE8v3RRTFShw7FYafyRGmRWzOiw5PcYOUt8kpwPGMoUGk+m04R8VuSvB6X 61pW3TVVqRBzFZlY2i2KY7tROMsE0A9k7RKnUGYPVoxo58E5kFB/hC64yeFt LfSDt1icusbTpXsyqTSBCXyNppqmALeMXjaPb3zZj8wHsbyIxG3aS7fJDdHt TS6hvMfCEJwtp7HO6x8l8xP98n11TAhno/gRA9HWCJ68qBTwABHecFBbU9Ib RafUp+p8aE94Qm27jPapf3agUfjJyw8bRSnQ8s6f+M5jO2PiPei2v23rZQs0 4eet+Z4ogQvehUe7a4z0HChBDLD38VWZXl+17fW1N76+aourfHAqsYy+WYhH wFbNNgd4m0+fCp2xX9n/jh+KygTQOko+ePUce1wzBkJUHzJ0wBa0JNfzQV9v dV7u2VJ+guSNZ5WlIID8oh6zAkVcQzDrgBIIOjyQoDRZAjJpsn+fPhW+MEDP TeQw/VOmDx4v3Be83EoQj/doJVnDJsFcji9B5qZt6Gmn/ZVnQ5fHjDOejpqx hUFkvl24t+vBJb5QqqaNw12bEqXvea9yvHPnntvYTO9oz1X7SgchFD4GYlhD 8nw9Xz60EQVpqUBqRXn/SMfKDLK/oG2buKBPz/Qy3LhZz2qe6unc0j4ZoSlO AjAwAKXtQvCES5EpvKZynFnzkuxe+0x28kHw8yaoup/Ae8Gevg64ud35nnL7 EKXEulPFvFMRq0ALUq1mwjpmcWXh0tfsA+0xtKAK+uD5a1pAqYubkg7NfaUe o0JQNdMbO7IiXdUOb2ggcZRK6nrnk0zt4Uuf1e9J7QGfpD4830j/sPrgAf3u 6iNq7ZHhlvbwuNp/jfbQiRLeoz6k3pR04eP6I/mZ/sjw+fqD3UGD/tj9pQKh EFNMjVA1SB07XJjrubJqkGYb3sSLixqEs+nQ40KDsNm51yDJGypk1xbhHViF 8NALJIt2+hQVon8Z1MkHVAjEb6VCeMP6tAp5u6FFgqiRBO9SI45WbKVGIJ7V yH7rBG3fqfIQxsjb75UdNn6D5LC7/8kO+zfMDms5/g/9EJuJR1l/MdlK27Gp nHGbVrfqB/I0QhxtwJnXMHS4bhiWgVa1wClYMYNWjcNVSaqyGImzRAoULmKn w4QEgqOaCuLnpO8Lag3XgqmcBLAV3Nl4ipTHWaCUCaZkq6Pfbux4SQEamofU kXF5ay7NJAEZr3Q7YSfbDQaQS1Q1vEGXF26TPDnotW3+RLbdBo73ocxNzaLr 2LZLQUBkPSsUldqKKmIe3nUGjx09/000vTxq5+MmuSWbGiuoOnyRujYtWJR2 rOZlrixuI/GRTNFkv28mdv/GtmX/RlZ6RCT5wyTFJX5HHSs8zoFEwDVD3s5O ZBp2deUFDxDUr1tkE2BdmcjhHLieXiXARGPp8T5OOgf8NQVCttr5N7GNqk1g 0BmCaksTOaeP5rXplNp9HS9u2oKGzCoDXsK3NswGuWO0b7O8O7Go8G2rQB3a 9lBesiO1Z96ieAz13JTnFzhsuC4K7RYaOXI4qGZDT8iGR6ZN5dJ14hlSCjjA S2eeVPcUKIwsYowf+5k5HmGTrIwbe6KVxZ6yPX3AYm+FbRyLa3B9Rs/fu7jy dQlafM7Lq//dq2u0F9fws7r+dVdXiLK6PrO4QnzH4kpLZ5EAX2CvHcji8NWL a4DJ4kp58e6triCLK+i1leI6nb+zrtKy9anr6sWy6mRv9o5l9d6edXKMc+X7 HOM8H94oMqI7xjn47sc4H/9Kx7jwVzjHxS88xtkxPH4DIwLtS24f6OCA998+ UMEBP7cP/mluHwQ7N4YrMGa+/+Go+eGo+QKOGk6X8cNR8zs5ao5NxPbWNoT/ 8X/0hq76CnPc6uqqzsm8lfuEdGdG6rNbGc/qFvuU78x5ss77iPnOKIVXn+8s e9rWbbx1q2O43NrRZjDzX/Em79jE4DZPb+1i5K1d3eUBloAWeokSyZw4I+Md UXqFpDQDK+lZnxQNKAFJoO1sv7ED/G8C+iGBYjDQrAVAP/PWF/d1cn1T7+so RLbt5XBbt5UXCTFZZDzzzc2acUA461n266xnPtLezvlz1rO6pXs+55nSgFvd i4d5aiiPMYho5bBTQ0F8MjVUS1vvlbZ5KjfUM4mh6Bj1vOLDZ9nHPqH76BKS SvbE2fbNrFDZf25WqJkG1ImhGtNBG9/AV57GxFAJBpUHdNkHFU5RKq+wmiuc FKqM+u6k+EibebHVkMLbYq/NDIVXFKJwRiiYpIQifoZe58FTKq8qtzEjVPZK 48Wi7Z6zlFA3dd5S4Z2TQY3iDXuLgFje33NyycIBG36dXLJw8Mz9PfI+/K6M u1WTLS7wBd9zsK0z7oJ5ha/wDb6iLvAVur9X+PpesW7vmRf5ZBtHX7N08309 Nstat/eKBhW5u1fk6l7Rd2uLeXEP3nFzL/jLm3sJbt7c+5Qku3IXpN3Joat7 +jYHfZIIy6xCZT7p6l4nf4/3Qtmr0C+p1XiDSbcqnJcbFqKKKVcW8qd01GrJ n2PT2CBCx+2Nw8Dim9cnb0l/FVVCrDWxWvKKWC3xnyYVxkbPHa/aRhaECbPa VkZqNYhnajUOJ55Tq+HyRhZpRa0WQFOrdRxr9fcSR141voP1uqn1BXV8Vh2r krExSvkQsDXtWdTuQK3GKTnfSa22lRm3WowzbrXWkLaBk/UR+x03yG15IT41 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 dU1hLZ/XN/ZIPq1LgCfX89Cj+0pX6lrmpSTr7lxLslXJvjkkyTZSb9RTfIvT dsezwFvA3gsD2ziSLk1WEShjoWrBsU1C/q5JyBsmoZkU+9tSzKfetFvdJELs DQdHr2KxkxgIs0NfGKupNq6DlYUlU0qdubXiWIHZUaG59LoyJyOPdhaNDHOb iHUBtD/vVbtUX168EIxzkb0rUwRDykwT1852KnRpKlVFzvYLgMZsq8jePQrw FodqTta4zAv3TeOJM4wntmC4q1BqFgxBOsgTsyq8jchit51kQ0P3pX/LWf5E c/vpLo/6JEOqTH1as2TIXR63UYZUmXmbbhT90E8rw6LdHkOIdGeuhcgqst9/ kBDpOvqVaDjLtmSLhtWX/dtpl6jfHtZbP3fXduEMlW7O93tqwJ1nZR/awFOd WxInbjDUlO7ihghLBBd4cchylqHbnOQ3p/jZnjSZ4Lem983JfXdqr4vjec1V g+npp2uC2BnM2W/N/T6IAOf+hakU0C4l9cuT01EzRxj16yOtaNrLbWAn15+t Ca2AMqW71Tvue/Mw6jL39aS+vihN03qzTqbmOca+I264pFSRZbP7nURAQ91k C4SzW0P9fH5v5pnYmOGqvIs5vpkZXrwxzXUdw8Senc/Niau5vllGkx6Ik9ic Sj3yND0UsvdZkgdJ13OyrRvm0Sy0FEUjyB1vV8B8OcpGh8xLw1qwb9R3/qM4 lLgtRShcX71HETLfPZzvW2d2ry/2Ydi1U1kHnQg7KpywX1oiag7WrsxZ6AEK plnmELrdQhjtQeqt/+0Uo5H7Nj/gd7iZISCNXe/2ySm7iaZGbhNfT6oXN+y2 D75dmM+R/u2lGtW6np+FclRx71oUVuJut2gwFJ7mstvtxSa3I/GdbsqzPuqG SKTdn30bpr847Obx1XBM6UL3iUsf3cUdFK4k3t/bC3aF5qXhwGzUTOQu4zNY 5PzV2oAhsZNCoyGb0qKyvLhwo8h86nqXl/JuTJGZvPuzvJsmdw31cWly7yo6 cYvAaTrNBgmjAM2B7660iBxLm/apRSLN3m5KXVFHbb8MytJQFXrgx0jRujIK 1m8X6rNcRS6TLBU7cnk/B2lo6MTThHtV/fbJfXmST1XmbI9BAnrZJAxs77rJ reXTzKpyVp26xIknNNaJYJfYb4Dr/rovc7ZZHSdIngZphCl0iGHaxrGc2QD9 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 8bpOArHMSuCkU1GI2ggS0FFBl9oZDs+5YYQVgmHiYDOJiAYY5tdJKmf5YG5L yoPBO6aZqnrR9BTA2eYZXPck2qNDxFvAzpqFTL5BYctS1gSvY712pIKUiSft gngFQ2MfKXYBFdQQg+AMQEOM5VnO9URRMbZwusTXxrdrQhUjNlDE8XKq96cd TtSnXdjrI5yUssotKy8VdP3luovuEyMGCiXeX3nNovZqK7Q32qqyli8jxfXA 7khZcM1RNsoHwyDPI0tYr72d8pIruL3y2n8K3U361srLnnJRf61QX+WPU1+p vZ3yCt0Vqvv7aq76I9V2EF1OFvdGv190ibNAii6TF9Fl8n10mfx/v+gyv+cP iC6PCy2t/aNDy5qxWA0tzTGxpbVdJmlD0g+iy7Az6KSke0qoN4ZquNXFDE6o oHtydXWHL4OuyQtI99GSGoiO4UxpOcBPw5xonglXcd/yz7wKY6AaMi5JJl0l lCfQvAIpOIa8hI5aqgd46snUWp7i1bxzEndwtkxZUtBGMMSYvDS6WmQ0pzOz K6UQi5ayJE4sbtHiZLtKYmBlLR6YlhdAMSyLYf7RiOU/nE5rLD5uY+vaxLt2 4k6u8VYgwKv2tVOG8/BiTp9bvq42gsPCZVuPpfQCJ4aRDabmkDmFjKP1zddi xqkeIKRcGHa/lPhnHeJM3CkniECBgsdLWN/gnx39zNqBXsPseFUjCddDNRA5 i8ur3jtM5KaaiYgU/GiyOGjeLPvlwiNTUWK2Fa9o1gDCDqYZYgLK44IN0tVa cmbZ+JoBfe9ciLJaLforYyfcFvOnv2J/1ZZtA61ck8+yccNpMU/BaflfwWfZ TZflvHBZ2r6XyzL/uD7L6fd0WvpgSQUWocyUuuSfwcUTSClMkTPqoBI8LGpx dthX8eYGheO8LcUTCqNFQ3dwmtfE6nXQ7ZrfWpMXvKRma+qZF5ATksZggjvw Ol/iRWbK12vLfY685yPWzAklLq1IW06cu4x1W1TNb+LWP01Fnaam+YTA1NUI y3LMq3uG1i8i+6a6uEmTBSfmfKd1YsbrJG2e1hqpAfKsiFazPW24suLa6Q7O VadNDaQIryEGzSFBFWHl2/VkJdBU18Yc5c91u7S2Abm2ukNLoE1VOI9edch5 CkQQH89ske6Bsv+eL5FTuO3uDu0Mg906mqET7SlrCw289wO32mH/y8oWzUWp gcyBS1uvaGcKRyKW58C4xKHQisLL6QsC7TMFaGgZpjhjRYu1LRQy9FmL0IZM Rt3iQSXolaXlnliFSW61SxRoTpYjRUpAWBSNWIdTbzu9q3v3MGCsMlEDFQoT HS/s1evJSqDJzu9Y265Nkxyy2Hxt6vKframpSBNUS+FTFSyedEMca9oeJdI2 pKiht3EL4mzaEkATfTBNQGTDmQ24Ap2g+5ESBLymBWgT4bS4vMXF6BN1guJy 1HCyaxj+4SXGfHQZbQXxtPbG+Q6+dLRgZ7hF63587aOE8jx4uuYVPYha4W2h 5nQMrD/reFw45Rb9iw4Wt80O/QscYV70L7HeQSP6y/xLo1+bVCz5lxiFf9Fx 4F+AoeRfzFEOJvnmYMBqWREJVgeDXr49IhxMXc68jYNx/jgHE+PYwUQrfMoU /4EcjBXdsWJDsZUmB/cjVA8T48DD+OZguEDjmoPRzb/o5l509S66Ohe96Vsm K3yL8hu+BcLfX8+3BH9b3+I757LoW3QUzgUlzdYrcC86Sv8y2eZf4i9yL9Kl jN1Llai6hRndCxPgfdwLfnzEVu/xm3oXoze8i/J/uHdJbVbgUW/nzkX545zL PLdsYWeftrabq4sdZm3PmdiHZiOvtlrMlJ3SgWXejGk8TYEn2pVCyY6aE9eU XcDXtF28JMITUZcXn9CR0D7vhDkM2AoDc+hoeb8NbdrWtAoFSo2pYsy6urpn PtVPiKATIADivNI7dlqY0HO6bukBIUi0EBJ5d4+rfaSVEGSvo5RBVRAeKrU0 /4y5Bb4mCCYjrsHQVdACImCAyUtLmlVywttIdkdMJBWd6uun9lJkIF2CiFFn 6MscisxrHigZURw9fmEL9N2gqlMWAOnH24n4SuNeHaAkEBSugS20v48feop1 ctvWALoqn9Brm/YNHuuEXkx4bAJ3oylOhNFhrV+Y41rIVOtyiGq2+++Us1ws +uiEOYGCDfyRs9Yte4of1MR9TLRmAIpN2xqN7ldJ68JXqJubUz3qgXMyTzkj ToYhB2kzLzkMOCtDF3U1V7UjNDRnMWSCOPYxvFuuOrOJF+6SGG1siTzMqHk8 0UGnjsqCGX2YQtP3OWjvMZOMc++at8HzdnG+qmnndk7IMZEoBqNdJujHNAdZ CRWGLn2FgVxz++hO5Bgt4mBqcjqJreUtataNlOQLav4dSlXwtvzEm/gwr5a8 WNud2PoTQtOS4kbXLRKc79Y1L45Db4lxywvHdcbHDdeOCsVY1xIg98KNMvNt cNM+7tpphFhx07UTZwS4f0XpeUyWvsNXFxxqusnzYgtd+pbbnyIlKmmlnBbi wWjY2Lovz4BhOhIIpve2CQf+rnFPMEXPZDZqZpfWIRQao3oQjI7RoR7gFGDa 06kkSlqGuoDjUesSqw0YZ97IzjHJxAd1MEbDBSGL3fXkeyKFesQOVDJmh6GP J6kaCOEaPO3KTO1EDAWfE8Y1sApNm2BwN8MpnaKqKkeqCdeWziA0dw/GVyRS dbM2uq2iVb3Ehm2/s2JOtY81KTihpgbamklL+TsOQMSe99vuesmmejpYVPx9 bXXwct9Zs9VOV1uN2/9/F2Od2s7x/9/Y6nbup6YxNk21tr/UVBtedto21XTy 5Tcx1d4OTLXhPY6Hptr+5pZax2aqdZS2uq30/cMaax3/Ga11tTe/krX2v9RY L89HVZr6bxm+73SUN4SZekKBJ6T4eAP5c0q6MSW1Uc5JcbIoLuvxlD9wWmpX Z6VKi1kpbzX8FWal3LXff1aq0uLOCxUclgP6c+fF0k7Btu3iv+1Wwf+W+y6W qw6Uj0V1R1EMkSRaXuEmCaS1KLbrtMlbtZItNYVPkUXw4qQ6VfLgvXl12kNc rkfQJ3GCN4lD4XEvDqCTj1J8jnlq92vdiKnVUBFLP5PYK9dOsxstTrob3Xrj 2h4yPl1NxOcIZuJVuaQ5dDfyIL6pB/FrBYMauU2xUovXzgLXmWo1U2rLi3vi WHeNpakVtGxR+EhrQsw1+NegFqP59HieCycliRUWA8q+FIxharB1rwVXQtvd r+X+eaF3PD2hhvHthm7KOQmtnepq38QVGKa6tV9zpF+LpuCGfycia5olti2b p+xgnbCzgdZgPZdrcRgf1lP5kfdrIBVqkTFDJxUoIuaVvuB3QqUZAgu2AGmg FNOe7aPjzsDMgKTMU8QFZjfWMimhyWuo5TpiXZkzPDEGWafLdp9n07t6XKVz k/C9pz2eLLt+Ls0FVFRwgYrZteJRuj/0clg8SundQh0pUTwKrZ4nwyOLR/Vr rLautPbFoyYri0e1skaOTtP31aO8Xa4epWNXPaquELYGVaWp69XNmVs69laX bg/KRwWwVa3SwUL5KCQDX+O8yfl5/SjnuQ7Mcgkp5zvbxy7Q0OxG21EBqa7c Uy0gVasZ4LUoH2VF9SgrikfZrnZUO5TL1aP8Svko8g5EdVvruPDMXMvCUVrW jeJZLjIvigpThiuuxCgLRzk9LBzVjtOltnNT8Tp6DpUTjzXGBgKtWjUqxlY1 Krbt8BazQz62E1TVtfhGNUeBVl81CijoRcmoGNdKRqWFelFJi4JRumbWgq4L In6xXpS2XC/KL5WL4tqAkeL0YbUobWu1KI776SradhtiR0fVpOgLlVTdKbVt 2LWsCjJsouJsHWBtelkvylrR0M14cAIOldnUgCXWIkl4rlz55XpRSsQYjgyv LBlVQxTW0qUCGsLkGnAj3mBtwq4ulD6uLBTt/5nXiGqlfGjWTo161cpCGX9E WSgMGzbKQhmq3gTk/XVrQsmSeceXheKaYpwHpBjVMdWCqDTX6kJpO6wLBfou 6kLpeFRhKONb+SbFhZ2SFpWhku5KQ6W20zaRCkQJqCWSWh6qlj/DIlQteF2r DiUrMdX6UMa3+lAtMcwm41euD1UwLhSLqsKZm17cMrKhxaShloeiWlGTXagP BfuquT7UhMWe2mRrXiDK8rLF7QtErVWH0lZWh4Je1PJQ6Mfn5aGcF+WhWtkn JL+P71khyulxiahWHHG9RJSoPff+JaIUmXZcCIHtTZU/sxpR1Z/VufKwSJTx rUiU8TUbysmj5SJRItUKkaAzpg+Ip644RF8KSvnlUlCGraJpRaDMQgUoRZmm VrLsmApQdQo2rgBF9gP2MrGZxQWkuktiqRSU0iINt+bJLAQpNoX9wdFELvgU 7ajgE+/NPKbgkz0o/QQQOrZ6T5rPG/MlnzDEA82ejwLQETfcnJe6vYYL9Z6s bWejWwGntXpPfqHck5f1nhz/nmrdJ93ewsWeaKPKYbEnCGZWaj2JAktAj+NK PZnDqk9cyCl7hMhVmWq1J2tFLSejf5tqT94uV3uC9QDeWNdXe6qlnhwvFyD1 5Z5osSW67oj2dic2RNfkN2VMeT+0lqWeMNsqSz2Zuu1H112evMs18pq13cs6 T1yq1u5blafIZRfgE/a1dvFWiSePBd9i3eKBi2o1PrhVeScRrWZRjn0ysc+c +1HiPNr3SpwflTX3Mm3u+7y5F4nzoI9JnBu9mTiPdvnIol89sVhDndfU4hOL sFhSELe8eU2b15w5TBFr0nyyLWleV5bLTFzkzI0f5syXzyr6ljLXdpQyNzIy PUiZeytS5iJjbkcJcy8y5l4mzF17yz4eky8PuuXLg57ny+czLmttX95xqcSL 0bXEi6FiynxpWo3j48sz+bqkDynXHR9WDnpeoSnaWuMFkoQ864y2VmgCZ2La ZWp5tKUKTUbLCk21jBOXta4ZjUGNJm1nZV6iFWVebHzfIk3WykIvtu4moWsq +mKtzPX6eocLvXF1lzrXE9VNuNhL64AE/M0KNSk9LtTkawUmZEWr1GT0qFLT ZFulpmhlpaZoW70XvI712lVVEUQAYsVWxbQv+EJTSojEa8EXo2WpJjjI37Sh 1nzB619e8+VAWTV9f+c2yqpt1VAb31dZ7YGuHlZT+911NenbKmtXk+n9lXWh KhMp66xCk1DW4IWyih1houASKusfWVVtW1l/F1218Za6Wosz/UPoahYK/IDq HxQcml81Ogz6F0WH9UMcv1V4CKEWLRvEuoIgwsOWW2rhoWmmoA8Pjyhlcavw sFWOWQ8PfY0OvQwO/R8UG1rgjYv4Yad+K3RXXsnpWl7J6br52elaXgkuubwS bxVs9ZWU/7XqK9k4KLDkbS2w1DYwU66vL7CExxzblk+ur4QbDb3YqDAvsFSt Yq2uFPy4ulJoZ6cXl+dJE2F9C0sUtbI+w9pKvMmAE5LTXn6/zPhWW8nIQkdi QmRahl94Lw+L9OBvuK5SlGWVYt3+zFuX2x6Ew6pKbRmWbHYtq1SVtqa4urJK mAU7qqwSJp+6ykqqljnyxBOurYT7Z4g3E+SXwNSHtojMm2hFdaW2n4/3yIrt ssqLPbJxJ3fL9vWVfF9eKbxvLsJYsL9Db8OVOX41b7P/0+H83g7H6ffxOHWL x6/qcZRf9Dg2vr/HscVkGVqmbIUr6qpTXxnJeVm5wvlWuaJtG+tKVXDe9lev XNFVRlqvXOFHhSuUboUrvG2FK+KobkXQv7xuBRHqsG5F0qJwRa1VodsnevgI g/Jd4Yo2b2nFKaa46ypV8NrDb1S4op5tkkUsaues6A4XrlBeFq5QdVOV2NpG JGmVK+aFK0LdxvpelSuU58oVvHOxsPt3LlyB9SYWCle0J2Akg9IVerMqkqMT aroeJrPMjFr1SMcjiiIdX7RCx4UCFsznWqji8FoUWJnVRJJFKw5rIvm4XbQC CxQbOku4VLMCCE57Z+1S1QpruWpFbEUrvF0oWoHH6Q9KIgW9XLRiir961Qpr FypY1M+lmGbN67qX80tlK2xcrFsxcx86+O6rcgvuw9rmPvwf4T38UWWPkj7C e+jmPIxICP+qzsM0t8uvbL7DHOs87Mh3+N/LdcRmN+p3Wl372Cm7jtaDBvS+ riPGbdcR7W/lOvRtPEdXWW/Vc4DBZ89RYh+y98E3zxG89BzoLtY9h9PNcyg/ r3l06DqM34kyR813/Ko1j27jPqpEHLiPo2oeNW9paDlcfqniD3EgzX/Iokdc 4RP7tuxAnF5yIKFaR1F09Jc7EF2/spX8ovuAOdym+zBgH7T1/UfaxFnSulNK 7J4ydenDeD5LymV46ufjNkobGf6pHiWNsR4lVb4eJeUvZtPaP50kpY1Eae95 VzHOTupGE4XEoWOFtOnY1b3cqe5U5mOkWI8HwwNt6zFS4+sxUnwDfUXY11Ok 9Yw59XB2jhSLDyhxHbtDoooLoCNNREEjAOKNLb+4uhGd5XWVj3g5tZdO+3aF YY+rlBSfW+YDpVjfyNE30/EYKa2jlM8Njgoc2ViPktr6PTtTP2FMMmv5tqpx EC2/cfdM22Zu8FPE8GCMB4dJNae65AcNKc9EPxi/lmYCJDrOVyDn1TF09aet PAbt3HZYDaJC8MkYsYUPyUhFMtp3GluNjGjrTn5eTeS1ooUaGbZqDKUCeRu9 /fVLZExWlMjQHI85PPnwy2tkRMq5cBp539fIqEdYaoUMkuX3q5ARW4EM31XI 4E8azitk4Ea1unxaP03IAXAtkRFr1bLWSq3QUa2QgQ6rpqHHJTJiLYjDDW/b jViBXPfN819eHcNuFcfw9sjiGF7WxtDxoDiGtrI4RvDLxTGcl8UxRG2MaGtN IxtlbQyFC/oKjRZ9I/uIyhiyMAZ9ZRLPKCwXx4jbtTF2td62KIzh/K0LYxi/ XhgDf+GEvtKzqhi8V/qXFsXAzwrVbRGtKEbQG0UxtB0VxTgwxVMEJiyszokq RVocjCObW29MFEjr2DaEzA1xtcN1ezqFkGyK67p9Ky0HpnheWq5WPqumWNHn gHkToanawobYNjuMNhmtymSlHfZxXlduqvtw2RDXU5GdIXb6F1hiL03xcr2i doLa1QUeYY1bhZ/OGsvvlQTOOpRBKD8yx0vF5Rbtsfi6S60uF21Xsijy52Cb QW470I4rLxe7kkVRFJeLuFRK5liuYrSTSLHOldgca9vMsXvfonJojEVRuXYC pB2cPrJYkbZ10XrBHNtmja0wxm2tk9MTHKk1YyzOZm0XKvLLtjjoZox1rMZY W2GMdbPFmKCQVeVmRYq0bbZYW2mLtW222PFxlbrEMDfGeGCDdnHXIkX10zVK V43sShTNrLFYY+oKyim/ayuuq8ZY1f7NjTGvv/p5haK15VecOqqk/+h5oyhB tDxvlCWI/pknjsH/OXH8p5o47lQI8LY/t8P9uR3uj9oO90s2J+Dua+VMf1SC ywcl7hvvYU61CIMsHsQ+la+NAKLpBMeTS5WDdDysHGR8qxzExYLqwc5frXKQ totlhNohUzKKey8qBwXdVQ6ipaz6ublh6SBRMqPObOkQLCW7g9i7oHS98u1T HDXIFhWDrJUVg6jlZwWDnK8Fg5arBYHh/AXVgmommssFtU2A71cuyNVyKFw4 qEautWDQVPcRtli3zgpuVzLIRj5v5TBiCyIMrjWDIExte/gtZc4SVl+sH50i GJwBta8/8/4iVzHiztB51SCu0EYmNLZjz6FGV6FO6aMMLjeKBmHIulQ0aALd L8WC7ngs5FgMBFhTm/D7mnim9fWdv9x7raxRu0/e5Oc+enznL5+qkG3J4+/v gDIrg8/SNX65J0SgxuPXd/5+stvdPbUp5f+7P3f/1+7xv905f5x7oCbY2BiC RXvp4JSA3V1f3vnb7uqYt2YM4p3tVXd3j/8DlsNSwhg/ZXY9fnZn3pkOvrDJ oxufVFoD3/4DCHPfI/U9szDEhH2na62B7MFAdAgke3j+6fnD8/vf3NX+ZF/+ 3P9WB/2hsm739V2tT872d0+1UydBGyQjiHSCQy0q5P9zn/++0em7Rh1AFNzz 3z46O3v88V1tTj7/Vk+O/+Jr88DSysBSALaWIw7IFxjGESQxE3gg8eSHuweP Hv8l80OdqnT2hHGEFRyxSJNA0bEkq4xNO/lv1oU2nBy7uSwxBR9dejDiYSpy SWJN6DInhqTON/1xN3PDmpPuplvl4BD1sU/ePXUK2D3nZXaufkJi0iUO3icI IAstH7+43P3tzfWrZ7sv35SShf/vB0hVtiqL5IUiOspmYwTi+fG335ZBx5NH F1e7v758enn19nL39cW7V1mrd+cPPsFuHYPSWFTqqKdJ7b66eHb98tnu25Pz R1+ffWu0OmNp2WCu9yX4AeY+Pv/yw93/MPbUT+ZUA8GCPbUuzDr1l0/1NEJa qjTGDqvkgFm2h2u91Aq0YgHhAct/JaFcR3mMDbAO/J3oc9agsyefgWXL6qy3 h+0UhMpLdByPVXgXFyGs8573IdZZOfmX3NUJIpX6b+YsO524oRPWV0f32fnf 7mp1cu/+/W/OPv/y/P62XikDq5ANycn9J199df5wZiIXHgwRaCLevvsH+VME yG35HqIMK8/hAJ2Bgj6CMnOnOrDgjDLHwC56QEmXxDBTQqlGsdzdAAJfLsLJ rni6HWt5yQSmoA7c6d1l7bqrw8nCj/4fDHZb5azGGbeGdAcR69uTb42xH50/ fHT+GHTum8fnu48ffP0/v727pG7awUYnXbe2kLahWo213RioINy9+veycbf2 q3XcIqKGAWrFA0w5DKIBwiWJ4QSzaxjfo+yJ9clljpL1yYv8rzu5zr8UMTy1 08nzu6fG0d38r7MNxqqTt/lfX343U3sqY/ss/xLpqZ8A5mX+N55cwbP4L97F pz6sKqk2DN40EVfy00VfTr1u/8pf1u8eDz+CuS1+Y379/kicv3i8wujYYMno /Enl96VyNidLBJbGZ66bWkFSw8XIocaDTz+9981dY0/Ov/zyfJc9fPbud3U6 +ej8/tnHnz+8V9zF43ufFb//5P5n1RxURAEms6ltaMlW8Pt+PrsQjkL1zwAL MtCLv7283n1/ffnu8mr37urmg2yJ8tzt3our3H728nJ3XuLok+vnl99dvby5 udy9g/bVzeX15c0xcWVZ+ondC+/df3z+8D685+zxvQdwcf8sxzS7v50//Ki4 ypPzrx8++OzhGVjFHLM8qu8ZDstaOKve3nPy7OJmd/F6txmf2wAlscSTU9jl KHK/gxCynwwu0BOSxc43l/Jfl9cXVzdvL169vXy7++ndNQzw2eUHu9cv3/78 7u3ly1eXV3ugItEvM28KHiphKmcSKue9F9e7+xevL3d56nIDRPnx+uXTF293 zy6vd49fPv3hEgL9t1fvXr/Ov3xoXDidVP4tnlgfrPWnOnfo3dUzdDqfXf70 8urqx5dXYM3poW32mbJ9wXmamv395N9P4zTl2PvfjLanGbE++eaDI5jjIJks ERXRyvTYEXGwez9fvHh1ifK13TVfMvrOQiIKUNpTledTKpPq1ADBSt457j56 cP8JvOVR9ku77c6qCLG8xPzyCqhu9l9cvL0EoXz+5joP4Ic3hc9XZRSZqM8v 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 w27DsviS3WKQstZiXc2Yb/PqloWU9IctWwi9vlxnDOoWbj+02++v8rVrLjc2 PSnaFUu40l6kx72600rUu9BunTmHfnCmQtG4rwzSC1cehV6xRL8vDtW7j4Pz leBGIpWGh8r4+tDiiZBxZvVJoN+EDr4/NlmupUhMQ80Hm7020zp9sr56OPbu yG60OSVWVQzMSBX9rklPGmz/rlwcuf1siXEszU+oKSqnzpDZUTaKrwzTXN/X jwzjbpo3op2mb14TXpcjvx122BO3149YNpXozNf8Ug1/f7dUKv/muWgi4Hdj NJ7T7N1BmOZ6cZtWeW4eOpm+f4tJtRzKX7rAXmJW2vzVlqcLf/+2CCE7Pzp/ MkwFyVHw0Ennqx477N4WUfj+wNdvusyaqcCHro0pgE0KD02tns+6K8/r/NKW Ojg/7f6gP/92iDoIbIkkTT2cy2O3fMjZmTl0DZ3pUH5/2Gv7tZ1q15RFtMXE e9fMe12dXz5h3jfOnsNwQB4mAV566+MrJzhhwOzMlNVm22camnmJ66roencY beN7jzFNc731tmiDl2ACmJ2fr1YbL+p3e/1al9nk6deG9BFDRBO7l8/resgk o9KTi+b+62RRv4c9ctGE+znD3x1mPAjNNKmZEK+vQLEJceSdYZpVpQt4+i3O TYVKoDl0ytb3Divnw/wlI6ZT4W45w9+VBsmerNN9rX9/Z8yItnL8a3voR7T2 Hh+U2ypv+sMk0KtMhaoF2rE7Vdlk3/fdYUVvyyX08Fmp+6x3jClUtN1CSOj+ Y0LiT0fZ+tA92laO8zn8bKk/wuT0rtQM2nmZ87rMX349lySzbdc/SMK8OcaJ RL5/c14B78y87LncS3pI3OnplPdGzQv7qDJcKpWkRCDWHsNtCOWeN7tBudjR 2QsNO3p01JNiVy70Gr1T3h9V9cXrLVtHH6Y9cMZ0WdiHK10ZCubHLV2/9JwC pauMnNpa2X2WFa06rVNWkXU65YuGMOzHraM/uCuh5VTutHNoa1Jx4ELW7moC HdbpsID0bt0Amgg138qtAoT3xFSKOWEU/xTHql1E73Q6KObe/+rgp5KyhQzx mXjXnl450xNyGHGKNbbNXulFzerTLH2TbgoSHrGCRKKjcVVdNX80qoQgmUAf FyRzmTb9EnqKra9dF79f1/ka5lP5spt4W5tQviB9dYwRnfLgNi2ophvzzbzb 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 u2Fb77xR8ztM5o3nr50iW+BJYe5oAWw8zUO6arRRdkP+JC0mvNbwS+VCfyBY uMfKQA701cF9iv7vgwFn6dS2DpRgP5nkqLMaTTKhT+T7KW6tVcqltpjgqtpD n28MqjqbhArjqCU714qP7g3Y//lGVpCNG+7B2VVsbyF3Z4y2lQKXQU1CDWJq VFTpHPRyp5xikoidXCb9YCQTL2rd++ebEPv6FjAOOaeZyNpMsPxQF/IJHeVP qZWjH4fqWwTNorrUQO2DhpipDEhs+cEGAyi43G280aYTj2Jz1FHL6Oy3t72y o2sLQtKxoDcD9ewWEJ6eRKeTzkSwcuv84Kk4mE8ur69+ioVJccgYxwSf4y+A o35roUZ2P9n5jcVHIc2+yR5WJpcdAG2t1rUwBdRVfL5tNOfIZbJIhhww1CGZ axlqZPGDhzdUHf+VxpxbU86mEDqlJXJxCAkNdBdE5+j6ztFtvi4cQ+d4uGzz FotzBJf0bp88gkv/IBGtqxAIi0TQj0ToBZO5QeJGqqx0Mygacm9bV/oI9pIa lOQbSB16W6Sx9VaUvo+S0NgLrov+vJHr6jSpFauqJLfyIJz+SXRTulJ3QmpU ca6jPCPKqos4cWrFiVNbAkmvlDTnk9nQcJPD+Ob0fLrTdsvPv7md9Wz/ECqU 96flVCEhHzp+wMmKamSUSjdZUIaCI02VIrWbblMHbWQUlY7Fv9s4UwaaNrtN bnSUbB+ArsTgUN0EdPFQGBU50xl5Ijai5HNqFXxsq0xEFkmvD4VenoWL7clI lK4Ef7F5PzLk2aj/B6CxJuL4yjbfgtdy/MePolcKaoyyBQXphqQc2q2n9Drh 53LR6vNXtZ30uiR54PZB9h0nJgyCjwKSJv2xUyyUHahUHXTKwquKLXOSJb1p GTCwvUePuObXlwVFUYuoUQt5lM6/JcoKixaZ3fb3biMJ65nDi57W2aTs4AGY lN18R2EDwvqvvVlRvFdr4UP4kcUF6RN+vam2SGw0qXtgbHGfcuyRRQ50zL/o g+6p3sTWj+L2pVjc1DFg0jJyjDn2xBOwFbzI9U4WHu2H1svtbxYN7Z9sdmtS h203mCxBWiXUla2AWeGnNpRPcaXzhqEWi+5yqj4r/RyxyS9RhyXihSKc+8jB qkhzQR76pTfUi0vk0Y8cdIn8wpGHP3IhbAQEWB4tN5F/Q1miyFl57Qq+Vs7D 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 QxoCD/0hxlQaWy6OP8KQXzXULoTP4DyYNr/elDv5yyAVMR87kYMhmoq1AsqQ SPag6YrctcUCTEr73UMq8kkICcAK3gqsw4o6/oqIKoEROepAWnqUXzqCTkFs sDozU9KkC1BZ7cc77WxVT+/YHhflT0Sdh7ViRdTaUQYwlUCgZZCqZR5ggFff /J3VFfU6VFT9H8QAkAuzAbBkoxYSHsURD+Tg2UrKOx2Ghlh7XHx7PH/prDkq CxmgOgc6FZiHzC7+l7n/BsAk3l6YyUbG0GuLmlyTkcEwAhlbx9898BiIUqBT IEiVRe5JNk2MHT544P6bm3+zyACftc5Aw2nrpUjZ2pzX6pMrg6GimEHkaIK4 wKWTId4DhQIqycAeBXayUR4t/9oQAZH6tHXfO8jEEbQOyYtmeeNxSOFZj2ho hfuQQo89fiG+0GPtdooZkNeq2oubYFE5ZMDuMRPWuLOXD9YuUGDIcFbyvcmx RjDcgrA8ZcY/Gj9gtUvUxVrASB2q1mdvJMQ+fjDuiGoI62UA4bDasNBGSXwi qg4MR2cxTSag7c+cp8LOD2VY/VcJRu78m45slkVndnqhmhw007JndixWTDJW qQIEIvC2AiShduUonm5zV7Q2VdqxTqArhePqurP6CIWWmavQE1demc9ndsCk 8In+dnFVe8ixRwAXDaMSYAAsIWbsHkbeky0eeguZwxTWdWfJbcNtYLlw/nJF yR0gmkrrGHXzJjba2eZ7AQ1VIDWmCDUmIDcSYRUTORDpQ4vJEo0kDz7GPhM1 gV6j9Oy83gquUSWauHw0EVmCU71ca19ch1LMjWY1SgpaI9RB6vqh5RNINC56 DkBv+LJ6J/P6xuKKDTmI2WlxE/0kj7AULJeueJkrmyzdODPU+Wr7MpObfNvC z0x/X0/bP67H922p288nH19v/+v/fIUt5Pf//X/Pxs+D5b3JMknj9acTtHGZ NA7PZ5rWW9rXy0fvx8kB2R69Xz+aW38/Olw/uj7rp197aWr8/eB4/eD9Z9ro k6s0PvcBbbylH9vGtP5+dJ61zj/3vnWZtS4/L+Za133eus5fZNIhtvV+3SPl JIBrPXLM3iP+NDOtvx9913+29XHTf6Z1XW/6z7a+6b8XX2T/WWb+0dtNb9vW 4a63VyzHuN729lpfmFHa2y+11t6m1t+/uOttbn3b2y+9iPY2t663vc0vctPb +Wf31d7e5r0dbOOrqd2Gxra+G5oXW7ehebF1GxrT+mrZ1Ncf3YZm2iU/5xda 159m/kXuBtK2vhnI9EHjGK7HEW1fGEZqXEu6GUV+8nzFtEE0je82s1cb+7a3 IzjrjOEAmre4Gz9ufNwMXzzFPtv4xevxo8YvDKBtfbcOTevjbght63wzhtw6 z02LcxDto+9Gcdolw2G0z76zy2zrej2Q4SzrbQM57b9wPppab3ldr4edG98P O7euJd8Mu3n2cWfH2dcON8NuWt8Nu310vBl22zrdDLv5knX6IsePRzMdm8kk sa2vXY59+/HedJLkm0lCrXm2jicJN66l3EwS++i7SfJi6zZJXmzdJgm3pil1 Rtr8JLH9V24G0j76biBt6+NuIFc6dvfbgVzTbwwkGuct3w4kP/p+IF9qrQP5 UmsdSHrvq72hbxxno95Wu+3tejuQ6+vn7/oRXh9HNL4fRmp7P4rmwXeD+Frj Nob8Grcb9quNu7Z3A2h6+bgZP9Nz10GLcvy826sbKrf+fnS6HEDT+KKfzxF8 tfU5hO5Fbsbw1dbnILo3KZejaB99N4y2t9PNhuqefX0ylvrzF/TR281AUuvv HqnXA2kar+FmIF9s3QbSvshNGMe2Dtp/8WM0jrZHwk1n20dfb3plP0EOL64a av396GsXxTSmdXAWnXedbV4kxZvvaF/kZkI9VRdf3dm5NY/6Mzvov6J5ctJd 5Cxk6sbctr6JT9r3uBtGWovl7vsN7PDxl8Mz97tvhqb17mvpn4/b9XfKJ/d9 e+6BDanWwdcyrfN6s/yo9f3ys4++iXTaR999x3RW6/qhm3xH0zqHm0Gxre9W FLX+blyuX/uZktJH67zfn8j57rVt67t5T62/X+Ta+D6JtPTR5eZFbOsbn59b f3/HmwW4fdBXrDfvYRrf2EDU+H5cntm0l1/DtC53Zzi15nnt7AN9Ecq+le32 Rbj1ZMsN60eybb9HpV6+Rj44r1fi9Wu41unqNbjt95S+7o1cOQeIOMzkNWzr cvka1Pb7NW4WYt4pYVh2ND7O7eOZANbGmVNepZ9LZ7ZVWkeKPZcDjYN9je8B KzlwoBP50+eB17feOJq2b3Mz4uc1Vo4KIH/6rP/mtrk8G5MviZzoCVvzBko6 yHHZEwY8h94YTJXN42kqcv2BfpW0s8FW4nDAQ40/o1NSYTuJQ7kc7gpH/Plu vjXteCnZ9/Ctv1+kzFyAo3uT79az3TQez2E0resRrr9kZkuJs1382uEIz+CO a33MO/v5JTPbVfs2G8hj8Oy6jhdjrD+T0T66HjcDmfHY7e4LommYDeHWNY13 Xw1N0833wpdK118qsalU8833sq0nczmuT0CVaf39ItM19XR/bOtcw8yyOkZv sk/eJDwFPf2z02zmh3MvsK0nffKjDR9S9yb1emBsl8yW96li51tPHv29UAc9 clwPe2RT81jHEy/Uer6Hbb2NhyYc20ffOEwefeSf7d81jjCQi3lyPYfRtp5t 6esTi+Vb51nr/cN1yHd/TIMp5+HpHl0mwyhnCz87Twd9qz/HmH/2rPW3ObGX 7tnH2C8K8cf48Y+uk/Mz7OfEtq2PSf/F7TxtuXVY18nyjU9ny7ee7elPVV7f eDKjvheNH8Zt9hbf+37/EpMx1yUTyCkKSFudhBW0ZLqm+Xq92MZl8twjnZPa tt5vFoxtXSfdIQvGtj7Gb/KzYNbuS26Tg7bZhK7xdrNgqPW3L5JvFox9drhZ MPbZ+/WCsY+ONwvGtk6zJbCdp6NtnW8WjG1drheMbbzPVkHomtbJmKc8+oY3 Z8xGznsIE68h1P0cc9t6Gz9aVoFtPPH0w/fmaZp+e6p3C8Y+OM4MnNi9xvez j5mll8/JZFrHyYKR1WVfZJYkP91V9+RwvRTtk/PNUrSPTjdL0T673CxF++zS ubd2Ldpnz85FWV229Wxex3gaOLb1LBUQ925if7/3cb0WzaOn0MjnWjTPTbNN 8vvYSt3IpMmgy8K1bzFL0ZwiphdfcHgwrgiOhTjZfnWZo/FWUp49+Ti/only vPFNTOM0efL3BpK6d87Ymrbg9w/Tcrbvrumje4V9bnCu3SvU6zVr2s78ZVmy 3MU5TiLlbcHyg9NkS5IFaNrOIoTicZnGs8C3LD/TOF57UPTtDsTfXXBJHCjz 4HQ9j+NB0dWQ8vVE5tZbKevkKDw++ieX64nsWu/jrygz2bWezKMWbHCNj2t7 0LbO67U96FpPwzTPsJ9rPE2MnBgw1zpeTlPXWAf9sFtdm6eu9Y0V5lqXy5lq ZsiRy4UV5p67X1thrnW9ndaI1Yd83E5rROvLnm6mNT2Zl8BkWnPrbbbnpucR 5FqHu2lNjdPUcYmyYvjR8TIuYPrjKOFuVvOT0+2s5tb5blZz43I7q7n17CSK T+Jx37rezWrukOlU3frpdJR66Y+79ziGuQCd1pVyP2Ffry0J1/omfMutt7od 17aEe/YkUN4cDPPoY4/X89o8OU39i9i9x/ej07U3YlqXI85a13OK2NbpehnY DpkE9XQZ2NbpehnYxjOIiiwD27pcuwyu9T5ZBuWjbztLasqasa1n4yhrxozj NH/Q3ADTel+nln3uOvu79fTZ+zPz4lrHsYOmK3KnNGiosxUpa8y23q7DXq71 zRqjxt8dWK7XmH1yvDk7bOt0YxLZ1nkWVD5XjW1c5nC+2j96MlkbEsB2yLFe xrzck2+CxK717OiVJWZaHzOLUqwt23q7WWS2dbg5mGzreGNx2dZp3Ce6EAqy 9gF5h0Gg2LYsNyvGNN5vFoxpXK/XC7Vd1/V6uZjn3lla1Diud/6DabxNgW7P eWTahpulYhrH65ViuiJdLxTz3Fnb/aN73zwPDB/BNy43HolpPDuzju7LxbXe LBDT+LhZH9x4W2+WR6Zi9bht17lH13q284f+0Wsos8TLM/fonhyv14h58rZd LxL75HTjZtvWs9khy8S2LtfrxDaeTA9ZJ7ZxnQVvt3Nt2w6Z7HK6VuyzZxZQ Wy2mcZhFpY6PrvPC9IwIg9cIYe4Xbf17zEzkhpdxrdOVu2+b5rlXFPqveDPi iUBgMezX1rRtXGdW/RmEjImK/GM47h5NjeN68+hIFe0xbtePto3Xear++ejw QY3D9ZNN2xvfbCWUW4zpMpvjGufr6W8bX5uv36ugUj/vl6/hGtdJaPhZg+Ub H7MyzRNbxq23vZTLb2gfnda7bwjQX0zb3TfkxuHuG3LjeJ3bcq3T3Tfkxvn6 G1YAFWMq11+Q296NoHnuDezENq7X3860nWXL1idJUPn+CEqJ9v2mK6hxiHnK 1HMCzEzrNd70nH30dt11tvHMT271Bu49jpuets+eTbsQPvoOmSHXQnmeWLav a7weRfvoGTwvPv9x33Gysr49gieW7/t1UP8Uc7kGarnWN3uYbTybqDKO1Pq7 Q6Yn3FmAYZ69ptm53AJX7k1myZRve6n/kmXmDIUfOkHfeAqPekLrfeswMb+/ x+Y5RzIhjCOHv71x+nN8utbXx5xtfLc72SdPOzt3TcvNuNjWswi1jIttPXnn FlB0jWdou6dlatvu682oJIItx1mAWkeFW6/TLaSFern1VmcFcjKG9kVuTlDb eHqCZvcSZc5Rclarule+G3H7GrNny4hPnj00Cd2j8/X0sI3LLHR2zg/beJ+l JGR+IB9xYy/RQ+vdNMIcOu7mEP5+vJlAL9tf9KbHdGc27ep6c7ZS0222IZ8H K7WcQgZlWAcnyCjMw8+coRjOQCi3TDcjHxkEvo2zYjr41Pj70fl6pEzju8Gy Ty5X27Vtemd42tazDj6jDq7xcTNwputCuRw78+RjvR4+23i7GcFAoOQabhw6 avz96HAdYXWtb1amaRzvTKfJW09MJ372Oj2/ZMzta6frMbeN882YT157OOb2 yeV6zG3j/eY83wgpG4+7jZhbr3devH30cb1suXGaBfe//ZjkGm81TvNVbRDt o7freKH9ivt1YMo9OlyfurZxvAoXurbpesRt43wz4itBLNPUZJERt61vRtw2 rrP6yzbktvVxM4qm9bZeL0XbeLseF9s4XBrLtm287urtAKwvbTdlQLbx9Ylo 25brfraNZ7H1s1zNtr0+42zb49JRNG3DtOjm9BNt4+3Sgz9nhzaepdhO3Ktr fH0KucYJnZzqoJNt63zdy7Zxufb8XOv9OrTCrbc6A7u1g8U9eoaoWs/x5sar nEL/D7qNAO8KZW5kc3RyZWFtCmVuZG9iagoKNiAwIG9iago8PAovVHlwZSAv UGFnZQovUGFyZW50IDQgMCBSCi9NZWRpYUJveCBbIDAgMCA2MTIgNzkyIF0K L1Jlc291cmNlcyA8PAovRm9udCA8PAovRjE1IDEyMTYgMCBSCi9GMTYgMTIx OSAwIFIKL0YxNyAxNDMyIDAgUgovRjE4IDE0MzUgMCBSCi9GMTkgMTQzOCAw IFIKL0YyMCAxNDQxIDAgUgovRjIxIDE0NDQgMCBSCi9GMjIgMTQ0NyAwIFIK L0YyMyAxNDUwIDAgUgovRjI0IDE0NTMgMCBSCi9GMjUgMTQ1NiAwIFIKL0Yy NiAxNDU5IDAgUgovRjI3IDE0NjIgMCBSCi9GMjggMTQ2NSAwIFIKPj4KL1hP YmplY3QgPDwKL0ltNzEgNzEgMCBSCi9JbTcyIDcyIDAgUgovSW03MyA3MyAw IFIKL0ltNzQgNzQgMCBSCi9JbTc1IDc1IDAgUgovSW03NiA3NiAwIFIKL0lt NzcgNzcgMCBSCi9JbTc4IDc4IDAgUgovSW03OSA3OSAwIFIKL0ltODAgODAg MCBSCi9JbTgxIDgxIDAgUgovSW04MiA4MiAwIFIKL0ltODMgODMgMCBSCi9J bTg0IDg0IDAgUgovSW04NSA4NSAwIFIKL0ltODYgODYgMCBSCi9JbTg3IDg3 IDAgUgovSW04OCA4OCAwIFIKL0ltODkgODkgMCBSCi9JbTkwIDkwIDAgUgov SW05MSA5MSAwIFIKL0ltOTIgOTIgMCBSCi9JbTkzIDkzIDAgUgovSW05NCA5 NCAwIFIKL0ltOTUgOTUgMCBSCi9JbTk2IDk2IDAgUgovSW05NyA5NyAwIFIK L0ltOTggOTggMCBSCi9JbTk5IDk5IDAgUgovSW0xMDAgMTAwIDAgUgovSW0x MDEgMTAxIDAgUgovSW0xMDIgMTAyIDAgUgovSW0xMDMgMTAzIDAgUgovSW0x MDQgMTA0IDAgUgovSW0xMDUgMTA1IDAgUgovSW0xMDYgMTA2IDAgUgovSW0x MDcgMTA3IDAgUgovSW0xMDggMTA4IDAgUgovSW0xMDkgMTA5IDAgUgovSW0x MTAgMTEwIDAgUgovSW0xMTEgMTExIDAgUgovSW0xMTIgMTEyIDAgUgovSW0x MTMgMTEzIDAgUgovSW0xMTQgMTE0IDAgUgovSW0xMTUgMTE1IDAgUgovSW0x MTYgMTE2IDAgUgovSW0xMTcgMTE3IDAgUgovSW0xMTggMTE4IDAgUgovSW0x MTkgMTE5IDAgUgovSW0xMjAgMTIwIDAgUgovSW0xMjEgMTIxIDAgUgovSW0x MjIgMTIyIDAgUgovSW0xMjMgMTIzIDAgUgovSW0xMjQgMTI0IDAgUgovSW0x MjUgMTI1IDAgUgovSW0xMjYgMTI2IDAgUgovSW0xMjcgMTI3IDAgUgovSW0x MjggMTI4IDAgUgovSW0xMjkgMTI5IDAgUgovSW0xMzAgMTMwIDAgUgovSW0x MzEgMTMxIDAgUgovSW0xMzIgMTMyIDAgUgovSW0xMzMgMTMzIDAgUgovSW0x MzQgMTM0IDAgUgovSW0xMzUgMTM1IDAgUgovSW0xMzYgMTM2IDAgUgovSW0x MzcgMTM3IDAgUgovSW0xMzggMTM4IDAgUgovSW0xMzkgMTM5IDAgUgovSW0x NDAgMTQwIDAgUgovSW0xNDEgMTQxIDAgUgovSW0xNDIgMTQyIDAgUgovSW0x NDMgMTQzIDAgUgovSW0xNDQgMTQ0IDAgUgovSW0xNDUgMTQ1IDAgUgovSW0x NDYgMTQ2IDAgUgovSW0xNDcgMTQ3IDAgUgovSW0xNDggMTQ4IDAgUgovSW0x NDkgMTQ5IDAgUgovSW0xNTAgMTUwIDAgUgovSW0xNTEgMTUxIDAgUgovSW0x NTIgMTUyIDAgUgovSW0xNTMgMTUzIDAgUgovSW0xNTQgMTU0IDAgUgovSW0x NTUgMTU1IDAgUgovSW0xNTYgMTU2IDAgUgovSW0xNTcgMTU3IDAgUgovSW0x NTggMTU4IDAgUgovSW0xNTkgMTU5IDAgUgovSW0xNjAgMTYwIDAgUgovSW0x NjEgMTYxIDAgUgovSW0xNjIgMTYyIDAgUgovSW0xNjMgMTYzIDAgUgovSW0x NjQgMTY0IDAgUgovSW0xNjUgMTY1IDAgUgovSW0xNjYgMTY2IDAgUgovSW0x NjcgMTY3IDAgUgovSW0xNjggMTY4IDAgUgovSW0xNjkgMTY5IDAgUgovSW0x NzAgMTcwIDAgUgovSW0xNzEgMTcxIDAgUgovSW0xNzIgMTcyIDAgUgovSW0x NzMgMTczIDAgUgovSW0xNzQgMTc0IDAgUgovSW0xNzUgMTc1IDAgUgovSW0x NzYgMTc2IDAgUgovSW0xNzcgMTc3IDAgUgovSW0xNzggMTc4IDAgUgovSW0x NzkgMTc5IDAgUgovSW0xODAgMTgwIDAgUgovSW0xODEgMTgxIDAgUgovSW0x ODIgMTgyIDAgUgovSW0xODMgMTgzIDAgUgovSW0xODQgMTg0IDAgUgovSW0x ODUgMTg1IDAgUgovSW0xODYgMTg2IDAgUgovSW0xODcgMTg3IDAgUgovSW0x ODggMTg4IDAgUgovSW0xODkgMTg5IDAgUgovSW0xOTAgMTkwIDAgUgovSW0x OTEgMTkxIDAgUgovSW0xOTIgMTkyIDAgUgovSW0xOTMgMTkzIDAgUgovSW0x OTQgMTk0IDAgUgovSW0xOTUgMTk1IDAgUgovSW0xOTYgMTk2IDAgUgovSW0x OTcgMTk3IDAgUgovSW0xOTggMTk4IDAgUgovSW0xOTkgMTk5IDAgUgovSW0y MDAgMjAwIDAgUgovSW0yMDEgMjAxIDAgUgovSW0yMDIgMjAyIDAgUgovSW0y MDMgMjAzIDAgUgovSW0yMDQgMjA0IDAgUgovSW0yMDUgMjA1IDAgUgovSW0y MDYgMjA2IDAgUgovSW0yMDcgMjA3IDAgUgovSW0yMDggMjA4IDAgUgovSW0y MDkgMjA5IDAgUgovSW0yMTAgMjEwIDAgUgovSW0yMTEgMjExIDAgUgovSW0y MTIgMjEyIDAgUgovSW0yMTMgMjEzIDAgUgovSW0yMTQgMjE0IDAgUgovSW0y MTUgMjE1IDAgUgovSW0yMTYgMjE2IDAgUgovSW0yMTcgMjE3IDAgUgovSW0y MTggMjE4IDAgUgovSW0yMTkgMjE5IDAgUgovSW0yMjAgMjIwIDAgUgovSW0y MjEgMjIxIDAgUgovSW0yMjIgMjIyIDAgUgovSW0yMjMgMjIzIDAgUgovSW0y MjQgMjI0IDAgUgovSW0yMjUgMjI1IDAgUgovSW0yMjYgMjI2IDAgUgovSW0y MjcgMjI3IDAgUgovSW0yMjggMjI4IDAgUgovSW0yMjkgMjI5IDAgUgovSW0y MzAgMjMwIDAgUgovSW0yMzEgMjMxIDAgUgovSW0yMzIgMjMyIDAgUgovSW0y MzMgMjMzIDAgUgovSW0yMzQgMjM0IDAgUgovSW0yMzUgMjM1IDAgUgovSW0y MzYgMjM2IDAgUgovSW0yMzcgMjM3IDAgUgovSW0yMzggMjM4IDAgUgovSW0y MzkgMjM5IDAgUgovSW0yNDAgMjQwIDAgUgovSW0yNDEgMjQxIDAgUgovSW0y NDIgMjQyIDAgUgovSW0yNDMgMjQzIDAgUgovSW0yNDQgMjQ0IDAgUgovSW0y NDUgMjQ1IDAgUgovSW0yNDYgMjQ2IDAgUgovSW0yNDcgMjQ3IDAgUgovSW0y NDggMjQ4IDAgUgovSW0yNDkgMjQ5IDAgUgovSW0yNTAgMjUwIDAgUgovSW0y NTEgMjUxIDAgUgovSW0yNTIgMjUyIDAgUgovSW0yNTMgMjUzIDAgUgovSW0y NTQgMjU0IDAgUgovSW0yNTUgMjU1IDAgUgovSW0yNTYgMjU2IDAgUgovSW0y NTcgMjU3IDAgUgovSW0yNTggMjU4IDAgUgovSW0yNTkgMjU5IDAgUgovSW0y NjAgMjYwIDAgUgovSW0yNjEgMjYxIDAgUgovSW0yNjIgMjYyIDAgUgovSW0y NjMgMjYzIDAgUgovSW0yNjQgMjY0IDAgUgovSW0yNjUgMjY1IDAgUgovSW0y NjYgMjY2IDAgUgovSW0yNjcgMjY3IDAgUgovSW0yNjggMjY4IDAgUgovSW0y NjkgMjY5IDAgUgovSW0yNzAgMjcwIDAgUgovSW0yNzEgMjcxIDAgUgovSW0y NzIgMjcyIDAgUgovSW0yNzMgMjczIDAgUgovSW0yNzQgMjc0IDAgUgovSW0y NzUgMjc1IDAgUgovSW0yNzYgMjc2IDAgUgovSW0yNzcgMjc3IDAgUgovSW0y NzggMjc4IDAgUgovSW0yNzkgMjc5IDAgUgovSW0yODAgMjgwIDAgUgovSW0y ODEgMjgxIDAgUgovSW0yODIgMjgyIDAgUgovSW0yODMgMjgzIDAgUgovSW0y ODQgMjg0IDAgUgovSW0yODUgMjg1IDAgUgovSW0yODYgMjg2IDAgUgovSW0y ODcgMjg3IDAgUgovSW0yODggMjg4IDAgUgovSW0yODkgMjg5IDAgUgovSW0y OTAgMjkwIDAgUgovSW0yOTEgMjkxIDAgUgovSW0yOTIgMjkyIDAgUgovSW0y OTMgMjkzIDAgUgovSW0yOTQgMjk0IDAgUgovSW0yOTUgMjk1IDAgUgovSW0y OTYgMjk2IDAgUgovSW0yOTcgMjk3IDAgUgovSW0yOTggMjk4IDAgUgovSW0y OTkgMjk5IDAgUgovSW0zMDAgMzAwIDAgUgovSW0zMDEgMzAxIDAgUgovSW0z MDIgMzAyIDAgUgovSW0zMDMgMzAzIDAgUgovSW0zMDQgMzA0IDAgUgovSW0z MDUgMzA1IDAgUgovSW0zMDYgMzA2IDAgUgovSW0zMDcgMzA3IDAgUgovSW0z MDggMzA4IDAgUgovSW0zMDkgMzA5IDAgUgovSW0zMTAgMzEwIDAgUgovSW0z MTEgMzExIDAgUgovSW0zMTIgMzEyIDAgUgovSW0zMTMgMzEzIDAgUgovSW0z MTQgMzE0IDAgUgovSW0zMTUgMzE1IDAgUgovSW0zMTYgMzE2IDAgUgovSW0z MTcgMzE3IDAgUgovSW0zMTggMzE4IDAgUgovSW0zMTkgMzE5IDAgUgovSW0z MjAgMzIwIDAgUgovSW0zMjEgMzIxIDAgUgovSW0zMjIgMzIyIDAgUgovSW0z MjMgMzIzIDAgUgovSW0zMjQgMzI0IDAgUgovSW0zMjUgMzI1IDAgUgovSW0z MjYgMzI2IDAgUgovSW0zMjcgMzI3IDAgUgovSW0zMjggMzI4IDAgUgovSW0z MjkgMzI5IDAgUgovSW0zMzAgMzMwIDAgUgovSW0zMzEgMzMxIDAgUgovSW0z MzIgMzMyIDAgUgovSW0zMzMgMzMzIDAgUgovSW0zMzQgMzM0IDAgUgovSW0z MzUgMzM1IDAgUgovSW0zMzYgMzM2IDAgUgovSW0zMzcgMzM3IDAgUgovSW0z MzggMzM4IDAgUgovSW0zMzkgMzM5IDAgUgovSW0zNDAgMzQwIDAgUgovSW0z NDEgMzQxIDAgUgovSW0zNDIgMzQyIDAgUgovSW0zNDMgMzQzIDAgUgovSW0z NDQgMzQ0IDAgUgovSW0zNDUgMzQ1IDAgUgovSW0zNDYgMzQ2IDAgUgovSW0z NDcgMzQ3IDAgUgovSW0zNDggMzQ4IDAgUgovSW0zNDkgMzQ5IDAgUgovSW0z NTAgMzUwIDAgUgovSW0zNTEgMzUxIDAgUgovSW0zNTIgMzUyIDAgUgovSW0z NTMgMzUzIDAgUgovSW0zNTQgMzU0IDAgUgovSW0zNTUgMzU1IDAgUgovSW0z NTYgMzU2IDAgUgovSW0zNTcgMzU3IDAgUgovSW0zNTggMzU4IDAgUgovSW0z NTkgMzU5IDAgUgovSW0zNjAgMzYwIDAgUgovSW0zNjEgMzYxIDAgUgovSW0z NjIgMzYyIDAgUgovSW0zNjMgMzYzIDAgUgovSW0zNjQgMzY0IDAgUgovSW0z NjUgMzY1IDAgUgovSW0zNjYgMzY2IDAgUgovSW0zNjcgMzY3IDAgUgovSW0z NjggMzY4IDAgUgovSW0zNjkgMzY5IDAgUgovSW0zNzAgMzcwIDAgUgovSW0z NzEgMzcxIDAgUgovSW0zNzIgMzcyIDAgUgovSW0zNzMgMzczIDAgUgovSW0z NzQgMzc0IDAgUgovSW0zNzUgMzc1IDAgUgovSW0zNzYgMzc2IDAgUgovSW0z NzcgMzc3IDAgUgovSW0zNzggMzc4IDAgUgovSW0zNzkgMzc5IDAgUgovSW0z ODAgMzgwIDAgUgovSW0zODEgMzgxIDAgUgovSW0zODIgMzgyIDAgUgovSW0z ODMgMzgzIDAgUgovSW0zODQgMzg0IDAgUgovSW0zODUgMzg1IDAgUgovSW0z ODYgMzg2IDAgUgovSW0zODcgMzg3IDAgUgovSW0zODggMzg4IDAgUgovSW0z ODkgMzg5IDAgUgovSW0zOTAgMzkwIDAgUgovSW0zOTEgMzkxIDAgUgovSW0z OTIgMzkyIDAgUgovSW0zOTMgMzkzIDAgUgovSW0zOTQgMzk0IDAgUgovSW0z OTUgMzk1IDAgUgovSW0zOTYgMzk2IDAgUgovSW0zOTcgMzk3IDAgUgovSW0z OTggMzk4IDAgUgovSW0zOTkgMzk5IDAgUgovSW00MDAgNDAwIDAgUgovSW00 MDEgNDAxIDAgUgovSW00MDIgNDAyIDAgUgovSW00MDMgNDAzIDAgUgovSW00 MDQgNDA0IDAgUgovSW00MDUgNDA1IDAgUgovSW00MDYgNDA2IDAgUgovSW00 MDcgNDA3IDAgUgovSW00MDggNDA4IDAgUgovSW00MDkgNDA5IDAgUgovSW00 MTAgNDEwIDAgUgovSW00MTEgNDExIDAgUgovSW00MTIgNDEyIDAgUgovSW00 MTMgNDEzIDAgUgovSW00MTQgNDE0IDAgUgovSW00MTUgNDE1IDAgUgovSW00 MTYgNDE2IDAgUgovSW00MTcgNDE3IDAgUgovSW00MTggNDE4IDAgUgovSW00 MTkgNDE5IDAgUgovSW00MjAgNDIwIDAgUgovSW00MjEgNDIxIDAgUgovSW00 MjIgNDIyIDAgUgovSW00MjMgNDIzIDAgUgovSW00MjQgNDI0IDAgUgovSW00 MjUgNDI1IDAgUgovSW00MjYgNDI2IDAgUgovSW00MjcgNDI3IDAgUgovSW00 MjggNDI4IDAgUgovSW00MjkgNDI5IDAgUgovSW00MzAgNDMwIDAgUgovSW00 MzEgNDMxIDAgUgovSW00MzIgNDMyIDAgUgovSW00MzMgNDMzIDAgUgovSW00 MzQgNDM0IDAgUgovSW00MzUgNDM1IDAgUgovSW00MzYgNDM2IDAgUgovSW00 MzcgNDM3IDAgUgovSW00MzggNDM4IDAgUgovSW00MzkgNDM5IDAgUgovSW00 NDAgNDQwIDAgUgovSW00NDEgNDQxIDAgUgovSW00NDIgNDQyIDAgUgovSW00 NDMgNDQzIDAgUgovSW00NDQgNDQ0IDAgUgovSW00NDUgNDQ1IDAgUgovSW00 NDYgNDQ2IDAgUgovSW00NDcgNDQ3IDAgUgovSW00NDggNDQ4IDAgUgovSW00 NDkgNDQ5IDAgUgovSW00NTAgNDUwIDAgUgovSW00NTEgNDUxIDAgUgovSW00 NTIgNDUyIDAgUgovSW00NTMgNDUzIDAgUgovSW00NTQgNDU0IDAgUgovSW00 NTUgNDU1IDAgUgovSW00NTYgNDU2IDAgUgovSW00NTcgNDU3IDAgUgovSW00 NTggNDU4IDAgUgovSW00NTkgNDU5IDAgUgovSW00NjAgNDYwIDAgUgovSW00 NjEgNDYxIDAgUgovSW00NjIgNDYyIDAgUgovSW00NjMgNDYzIDAgUgovSW00 NjQgNDY0IDAgUgovSW00NjUgNDY1IDAgUgovSW00NjYgNDY2IDAgUgovSW00 NjcgNDY3IDAgUgovSW00NjggNDY4IDAgUgovSW00NjkgNDY5IDAgUgovSW00 NzAgNDcwIDAgUgovSW00NzEgNDcxIDAgUgovSW00NzIgNDcyIDAgUgovSW00 NzMgNDczIDAgUgovSW00NzQgNDc0IDAgUgovSW00NzUgNDc1IDAgUgovSW00 NzYgNDc2IDAgUgovSW00NzcgNDc3IDAgUgovSW00NzggNDc4IDAgUgovSW00 NzkgNDc5IDAgUgovSW00ODAgNDgwIDAgUgovSW00ODEgNDgxIDAgUgovSW00 ODIgNDgyIDAgUgovSW00ODMgNDgzIDAgUgovSW00ODQgNDg0IDAgUgovSW00 ODUgNDg1IDAgUgovSW00ODYgNDg2IDAgUgovSW00ODcgNDg3IDAgUgovSW00 ODggNDg4IDAgUgovSW00ODkgNDg5IDAgUgovSW00OTAgNDkwIDAgUgovSW00 OTEgNDkxIDAgUgovSW00OTIgNDkyIDAgUgovSW00OTMgNDkzIDAgUgovSW00 OTQgNDk0IDAgUgovSW00OTUgNDk1IDAgUgovSW00OTYgNDk2IDAgUgovSW00 OTcgNDk3IDAgUgovSW00OTggNDk4IDAgUgovSW00OTkgNDk5IDAgUgovSW01 MDAgNTAwIDAgUgovSW01MDEgNTAxIDAgUgovSW01MDIgNTAyIDAgUgovSW01 MDMgNTAzIDAgUgovSW01MDQgNTA0IDAgUgovSW01MDUgNTA1IDAgUgovSW01 MDYgNTA2IDAgUgovSW01MDcgNTA3IDAgUgovSW01MDggNTA4IDAgUgovSW01 MDkgNTA5IDAgUgovSW01MTAgNTEwIDAgUgovSW01MTEgNTExIDAgUgovSW01 MTIgNTEyIDAgUgovSW01MTMgNTEzIDAgUgovSW01MTQgNTE0IDAgUgovSW01 MTUgNTE1IDAgUgovSW01MTYgNTE2IDAgUgovSW01MTcgNTE3IDAgUgovSW01 MTggNTE4IDAgUgovSW01MTkgNTE5IDAgUgovSW01MjAgNTIwIDAgUgovSW01 MjEgNTIxIDAgUgovSW01MjIgNTIyIDAgUgovSW01MjMgNTIzIDAgUgovSW01 MjQgNTI0IDAgUgovSW01MjUgNTI1IDAgUgovSW01MjYgNTI2IDAgUgovSW01 MjcgNTI3IDAgUgovSW01MjggNTI4IDAgUgovSW01MjkgNTI5IDAgUgovSW01 MzAgNTMwIDAgUgovSW01MzEgNTMxIDAgUgovSW01MzIgNTMyIDAgUgovSW01 MzMgNTMzIDAgUgovSW01MzQgNTM0IDAgUgovSW01MzUgNTM1IDAgUgovSW01 MzYgNTM2IDAgUgovSW01MzcgNTM3IDAgUgovSW01MzggNTM4IDAgUgovSW01 MzkgNTM5IDAgUgovSW01NDAgNTQwIDAgUgovSW01NDEgNTQxIDAgUgovSW01 NDIgNTQyIDAgUgovSW01NDMgNTQzIDAgUgovSW01NDQgNTQ0IDAgUgovSW01 NDUgNTQ1IDAgUgovSW01NDYgNTQ2IDAgUgovSW01NDcgNTQ3IDAgUgovSW01 NDggNTQ4IDAgUgovSW01NDkgNTQ5IDAgUgovSW01NTAgNTUwIDAgUgovSW01 NTEgNTUxIDAgUgovSW01NTIgNTUyIDAgUgovSW01NTMgNTUzIDAgUgovSW01 NTQgNTU0IDAgUgovSW01NTUgNTU1IDAgUgovSW01NTYgNTU2IDAgUgovSW01 NTcgNTU3IDAgUgovSW01NTggNTU4IDAgUgovSW01NTkgNTU5IDAgUgovSW01 NjAgNTYwIDAgUgovSW01NjEgNTYxIDAgUgovSW01NjIgNTYyIDAgUgovSW01 NjMgNTYzIDAgUgovSW01NjQgNTY0IDAgUgovSW01NjUgNTY1IDAgUgovSW01 NjYgNTY2IDAgUgovSW01NjcgNTY3IDAgUgovSW01NjggNTY4IDAgUgovSW01 NjkgNTY5IDAgUgovSW01NzAgNTcwIDAgUgovSW01NzEgNTcxIDAgUgovSW01 NzIgNTcyIDAgUgovSW01NzMgNTczIDAgUgovSW01NzQgNTc0IDAgUgovSW01 NzUgNTc1IDAgUgovSW01NzYgNTc2IDAgUgovSW01NzcgNTc3IDAgUgovSW01 NzggNTc4IDAgUgovSW01NzkgNTc5IDAgUgovSW01ODAgNTgwIDAgUgovSW01 ODEgNTgxIDAgUgovSW01ODIgNTgyIDAgUgovSW01ODMgNTgzIDAgUgovSW01 ODQgNTg0IDAgUgovSW01ODUgNTg1IDAgUgovSW01ODYgNTg2IDAgUgovSW01 ODcgNTg3IDAgUgovSW01ODggNTg4IDAgUgovSW01ODkgNTg5IDAgUgovSW01 OTAgNTkwIDAgUgovSW01OTEgNTkxIDAgUgovSW01OTIgNTkyIDAgUgovSW01 OTMgNTkzIDAgUgovSW01OTQgNTk0IDAgUgovSW01OTUgNTk1IDAgUgovSW01 OTYgNTk2IDAgUgovSW01OTcgNTk3IDAgUgovSW01OTggNTk4IDAgUgovSW01 OTkgNTk5IDAgUgovSW02MDAgNjAwIDAgUgovSW02MDEgNjAxIDAgUgovSW02 MDIgNjAyIDAgUgovSW02MDMgNjAzIDAgUgovSW02MDQgNjA0IDAgUgovSW02 MDUgNjA1IDAgUgovSW02MDYgNjA2IDAgUgovSW02MDcgNjA3IDAgUgovSW02 MDggNjA4IDAgUgovSW02MDkgNjA5IDAgUgovSW02MTAgNjEwIDAgUgovSW02 MTEgNjExIDAgUgovSW02MTIgNjEyIDAgUgovSW02MTMgNjEzIDAgUgovSW02 MTQgNjE0IDAgUgovSW02MTUgNjE1IDAgUgovSW02MTYgNjE2IDAgUgovSW02 MTcgNjE3IDAgUgovSW02MTggNjE4IDAgUgovSW02MTkgNjE5IDAgUgovSW02 MjAgNjIwIDAgUgovSW02MjEgNjIxIDAgUgovSW02MjIgNjIyIDAgUgovSW02 MjMgNjIzIDAgUgovSW02MjQgNjI0IDAgUgovSW02MjUgNjI1IDAgUgovSW02 MjYgNjI2IDAgUgovSW02MjcgNjI3IDAgUgovSW02MjggNjI4IDAgUgovSW02 MjkgNjI5IDAgUgovSW02MzAgNjMwIDAgUgovSW02MzEgNjMxIDAgUgovSW02 MzIgNjMyIDAgUgovSW02MzMgNjMzIDAgUgovSW02MzQgNjM0IDAgUgovSW02 MzUgNjM1IDAgUgovSW02MzYgNjM2IDAgUgovSW02MzcgNjM3IDAgUgovSW02 MzggNjM4IDAgUgovSW02MzkgNjM5IDAgUgovSW02NDAgNjQwIDAgUgovSW02 NDEgNjQxIDAgUgovSW02NDIgNjQyIDAgUgovSW02NDMgNjQzIDAgUgovSW02 NDQgNjQ0IDAgUgovSW02NDUgNjQ1IDAgUgovSW02NDYgNjQ2IDAgUgovSW02 NDcgNjQ3IDAgUgovSW02NDggNjQ4IDAgUgovSW02NDkgNjQ5IDAgUgovSW02 NTAgNjUwIDAgUgovSW02NTEgNjUxIDAgUgovSW02NTIgNjUyIDAgUgovSW02 NTMgNjUzIDAgUgovSW02NTQgNjU0IDAgUgovSW02NTUgNjU1IDAgUgovSW02 NTYgNjU2IDAgUgovSW02NTcgNjU3IDAgUgovSW02NTggNjU4IDAgUgovSW02 NTkgNjU5IDAgUgovSW02NjAgNjYwIDAgUgovSW02NjEgNjYxIDAgUgovSW02 NjIgNjYyIDAgUgovSW02NjMgNjYzIDAgUgovSW02NjQgNjY0IDAgUgovSW02 NjUgNjY1IDAgUgovSW02NjYgNjY2IDAgUgovSW02NjcgNjY3IDAgUgovSW02 NjggNjY4IDAgUgovSW02NjkgNjY5IDAgUgovSW02NzAgNjcwIDAgUgovSW02 NzEgNjcxIDAgUgovSW02NzIgNjcyIDAgUgovSW02NzMgNjczIDAgUgovSW02 NzQgNjc0IDAgUgovSW02NzUgNjc1IDAgUgovSW02NzYgNjc2IDAgUgovSW02 NzcgNjc3IDAgUgovSW02NzggNjc4IDAgUgovSW02NzkgNjc5IDAgUgovSW02 ODAgNjgwIDAgUgovSW02ODEgNjgxIDAgUgovSW02ODIgNjgyIDAgUgovSW02 ODMgNjgzIDAgUgovSW02ODQgNjg0IDAgUgovSW02ODUgNjg1IDAgUgovSW02 ODYgNjg2IDAgUgovSW02ODcgNjg3IDAgUgovSW02ODggNjg4IDAgUgovSW02 ODkgNjg5IDAgUgovSW02OTAgNjkwIDAgUgovSW02OTEgNjkxIDAgUgovSW02 OTIgNjkyIDAgUgovSW02OTMgNjkzIDAgUgovSW02OTQgNjk0IDAgUgovSW02 OTUgNjk1IDAgUgovSW02OTYgNjk2IDAgUgovSW02OTcgNjk3IDAgUgovSW02 OTggNjk4IDAgUgovSW02OTkgNjk5IDAgUgovSW03MDAgNzAwIDAgUgovSW03 MDEgNzAxIDAgUgovSW03MDIgNzAyIDAgUgovSW03MDMgNzAzIDAgUgovSW03 MDQgNzA0IDAgUgovSW03MDUgNzA1IDAgUgovSW03MDYgNzA2IDAgUgovSW03 MDcgNzA3IDAgUgovSW03MDggNzA4IDAgUgovSW03MDkgNzA5IDAgUgovSW03 MTAgNzEwIDAgUgovSW03MTEgNzExIDAgUgovSW03MTIgNzEyIDAgUgovSW03 MTMgNzEzIDAgUgovSW03MTQgNzE0IDAgUgovSW03MTUgNzE1IDAgUgovSW03 MTYgNzE2IDAgUgovSW03MTcgNzE3IDAgUgovSW03MTggNzE4IDAgUgovSW03 MTkgNzE5IDAgUgovSW03MjAgNzIwIDAgUgovSW03MjEgNzIxIDAgUgovSW03 MjIgNzIyIDAgUgovSW03MjMgNzIzIDAgUgovSW03MjQgNzI0IDAgUgovSW03 MjUgNzI1IDAgUgovSW03MjYgNzI2IDAgUgovSW03MjcgNzI3IDAgUgovSW03 MjggNzI4IDAgUgovSW03MjkgNzI5IDAgUgovSW03MzAgNzMwIDAgUgovSW03 MzEgNzMxIDAgUgovSW03MzIgNzMyIDAgUgovSW03MzMgNzMzIDAgUgovSW03 MzQgNzM0IDAgUgovSW03MzUgNzM1IDAgUgovSW03MzYgNzM2IDAgUgovSW03 MzcgNzM3IDAgUgovSW03MzggNzM4IDAgUgovSW03MzkgNzM5IDAgUgovSW03 NDAgNzQwIDAgUgovSW03NDEgNzQxIDAgUgovSW03NDIgNzQyIDAgUgovSW03 NDMgNzQzIDAgUgovSW03NDQgNzQ0IDAgUgovSW03NDUgNzQ1IDAgUgovSW03 NDYgNzQ2IDAgUgovSW03NDcgNzQ3IDAgUgovSW03NDggNzQ4IDAgUgovSW03 NDkgNzQ5IDAgUgovSW03NTAgNzUwIDAgUgovSW03NTEgNzUxIDAgUgovSW03 NTIgNzUyIDAgUgovSW03NTMgNzUzIDAgUgovSW03NTQgNzU0IDAgUgovSW03 NTUgNzU1IDAgUgovSW03NTYgNzU2IDAgUgovSW03NTcgNzU3IDAgUgovSW03 NTggNzU4IDAgUgovSW03NTkgNzU5IDAgUgovSW03NjAgNzYwIDAgUgovSW03 NjEgNzYxIDAgUgovSW03NjIgNzYyIDAgUgovSW03NjMgNzYzIDAgUgovSW03 NjQgNzY0IDAgUgovSW03NjUgNzY1IDAgUgovSW03NjYgNzY2IDAgUgovSW03 NjcgNzY3IDAgUgovSW03NjggNzY4IDAgUgovSW03NjkgNzY5IDAgUgovSW03 NzAgNzcwIDAgUgovSW03NzEgNzcxIDAgUgovSW03NzIgNzcyIDAgUgovSW03 NzMgNzczIDAgUgovSW03NzQgNzc0IDAgUgovSW03NzUgNzc1IDAgUgovSW03 NzYgNzc2IDAgUgovSW03NzcgNzc3IDAgUgovSW03NzggNzc4IDAgUgovSW03 NzkgNzc5IDAgUgovSW03ODAgNzgwIDAgUgovSW03ODEgNzgxIDAgUgovSW03 ODIgNzgyIDAgUgovSW03ODMgNzgzIDAgUgovSW03ODQgNzg0IDAgUgovSW03 ODUgNzg1IDAgUgovSW03ODYgNzg2IDAgUgovSW03ODcgNzg3IDAgUgovSW03 ODggNzg4IDAgUgovSW03ODkgNzg5IDAgUgovSW03OTAgNzkwIDAgUgovSW03 OTEgNzkxIDAgUgovSW03OTIgNzkyIDAgUgovSW03OTMgNzkzIDAgUgovSW03 OTQgNzk0IDAgUgovSW03OTUgNzk1IDAgUgovSW03OTYgNzk2IDAgUgovSW03 OTcgNzk3IDAgUgovSW03OTggNzk4IDAgUgovSW03OTkgNzk5IDAgUgovSW04 MDAgODAwIDAgUgovSW04MDEgODAxIDAgUgovSW04MDIgODAyIDAgUgovSW04 MDMgODAzIDAgUgovSW04MDQgODA0IDAgUgovSW04MDUgODA1IDAgUgovSW04 MDYgODA2IDAgUgovSW04MDcgODA3IDAgUgovSW04MDggODA4IDAgUgovSW04 MDkgODA5IDAgUgovSW04MTAgODEwIDAgUgovSW04MTEgODExIDAgUgovSW04 MTIgODEyIDAgUgovSW04MTMgODEzIDAgUgovSW04MTQgODE0IDAgUgovSW04 MTUgODE1IDAgUgovSW04MTYgODE2IDAgUgovSW04MTcgODE3IDAgUgovSW04 MTggODE4IDAgUgovSW04MTkgODE5IDAgUgovSW04MjAgODIwIDAgUgovSW04 MjEgODIxIDAgUgovSW04MjIgODIyIDAgUgovSW04MjMgODIzIDAgUgovSW04 MjQgODI0IDAgUgovSW04MjUgODI1IDAgUgovSW04MjYgODI2IDAgUgovSW04 MjcgODI3IDAgUgovSW04MjggODI4IDAgUgovSW04MjkgODI5IDAgUgovSW04 MzAgODMwIDAgUgovSW04MzEgODMxIDAgUgovSW04MzIgODMyIDAgUgovSW04 MzMgODMzIDAgUgovSW04MzQgODM0IDAgUgovSW04MzUgODM1IDAgUgovSW04 MzYgODM2IDAgUgovSW04MzcgODM3IDAgUgovSW04MzggODM4IDAgUgovSW04 MzkgODM5IDAgUgovSW04NDAgODQwIDAgUgovSW04NDEgODQxIDAgUgovSW04 NDIgODQyIDAgUgovSW04NDMgODQzIDAgUgovSW04NDQgODQ0IDAgUgovSW04 NDUgODQ1IDAgUgovSW04NDYgODQ2IDAgUgovSW04NDcgODQ3IDAgUgovSW04 NDggODQ4IDAgUgovSW04NDkgODQ5IDAgUgovSW04NTAgODUwIDAgUgovSW04 NTEgODUxIDAgUgovSW04NTIgODUyIDAgUgovSW04NTMgODUzIDAgUgovSW04 NTQgODU0IDAgUgovSW04NTUgODU1IDAgUgovSW04NTYgODU2IDAgUgovSW04 NTcgODU3IDAgUgovSW04NTggODU4IDAgUgovSW04NTkgODU5IDAgUgovSW04 NjAgODYwIDAgUgovSW04NjEgODYxIDAgUgovSW04NjIgODYyIDAgUgovSW04 NjMgODYzIDAgUgovSW04NjQgODY0IDAgUgovSW04NjUgODY1IDAgUgovSW04 NjYgODY2IDAgUgovSW04NjcgODY3IDAgUgovSW04NjggODY4IDAgUgovSW04 NjkgODY5IDAgUgovSW04NzAgODcwIDAgUgovSW04NzEgODcxIDAgUgovSW04 NzIgODcyIDAgUgovSW04NzMgODczIDAgUgovSW04NzQgODc0IDAgUgovSW04 NzUgODc1IDAgUgovSW04NzYgODc2IDAgUgovSW04NzcgODc3IDAgUgovSW04 NzggODc4IDAgUgovSW04NzkgODc5IDAgUgovSW04ODAgODgwIDAgUgovSW04 ODEgODgxIDAgUgovSW04ODIgODgyIDAgUgovSW04ODMgODgzIDAgUgovSW04 ODQgODg0IDAgUgovSW04ODUgODg1IDAgUgovSW04ODYgODg2IDAgUgovSW04 ODcgODg3IDAgUgovSW04ODggODg4IDAgUgovSW04ODkgODg5IDAgUgovSW04 OTAgODkwIDAgUgovSW04OTEgODkxIDAgUgovSW04OTIgODkyIDAgUgovSW04 OTMgODkzIDAgUgovSW04OTQgODk0IDAgUgovSW04OTUgODk1IDAgUgovSW04 OTYgODk2IDAgUgovSW04OTcgODk3IDAgUgovSW04OTggODk4IDAgUgovSW04 OTkgODk5IDAgUgovSW05MDAgOTAwIDAgUgovSW05MDEgOTAxIDAgUgovSW05 MDIgOTAyIDAgUgovSW05MDMgOTAzIDAgUgovSW05MDQgOTA0IDAgUgovSW05 MDUgOTA1IDAgUgovSW05MDYgOTA2IDAgUgovSW05MDcgOTA3IDAgUgovSW05 MDggOTA4IDAgUgovSW05MDkgOTA5IDAgUgovSW05MTAgOTEwIDAgUgovSW05 MTEgOTExIDAgUgovSW05MTIgOTEyIDAgUgovSW05MTMgOTEzIDAgUgovSW05 MTQgOTE0IDAgUgovSW05MTUgOTE1IDAgUgovSW05MTYgOTE2IDAgUgovSW05 MTcgOTE3IDAgUgovSW05MTggOTE4IDAgUgovSW05MTkgOTE5IDAgUgovSW05 MjAgOTIwIDAgUgovSW05MjEgOTIxIDAgUgovSW05MjIgOTIyIDAgUgovSW05 MjMgOTIzIDAgUgovSW05MjQgOTI0IDAgUgovSW05MjUgOTI1IDAgUgovSW05 MjYgOTI2IDAgUgovSW05MjcgOTI3IDAgUgovSW05MjggOTI4IDAgUgovSW05 MjkgOTI5IDAgUgovSW05MzAgOTMwIDAgUgovSW05MzEgOTMxIDAgUgovSW05 MzIgOTMyIDAgUgovSW05MzMgOTMzIDAgUgovSW05MzQgOTM0IDAgUgovSW05 MzUgOTM1IDAgUgovSW05MzYgOTM2IDAgUgovSW05MzcgOTM3IDAgUgovSW05 MzggOTM4IDAgUgovSW05MzkgOTM5IDAgUgovSW05NDAgOTQwIDAgUgovSW05 NDEgOTQxIDAgUgovSW05NDIgOTQyIDAgUgovSW05NDMgOTQzIDAgUgovSW05 NDQgOTQ0IDAgUgovSW05NDUgOTQ1IDAgUgovSW05NDYgOTQ2IDAgUgovSW05 NDcgOTQ3IDAgUgovSW05NDggOTQ4IDAgUgovSW05NDkgOTQ5IDAgUgovSW05 NTAgOTUwIDAgUgovSW05NTEgOTUxIDAgUgovSW05NTIgOTUyIDAgUgovSW05 NTMgOTUzIDAgUgovSW05NTQgOTU0IDAgUgovSW05NTUgOTU1IDAgUgovSW05 NTYgOTU2IDAgUgovSW05NTcgOTU3IDAgUgovSW05NTggOTU4IDAgUgovSW05 NTkgOTU5IDAgUgovSW05NjAgOTYwIDAgUgovSW05NjEgOTYxIDAgUgovSW05 NjIgOTYyIDAgUgovSW05NjMgOTYzIDAgUgovSW05NjQgOTY0IDAgUgovSW05 NjUgOTY1IDAgUgovSW05NjYgOTY2IDAgUgovSW05NjcgOTY3IDAgUgovSW05 NjggOTY4IDAgUgovSW05NjkgOTY5IDAgUgovSW05NzAgOTcwIDAgUgovSW05 NzEgOTcxIDAgUgovSW05NzIgOTcyIDAgUgovSW05NzMgOTczIDAgUgovSW05 NzQgOTc0IDAgUgovSW05NzUgOTc1IDAgUgovSW05NzYgOTc2IDAgUgovSW05 NzcgOTc3IDAgUgovSW05NzggOTc4IDAgUgovSW05NzkgOTc5IDAgUgovSW05 ODAgOTgwIDAgUgovSW05ODEgOTgxIDAgUgovSW05ODIgOTgyIDAgUgovSW05 ODMgOTgzIDAgUgovSW05ODQgOTg0IDAgUgovSW05ODUgOTg1IDAgUgovSW05 ODYgOTg2IDAgUgovSW05ODcgOTg3IDAgUgovSW05ODggOTg4IDAgUgovSW05 ODkgOTg5IDAgUgovSW05OTAgOTkwIDAgUgovSW05OTEgOTkxIDAgUgovSW05 OTIgOTkyIDAgUgovSW05OTMgOTkzIDAgUgovSW05OTQgOTk0IDAgUgovSW05 OTUgOTk1IDAgUgovSW05OTYgOTk2IDAgUgovSW05OTcgOTk3IDAgUgovSW05 OTggOTk4IDAgUgovSW05OTkgOTk5IDAgUgovSW0xMDAwIDEwMDAgMCBSCi9J bTEwMDEgMTAwMSAwIFIKL0ltMTAwMiAxMDAyIDAgUgovSW0xMDAzIDEwMDMg MCBSCi9JbTEwMDQgMTAwNCAwIFIKL0ltMTAwNSAxMDA1IDAgUgovSW0xMDA2 IDEwMDYgMCBSCi9JbTEwMDcgMTAwNyAwIFIKL0ltMTAwOCAxMDA4IDAgUgov SW0xMDA5IDEwMDkgMCBSCi9JbTEwMTAgMTAxMCAwIFIKL0ltMTAxMSAxMDEx IDAgUgovSW0xMDEyIDEwMTIgMCBSCi9JbTEwMTMgMTAxMyAwIFIKL0ltMTAx NCAxMDE0IDAgUgovSW0xMDE1IDEwMTUgMCBSCi9JbTEwMTYgMTAxNiAwIFIK L0ltMTAxNyAxMDE3IDAgUgovSW0xMDE4IDEwMTggMCBSCi9JbTEwMTkgMTAx OSAwIFIKL0ltMTAyMCAxMDIwIDAgUgovSW0xMDIxIDEwMjEgMCBSCi9JbTEw MjIgMTAyMiAwIFIKL0ltMTAyMyAxMDIzIDAgUgovSW0xMDI0IDEwMjQgMCBS Ci9JbTEwMjUgMTAyNSAwIFIKL0ltMTAyNiAxMDI2IDAgUgovSW0xMDI3IDEw MjcgMCBSCi9JbTEwMjggMTAyOCAwIFIKL0ltMTAyOSAxMDI5IDAgUgovSW0x MDMwIDEwMzAgMCBSCi9JbTEwMzEgMTAzMSAwIFIKL0ltMTAzMiAxMDMyIDAg UgovSW0xMDMzIDEwMzMgMCBSCi9JbTEwMzQgMTAzNCAwIFIKL0ltMTAzNSAx MDM1IDAgUgovSW0xMDM2IDEwMzYgMCBSCi9JbTEwMzcgMTAzNyAwIFIKL0lt MTAzOCAxMDM4IDAgUgovSW0xMDM5IDEwMzkgMCBSCi9JbTEwNDAgMTA0MCAw IFIKL0ltMTA0MSAxMDQxIDAgUgovSW0xMDQyIDEwNDIgMCBSCi9JbTEwNDMg MTA0MyAwIFIKL0ltMTA0NCAxMDQ0IDAgUgovSW0xMDQ1IDEwNDUgMCBSCi9J bTEwNDYgMTA0NiAwIFIKL0ltMTA0NyAxMDQ3IDAgUgovSW0xMDQ4IDEwNDgg MCBSCi9JbTEwNDkgMTA0OSAwIFIKL0ltMTA1MCAxMDUwIDAgUgovSW0xMDUx IDEwNTEgMCBSCi9JbTEwNTIgMTA1MiAwIFIKL0ltMTA1MyAxMDUzIDAgUgov SW0xMDU0IDEwNTQgMCBSCi9JbTEwNTUgMTA1NSAwIFIKL0ltMTA1NiAxMDU2 IDAgUgovSW0xMDU3IDEwNTcgMCBSCi9JbTEwNTggMTA1OCAwIFIKL0ltMTA1 OSAxMDU5IDAgUgovSW0xMDYwIDEwNjAgMCBSCi9JbTEwNjEgMTA2MSAwIFIK L0ltMTA2MiAxMDYyIDAgUgovSW0xMDYzIDEwNjMgMCBSCi9JbTEwNjQgMTA2 NCAwIFIKL0ltMTA2NSAxMDY1IDAgUgovSW0xMDY2IDEwNjYgMCBSCi9JbTEw NjcgMTA2NyAwIFIKL0ltMTA2OCAxMDY4IDAgUgovSW0xMDY5IDEwNjkgMCBS Ci9JbTEwNzAgMTA3MCAwIFIKL0ltMTA3MSAxMDcxIDAgUgovSW0xMDcyIDEw NzIgMCBSCi9JbTEwNzMgMTA3MyAwIFIKL0ltMTA3NCAxMDc0IDAgUgovSW0x MDc1IDEwNzUgMCBSCi9JbTEwNzYgMTA3NiAwIFIKL0ltMTA3NyAxMDc3IDAg UgovSW0xMDc4IDEwNzggMCBSCi9JbTEwNzkgMTA3OSAwIFIKL0ltMTA4MCAx MDgwIDAgUgovSW0xMDgxIDEwODEgMCBSCi9JbTEwODIgMTA4MiAwIFIKL0lt MTA4MyAxMDgzIDAgUgovSW0xMDg0IDEwODQgMCBSCi9JbTEwODUgMTA4NSAw IFIKL0ltMTA4NiAxMDg2IDAgUgovSW0xMDg3IDEwODcgMCBSCi9JbTEwODgg MTA4OCAwIFIKL0ltMTA4OSAxMDg5IDAgUgovSW0xMDkwIDEwOTAgMCBSCi9J bTEwOTEgMTA5MSAwIFIKL0ltMTA5MiAxMDkyIDAgUgovSW0xMDkzIDEwOTMg MCBSCi9JbTEwOTQgMTA5NCAwIFIKL0ltMTA5NSAxMDk1IDAgUgovSW0xMDk2 IDEwOTYgMCBSCi9JbTEwOTcgMTA5NyAwIFIKL0ltMTA5OCAxMDk4IDAgUgov SW0xMDk5IDEwOTkgMCBSCi9JbTExMDAgMTEwMCAwIFIKL0ltMTEwMSAxMTAx IDAgUgovSW0xMTAyIDExMDIgMCBSCi9JbTExMDMgMTEwMyAwIFIKL0ltMTEw NCAxMTA0IDAgUgovSW0xMTA1IDExMDUgMCBSCi9JbTExMDYgMTEwNiAwIFIK L0ltMTEwNyAxMTA3IDAgUgovSW0xMTA4IDExMDggMCBSCi9JbTExMDkgMTEw OSAwIFIKL0ltMTExMCAxMTEwIDAgUgovSW0xMTExIDExMTEgMCBSCi9JbTEx MTIgMTExMiAwIFIKL0ltMTExMyAxMTEzIDAgUgovSW0xMTE0IDExMTQgMCBS Ci9JbTExMTUgMTExNSAwIFIKL0ltMTExNiAxMTE2IDAgUgovSW0xMTE3IDEx MTcgMCBSCi9JbTExMTggMTExOCAwIFIKL0ltMTExOSAxMTE5IDAgUgovSW0x MTIwIDExMjAgMCBSCi9JbTExMjEgMTEyMSAwIFIKL0ltMTEyMiAxMTIyIDAg UgovSW0xMTIzIDExMjMgMCBSCi9JbTExMjQgMTEyNCAwIFIKL0ltMTEyNSAx MTI1IDAgUgovSW0xMTI2IDExMjYgMCBSCi9JbTExMjcgMTEyNyAwIFIKL0lt MTEyOCAxMTI4IDAgUgovSW0xMTI5IDExMjkgMCBSCi9JbTExMzAgMTEzMCAw IFIKL0ltMTEzMSAxMTMxIDAgUgovSW0xMTMyIDExMzIgMCBSCi9JbTExMzMg MTEzMyAwIFIKL0ltMTEzNCAxMTM0IDAgUgovSW0xMTM1IDExMzUgMCBSCi9J bTExMzYgMTEzNiAwIFIKL0ltMTEzNyAxMTM3IDAgUgovSW0xMTM4IDExMzgg MCBSCi9JbTExMzkgMTEzOSAwIFIKL0ltMTE0MCAxMTQwIDAgUgovSW0xMTQx IDExNDEgMCBSCi9JbTExNDIgMTE0MiAwIFIKL0ltMTE0MyAxMTQzIDAgUgov SW0xMTQ0IDExNDQgMCBSCi9JbTExNDUgMTE0NSAwIFIKL0ltMTE0NiAxMTQ2 IDAgUgovSW0xMTQ3IDExNDcgMCBSCi9JbTExNDggMTE0OCAwIFIKL0ltMTE0 OSAxMTQ5IDAgUgovSW0xMTUwIDExNTAgMCBSCi9JbTExNTEgMTE1MSAwIFIK L0ltMTE1MiAxMTUyIDAgUgovSW0xMTUzIDExNTMgMCBSCi9JbTExNTQgMTE1 NCAwIFIKL0ltMTE1NSAxMTU1IDAgUgovSW0xMTU2IDExNTYgMCBSCi9JbTEx NTcgMTE1NyAwIFIKL0ltMTE1OCAxMTU4IDAgUgovSW0xMTU5IDExNTkgMCBS Ci9JbTExNjAgMTE2MCAwIFIKL0ltMTE2MSAxMTYxIDAgUgovSW0xMTYyIDEx NjIgMCBSCi9JbTExNjMgMTE2MyAwIFIKL0ltMTE2NCAxMTY0IDAgUgovSW0x MTY1IDExNjUgMCBSCi9JbTExNjYgMTE2NiAwIFIKL0ltMTE2NyAxMTY3IDAg UgovSW0xMTY4IDExNjggMCBSCi9JbTExNjkgMTE2OSAwIFIKL0ltMTE3MCAx MTcwIDAgUgovSW0xMTcxIDExNzEgMCBSCi9JbTExNzIgMTE3MiAwIFIKL0lt MTE3MyAxMTczIDAgUgovSW0xMTc0IDExNzQgMCBSCi9JbTExNzUgMTE3NSAw IFIKL0ltMTE3NiAxMTc2IDAgUgovSW0xMTc3IDExNzcgMCBSCi9JbTExNzgg MTE3OCAwIFIKL0ltMTE3OSAxMTc5IDAgUgovSW0xMTgwIDExODAgMCBSCi9J bTExODEgMTE4MSAwIFIKL0ltMTE4MiAxMTgyIDAgUgovSW0xMTgzIDExODMg MCBSCi9JbTExODQgMTE4NCAwIFIKL0ltMTE4NSAxMTg1IDAgUgovSW0xMTg2 IDExODYgMCBSCi9JbTExODcgMTE4NyAwIFIKL0ltMTE4OCAxMTg4IDAgUgov SW0xMTg5IDExODkgMCBSCi9JbTExOTAgMTE5MCAwIFIKL0ltMTE5MSAxMTkx IDAgUgovSW0xMTkyIDExOTIgMCBSCi9JbTExOTMgMTE5MyAwIFIKL0ltMTE5 NCAxMTk0IDAgUgovSW0xMTk1IDExOTUgMCBSCi9JbTExOTYgMTE5NiAwIFIK L0ltMTE5NyAxMTk3IDAgUgovSW0xMTk4IDExOTggMCBSCi9JbTExOTkgMTE5 OSAwIFIKL0ltMTIwMCAxMjAwIDAgUgovSW0xMjAxIDEyMDEgMCBSCi9JbTEy MDIgMTIwMiAwIFIKL0ltMTIwMyAxMjAzIDAgUgovSW0xMjA0IDEyMDQgMCBS Ci9JbTEyMDUgMTIwNSAwIFIKL0ltMTIwNiAxMjA2IDAgUgovSW0xMjA3IDEy MDcgMCBSCi9JbTEyMDggMTIwOCAwIFIKL0ltMTIwOSAxMjA5IDAgUgovSW0x MjEwIDEyMTAgMCBSCi9JbTEyMTEgMTIxMSAwIFIKL0ltMTIxNSAxMjE1IDAg UgovSW0xMjIyIDEyMjIgMCBSCi9JbTEyMjMgMTIyMyAwIFIKL0ltMTIyNCAx MjI0IDAgUgovSW0xMjI1IDEyMjUgMCBSCi9JbTEyMjYgMTIyNiAwIFIKL0lt MTIyNyAxMjI3IDAgUgovSW0xMjI4IDEyMjggMCBSCi9JbTEyMjkgMTIyOSAw IFIKL0ltMTIzMCAxMjMwIDAgUgovSW0xMjMxIDEyMzEgMCBSCi9JbTEyMzIg MTIzMiAwIFIKL0ltMTIzMyAxMjMzIDAgUgovSW0xMjM0IDEyMzQgMCBSCi9J bTEyMzUgMTIzNSAwIFIKL0ltMTIzNiAxMjM2IDAgUgovSW0xMjM3IDEyMzcg MCBSCi9JbTEyMzggMTIzOCAwIFIKL0ltMTIzOSAxMjM5IDAgUgovSW0xMjQw IDEyNDAgMCBSCi9JbTEyNDEgMTI0MSAwIFIKL0ltMTI0MiAxMjQyIDAgUgov SW0xMjQzIDEyNDMgMCBSCi9JbTEyNDQgMTI0NCAwIFIKL0ltMTI0NSAxMjQ1 IDAgUgovSW0xMjQ2IDEyNDYgMCBSCi9JbTEyNDcgMTI0NyAwIFIKL0ltMTI0 OCAxMjQ4IDAgUgovSW0xMjQ5IDEyNDkgMCBSCi9JbTEyNTAgMTI1MCAwIFIK L0ltMTI1MSAxMjUxIDAgUgovSW0xMjUyIDEyNTIgMCBSCi9JbTEyNTMgMTI1 MyAwIFIKL0ltMTI1NCAxMjU0IDAgUgovSW0xMjU1IDEyNTUgMCBSCi9JbTEy NTYgMTI1NiAwIFIKL0ltMTI1NyAxMjU3IDAgUgovSW0xMjU4IDEyNTggMCBS Ci9JbTEyNTkgMTI1OSAwIFIKL0ltMTI2MCAxMjYwIDAgUgovSW0xMjYxIDEy NjEgMCBSCi9JbTEyNjIgMTI2MiAwIFIKL0ltMTI2MyAxMjYzIDAgUgovSW0x MjY0IDEyNjQgMCBSCi9JbTEyNjUgMTI2NSAwIFIKL0ltMTI2NiAxMjY2IDAg UgovSW0xMjY3IDEyNjcgMCBSCi9JbTEyNjggMTI2OCAwIFIKL0ltMTI2OSAx MjY5IDAgUgovSW0xMjcwIDEyNzAgMCBSCi9JbTEyNzEgMTI3MSAwIFIKL0lt MTI3MiAxMjcyIDAgUgovSW0xMjczIDEyNzMgMCBSCi9JbTEyNzQgMTI3NCAw IFIKL0ltMTI3NSAxMjc1IDAgUgovSW0xMjc2IDEyNzYgMCBSCi9JbTEyNzcg MTI3NyAwIFIKL0ltMTI3OCAxMjc4IDAgUgovSW0xMjc5IDEyNzkgMCBSCi9J bTEyODAgMTI4MCAwIFIKL0ltMTI4MSAxMjgxIDAgUgovSW0xMjgyIDEyODIg MCBSCi9JbTEyODMgMTI4MyAwIFIKL0ltMTI4NCAxMjg0IDAgUgovSW0xMjg1 IDEyODUgMCBSCi9JbTEyODYgMTI4NiAwIFIKL0ltMTI4NyAxMjg3IDAgUgov SW0xMjg4IDEyODggMCBSCi9JbTEyODkgMTI4OSAwIFIKL0ltMTI5MCAxMjkw IDAgUgovSW0xMjkxIDEyOTEgMCBSCi9JbTEyOTIgMTI5MiAwIFIKL0ltMTI5 MyAxMjkzIDAgUgovSW0xMjk0IDEyOTQgMCBSCi9JbTEyOTUgMTI5NSAwIFIK L0ltMTI5NiAxMjk2IDAgUgovSW0xMjk3IDEyOTcgMCBSCi9JbTEyOTggMTI5 OCAwIFIKL0ltMTI5OSAxMjk5IDAgUgovSW0xMzAwIDEzMDAgMCBSCi9JbTEz MDEgMTMwMSAwIFIKL0ltMTMwMiAxMzAyIDAgUgovSW0xMzAzIDEzMDMgMCBS Ci9JbTEzMDQgMTMwNCAwIFIKL0ltMTMwNSAxMzA1IDAgUgovSW0xMzA2IDEz MDYgMCBSCi9JbTEzMDcgMTMwNyAwIFIKL0ltMTMwOCAxMzA4IDAgUgovSW0x MzA5IDEzMDkgMCBSCi9JbTEzMTAgMTMxMCAwIFIKL0ltMTMxMSAxMzExIDAg UgovSW0xMzEyIDEzMTIgMCBSCi9JbTEzMTMgMTMxMyAwIFIKL0ltMTMxNCAx MzE0IDAgUgovSW0xMzE1IDEzMTUgMCBSCi9JbTEzMTYgMTMxNiAwIFIKL0lt MTMxNyAxMzE3IDAgUgovSW0xMzE4IDEzMTggMCBSCi9JbTEzMTkgMTMxOSAw IFIKL0ltMTMyMCAxMzIwIDAgUgovSW0xMzIxIDEzMjEgMCBSCi9JbTEzMjIg MTMyMiAwIFIKL0ltMTMyMyAxMzIzIDAgUgovSW0xMzI0IDEzMjQgMCBSCi9J bTEzMjUgMTMyNSAwIFIKL0ltMTMyNiAxMzI2IDAgUgovSW0xMzI3IDEzMjcg MCBSCi9JbTEzMjggMTMyOCAwIFIKL0ltMTMyOSAxMzI5IDAgUgovSW0xMzMw IDEzMzAgMCBSCi9JbTEzMzEgMTMzMSAwIFIKL0ltMTMzMiAxMzMyIDAgUgov SW0xMzMzIDEzMzMgMCBSCi9JbTEzMzQgMTMzNCAwIFIKL0ltMTMzNSAxMzM1 IDAgUgovSW0xMzM2IDEzMzYgMCBSCi9JbTEzMzcgMTMzNyAwIFIKL0ltMTMz OCAxMzM4IDAgUgovSW0xMzM5IDEzMzkgMCBSCi9JbTEzNDAgMTM0MCAwIFIK L0ltMTM0MSAxMzQxIDAgUgovSW0xMzQyIDEzNDIgMCBSCi9JbTEzNDMgMTM0 MyAwIFIKL0ltMTM0NCAxMzQ0IDAgUgovSW0xMzQ1IDEzNDUgMCBSCi9JbTEz NDYgMTM0NiAwIFIKL0ltMTM0NyAxMzQ3IDAgUgovSW0xMzQ4IDEzNDggMCBS Ci9JbTEzNDkgMTM0OSAwIFIKL0ltMTM1MCAxMzUwIDAgUgovSW0xMzUxIDEz NTEgMCBSCi9JbTEzNTIgMTM1MiAwIFIKL0ltMTM1MyAxMzUzIDAgUgovSW0x MzU0IDEzNTQgMCBSCi9JbTEzNTUgMTM1NSAwIFIKL0ltMTM1NiAxMzU2IDAg UgovSW0xMzU3IDEzNTcgMCBSCi9JbTEzNTggMTM1OCAwIFIKL0ltMTM1OSAx MzU5IDAgUgovSW0xMzYwIDEzNjAgMCBSCi9JbTEzNjEgMTM2MSAwIFIKL0lt MTM2MiAxMzYyIDAgUgovSW0xMzYzIDEzNjMgMCBSCi9JbTEzNjQgMTM2NCAw IFIKL0ltMTM2NSAxMzY1IDAgUgovSW0xMzY2IDEzNjYgMCBSCi9JbTEzNjcg MTM2NyAwIFIKL0ltMTM2OCAxMzY4IDAgUgovSW0xMzY5IDEzNjkgMCBSCi9J bTEzNzAgMTM3MCAwIFIKL0ltMTM3MSAxMzcxIDAgUgovSW0xMzcyIDEzNzIg MCBSCi9JbTEzNzMgMTM3MyAwIFIKL0ltMTM3NCAxMzc0IDAgUgovSW0xMzc1 IDEzNzUgMCBSCi9JbTEzNzYgMTM3NiAwIFIKL0ltMTM3NyAxMzc3IDAgUgov SW0xMzc4IDEzNzggMCBSCi9JbTEzNzkgMTM3OSAwIFIKL0ltMTM4MCAxMzgw IDAgUgovSW0xMzgxIDEzODEgMCBSCi9JbTEzODIgMTM4MiAwIFIKL0ltMTM4 MyAxMzgzIDAgUgovSW0xMzg0IDEzODQgMCBSCi9JbTEzODUgMTM4NSAwIFIK L0ltMTM4NiAxMzg2IDAgUgovSW0xMzg3IDEzODcgMCBSCi9JbTEzODggMTM4 OCAwIFIKL0ltMTM4OSAxMzg5IDAgUgovSW0xMzkwIDEzOTAgMCBSCi9JbTEz OTEgMTM5MSAwIFIKL0ltMTM5MiAxMzkyIDAgUgovSW0xMzkzIDEzOTMgMCBS Ci9JbTEzOTQgMTM5NCAwIFIKL0ltMTM5NSAxMzk1IDAgUgovSW0xMzk2IDEz OTYgMCBSCi9JbTEzOTcgMTM5NyAwIFIKL0ltMTM5OCAxMzk4IDAgUgovSW0x Mzk5IDEzOTkgMCBSCi9JbTE0MDAgMTQwMCAwIFIKL0ltMTQwMSAxNDAxIDAg UgovSW0xNDAyIDE0MDIgMCBSCi9JbTE0MDMgMTQwMyAwIFIKL0ltMTQwNCAx NDA0IDAgUgovSW0xNDA1IDE0MDUgMCBSCi9JbTE0MDYgMTQwNiAwIFIKL0lt MTQwNyAxNDA3IDAgUgovSW0xNDA4IDE0MDggMCBSCi9JbTE0MDkgMTQwOSAw IFIKL0ltMTQxMCAxNDEwIDAgUgovSW0xNDExIDE0MTEgMCBSCi9JbTE0MTIg MTQxMiAwIFIKL0ltMTQxMyAxNDEzIDAgUgovSW0xNDE0IDE0MTQgMCBSCi9J bTE0MzEgMTQzMSAwIFIKL0ltMTQ2OCAxNDY4IDAgUgovSW0xNDY5IDE0Njkg MCBSCi9JbTE0NzAgMTQ3MCAwIFIKL0ltMTQ3MSAxNDcxIDAgUgovSW0xNDcy IDE0NzIgMCBSCi9JbTE0NzMgMTQ3MyAwIFIKL0ltMTQ3NCAxNDc0IDAgUgov SW0xNDc1IDE0NzUgMCBSCi9JbTE0NzYgMTQ3NiAwIFIKL0ltMTQ3NyAxNDc3 IDAgUgovSW0xNDc4IDE0NzggMCBSCi9JbTE0NzkgMTQ3OSAwIFIKL0ltMTQ4 MCAxNDgwIDAgUgovSW0xNDgxIDE0ODEgMCBSCi9JbTE0ODIgMTQ4MiAwIFIK L0ltMTQ4MyAxNDgzIDAgUgovSW0xNDg0IDE0ODQgMCBSCi9JbTE0ODUgMTQ4 NSAwIFIKL0ltMTQ4NiAxNDg2IDAgUgovSW0xNDg3IDE0ODcgMCBSCi9JbTE0 ODggMTQ4OCAwIFIKL0ltMTQ4OSAxNDg5IDAgUgovSW0xNDkwIDE0OTAgMCBS Ci9JbTE0OTEgMTQ5MSAwIFIKL0ltMTQ5MiAxNDkyIDAgUgovSW0xNDkzIDE0 OTMgMCBSCi9JbTE0OTQgMTQ5NCAwIFIKL0ltMTQ5NSAxNDk1IDAgUgovSW0x NDk2IDE0OTYgMCBSCi9JbTE0OTcgMTQ5NyAwIFIKL0ltMTQ5OCAxNDk4IDAg UgovSW0xNDk5IDE0OTkgMCBSCi9JbTE1MDAgMTUwMCAwIFIKL0ltMTUwMSAx NTAxIDAgUgovSW0xNTAyIDE1MDIgMCBSCi9JbTE1MDMgMTUwMyAwIFIKL0lt MTUwNCAxNTA0IDAgUgovSW0xNTA1IDE1MDUgMCBSCi9JbTE1MDYgMTUwNiAw IFIKL0ltMTUwNyAxNTA3IDAgUgovSW0xNTA4IDE1MDggMCBSCi9JbTE1MDkg MTUwOSAwIFIKL0ltMTUxMCAxNTEwIDAgUgovSW0xNTExIDE1MTEgMCBSCi9J bTE1MTIgMTUxMiAwIFIKL0ltMTUxMyAxNTEzIDAgUgovSW0xNTE0IDE1MTQg MCBSCi9JbTE1MTUgMTUxNSAwIFIKL0ltMTUxNiAxNTE2IDAgUgovSW0xNTE3 IDE1MTcgMCBSCi9JbTE1MTggMTUxOCAwIFIKL0ltMTUxOSAxNTE5IDAgUgov SW0xNTIwIDE1MjAgMCBSCi9JbTE1MjEgMTUyMSAwIFIKL0ltMTUyMiAxNTIy IDAgUgovSW0xNTIzIDE1MjMgMCBSCi9JbTE1MjQgMTUyNCAwIFIKL0ltMTUy NSAxNTI1IDAgUgovSW0xNTI2IDE1MjYgMCBSCi9JbTE1MjcgMTUyNyAwIFIK L0ltMTUyOCAxNTI4IDAgUgovSW0xNTI5IDE1MjkgMCBSCi9JbTE1MzAgMTUz MCAwIFIKL0ltMTUzMSAxNTMxIDAgUgovSW0xNTMyIDE1MzIgMCBSCi9JbTE1 MzMgMTUzMyAwIFIKL0ltMTUzNCAxNTM0IDAgUgovSW0xNTM1IDE1MzUgMCBS Ci9JbTE1MzYgMTUzNiAwIFIKL0ltMTUzNyAxNTM3IDAgUgovSW0xNTM4IDE1 MzggMCBSCi9JbTE1MzkgMTUzOSAwIFIKL0ltMTU0MCAxNTQwIDAgUgovSW0x NTQxIDE1NDEgMCBSCi9JbTE1NDIgMTU0MiAwIFIKL0ltMTU0MyAxNTQzIDAg UgovSW0xNTQ0IDE1NDQgMCBSCi9JbTE1NDUgMTU0NSAwIFIKL0ltMTU0NiAx NTQ2IDAgUgovSW0xNTQ3IDE1NDcgMCBSCi9JbTE1NDggMTU0OCAwIFIKL0lt MTU0OSAxNTQ5IDAgUgovSW0xNTUwIDE1NTAgMCBSCi9JbTE1NTEgMTU1MSAw IFIKL0ltMTU1MiAxNTUyIDAgUgovSW0xNTUzIDE1NTMgMCBSCi9JbTE1NTQg MTU1NCAwIFIKL0ltMTU1NSAxNTU1IDAgUgovSW0xNTU2IDE1NTYgMCBSCi9J bTE1NTcgMTU1NyAwIFIKL0ltMTU1OCAxNTU4IDAgUgovSW0xNTU5IDE1NTkg MCBSCi9JbTE1NjAgMTU2MCAwIFIKL0ltMTU2MSAxNTYxIDAgUgovSW0xNTYy IDE1NjIgMCBSCi9JbTE1NjMgMTU2MyAwIFIKL0ltMTU2NCAxNTY0IDAgUgov SW0xNTY1IDE1NjUgMCBSCi9JbTE1NjYgMTU2NiAwIFIKL0ltMTU2NyAxNTY3 IDAgUgovSW0xNTY4IDE1NjggMCBSCi9JbTE1NjkgMTU2OSAwIFIKL0ltMTU3 MCAxNTcwIDAgUgovSW0xNTcxIDE1NzEgMCBSCi9JbTE1NzIgMTU3MiAwIFIK L0ltMTU3MyAxNTczIDAgUgovSW0xNTc0IDE1NzQgMCBSCi9JbTE1NzUgMTU3 NSAwIFIKL0ltMTU3NiAxNTc2IDAgUgovSW0xNTc3IDE1NzcgMCBSCi9JbTE1 NzggMTU3OCAwIFIKL0ltMTU3OSAxNTc5IDAgUgovSW0xNTgwIDE1ODAgMCBS Ci9JbTE1ODEgMTU4MSAwIFIKL0ltMTU4MiAxNTgyIDAgUgovSW0xNTgzIDE1 ODMgMCBSCi9JbTE1ODQgMTU4NCAwIFIKL0ltMTU4NSAxNTg1IDAgUgovSW0x NTg2IDE1ODYgMCBSCi9JbTE1ODcgMTU4NyAwIFIKL0ltMTU4OCAxNTg4IDAg UgovSW0xNTg5IDE1ODkgMCBSCi9JbTE1OTAgMTU5MCAwIFIKL0ltMTU5MSAx NTkxIDAgUgovSW0xNTkyIDE1OTIgMCBSCi9JbTE1OTMgMTU5MyAwIFIKL0lt MTU5NCAxNTk0IDAgUgovSW0xNTk1IDE1OTUgMCBSCi9JbTE1OTYgMTU5NiAw IFIKL0ltMTU5NyAxNTk3IDAgUgovSW0xNTk4IDE1OTggMCBSCi9JbTE1OTkg MTU5OSAwIFIKL0ltMTYwMCAxNjAwIDAgUgovSW0xNjAxIDE2MDEgMCBSCi9J bTE2MDIgMTYwMiAwIFIKL0ltMTYwMyAxNjAzIDAgUgovSW0xNjA0IDE2MDQg MCBSCi9JbTE2MDUgMTYwNSAwIFIKL0ltMTYwNiAxNjA2IDAgUgovSW0xNjA3 IDE2MDcgMCBSCi9JbTE2MDggMTYwOCAwIFIKL0ltMTYwOSAxNjA5IDAgUgov SW0xNjEwIDE2MTAgMCBSCi9JbTE2MTEgMTYxMSAwIFIKL0ltMTYxMiAxNjEy IDAgUgovSW0xNjEzIDE2MTMgMCBSCi9JbTE2MTQgMTYxNCAwIFIKL0ltMTYx NSAxNjE1IDAgUgovSW0xNjE2IDE2MTYgMCBSCi9JbTE2MTcgMTYxNyAwIFIK L0ltMTYxOCAxNjE4IDAgUgovSW0xNjE5IDE2MTkgMCBSCi9JbTE2MjAgMTYy MCAwIFIKL0ltMTYyMSAxNjIxIDAgUgovSW0xNjIyIDE2MjIgMCBSCi9JbTE2 MjMgMTYyMyAwIFIKL0ltMTYyNCAxNjI0IDAgUgovSW0xNjI1IDE2MjUgMCBS Ci9JbTE2MjYgMTYyNiAwIFIKL0ltMTYyNyAxNjI3IDAgUgovSW0xNjI4IDE2 MjggMCBSCi9JbTE2MjkgMTYyOSAwIFIKL0ltMTYzMCAxNjMwIDAgUgovSW0x NjMxIDE2MzEgMCBSCi9JbTE2MzIgMTYzMiAwIFIKL0ltMTYzMyAxNjMzIDAg UgovSW0xNjM0IDE2MzQgMCBSCi9JbTE2MzUgMTYzNSAwIFIKL0ltMTYzNiAx NjM2IDAgUgovSW0xNjM3IDE2MzcgMCBSCi9JbTE2MzggMTYzOCAwIFIKL0lt MTYzOSAxNjM5IDAgUgovSW0xNjQwIDE2NDAgMCBSCi9JbTE2NDEgMTY0MSAw IFIKL0ltMTY0MiAxNjQyIDAgUgovSW0xNjQzIDE2NDMgMCBSCi9JbTE2NDQg MTY0NCAwIFIKL0ltMTY0NSAxNjQ1IDAgUgovSW0xNjQ2IDE2NDYgMCBSCi9J bTE2NDcgMTY0NyAwIFIKL0ltMTY0OCAxNjQ4IDAgUgovSW0xNjQ5IDE2NDkg MCBSCi9JbTE2NTAgMTY1MCAwIFIKL0ltMTY1MSAxNjUxIDAgUgovSW0xNjUy IDE2NTIgMCBSCi9JbTE2NTMgMTY1MyAwIFIKL0ltMTY1NCAxNjU0IDAgUgov SW0xNjU1IDE2NTUgMCBSCi9JbTE2NTYgMTY1NiAwIFIKL0ltMTY1NyAxNjU3 IDAgUgovSW0xNjU4IDE2NTggMCBSCi9JbTE2NTkgMTY1OSAwIFIKL0ltMTY2 MCAxNjYwIDAgUgovSW0xNjYxIDE2NjEgMCBSCi9JbTE2NjIgMTY2MiAwIFIK L0ltMTY2MyAxNjYzIDAgUgovSW0xNjY0IDE2NjQgMCBSCi9JbTE2NjUgMTY2 NSAwIFIKL0ltMTY2NiAxNjY2IDAgUgovSW0xNjY3IDE2NjcgMCBSCi9JbTE2 NjggMTY2OCAwIFIKL0ltMTY2OSAxNjY5IDAgUgovSW0xNjcwIDE2NzAgMCBS Ci9JbTE2NzEgMTY3MSAwIFIKL0ltMTY3MiAxNjcyIDAgUgovSW0xNjczIDE2 NzMgMCBSCi9JbTE2NzQgMTY3NCAwIFIKL0ltMTY3NSAxNjc1IDAgUgovSW0x Njc2IDE2NzYgMCBSCi9JbTE2NzcgMTY3NyAwIFIKL0ltMTY3OCAxNjc4IDAg UgovSW0xNjc5IDE2NzkgMCBSCi9JbTE2ODAgMTY4MCAwIFIKL0ltMTY4MSAx NjgxIDAgUgovSW0xNjgyIDE2ODIgMCBSCi9JbTE2ODMgMTY4MyAwIFIKL0lt MTY4NCAxNjg0IDAgUgovSW0xNjg1IDE2ODUgMCBSCi9JbTE2ODYgMTY4NiAw IFIKL0ltMTY4NyAxNjg3IDAgUgovSW0xNjg4IDE2ODggMCBSCi9JbTE2ODkg MTY4OSAwIFIKL0ltMTY5MCAxNjkwIDAgUgovSW0xNjkxIDE2OTEgMCBSCi9J bTE2OTIgMTY5MiAwIFIKL0ltMTY5MyAxNjkzIDAgUgovSW0xNjk0IDE2OTQg MCBSCi9JbTE2OTUgMTY5NSAwIFIKL0ltMTY5NiAxNjk2IDAgUgovSW0xNjk3 IDE2OTcgMCBSCi9JbTE2OTggMTY5OCAwIFIKL0ltMTY5OSAxNjk5IDAgUgov SW0xNzAwIDE3MDAgMCBSCi9JbTE3MDEgMTcwMSAwIFIKL0ltMTcwMiAxNzAy IDAgUgovSW0xNzAzIDE3MDMgMCBSCi9JbTE3MDQgMTcwNCAwIFIKL0ltMTcw NSAxNzA1IDAgUgovSW0xNzA2IDE3MDYgMCBSCi9JbTE3MDcgMTcwNyAwIFIK L0ltMTcwOCAxNzA4IDAgUgovSW0xNzA5IDE3MDkgMCBSCi9JbTE3MTAgMTcx MCAwIFIKL0ltMTcxMSAxNzExIDAgUgovSW0xNzEyIDE3MTIgMCBSCi9JbTE3 MTMgMTcxMyAwIFIKL0ltMTcxNCAxNzE0IDAgUgovSW0xNzE1IDE3MTUgMCBS Ci9JbTE3MTYgMTcxNiAwIFIKL0ltMTcxNyAxNzE3IDAgUgovSW0xNzE4IDE3 MTggMCBSCi9JbTE3MTkgMTcxOSAwIFIKL0ltMTcyMCAxNzIwIDAgUgovSW0x NzIxIDE3MjEgMCBSCi9JbTE3MjIgMTcyMiAwIFIKL0ltMTcyMyAxNzIzIDAg UgovSW0xNzI0IDE3MjQgMCBSCi9JbTE3MjUgMTcyNSAwIFIKL0ltMTcyNiAx NzI2IDAgUgovSW0xNzI3IDE3MjcgMCBSCi9JbTE3MjggMTcyOCAwIFIKL0lt MTcyOSAxNzI5IDAgUgovSW0xNzMwIDE3MzAgMCBSCi9JbTE3MzEgMTczMSAw IFIKL0ltMTczMiAxNzMyIDAgUgovSW0xNzMzIDE3MzMgMCBSCi9JbTE3MzQg MTczNCAwIFIKL0ltMTczNSAxNzM1IDAgUgovSW0xNzM2IDE3MzYgMCBSCi9J bTE3MzcgMTczNyAwIFIKL0ltMTczOCAxNzM4IDAgUgovSW0xNzM5IDE3Mzkg MCBSCi9JbTE3NDAgMTc0MCAwIFIKL0ltMTc0MSAxNzQxIDAgUgovSW0xNzQy IDE3NDIgMCBSCi9JbTE3NDMgMTc0MyAwIFIKL0ltMTc0NCAxNzQ0IDAgUgov SW0xNzQ1IDE3NDUgMCBSCi9JbTE3NDYgMTc0NiAwIFIKL0ltMTc0NyAxNzQ3 IDAgUgovSW0xNzQ4IDE3NDggMCBSCi9JbTE3NDkgMTc0OSAwIFIKL0ltMTc1 MCAxNzUwIDAgUgovSW0xNzUxIDE3NTEgMCBSCi9JbTE3NTIgMTc1MiAwIFIK L0ltMTc1MyAxNzUzIDAgUgovSW0xNzU0IDE3NTQgMCBSCi9JbTE3NTUgMTc1 NSAwIFIKL0ltMTc1NiAxNzU2IDAgUgovSW0xNzU3IDE3NTcgMCBSCi9JbTE3 NTggMTc1OCAwIFIKL0ltMTc1OSAxNzU5IDAgUgovSW0xNzYwIDE3NjAgMCBS Ci9JbTE3NjEgMTc2MSAwIFIKL0ltMTc2MiAxNzYyIDAgUgovSW0xNzYzIDE3 NjMgMCBSCi9JbTE3NjQgMTc2NCAwIFIKL0ltMTc2NSAxNzY1IDAgUgovSW0x NzY2IDE3NjYgMCBSCi9JbTE3NjcgMTc2NyAwIFIKL0ltMTc2OCAxNzY4IDAg UgovSW0xNzY5IDE3NjkgMCBSCi9JbTE3NzAgMTc3MCAwIFIKL0ltMTc3MSAx NzcxIDAgUgovSW0xNzcyIDE3NzIgMCBSCi9JbTE3NzMgMTc3MyAwIFIKL0lt MTc3NCAxNzc0IDAgUgovSW0xNzc1IDE3NzUgMCBSCi9JbTE3NzYgMTc3NiAw IFIKL0ltMTc3NyAxNzc3IDAgUgovSW0xNzc4IDE3NzggMCBSCi9JbTE3Nzkg MTc3OSAwIFIKL0ltMTc4MCAxNzgwIDAgUgovSW0xNzgxIDE3ODEgMCBSCi9J bTE3ODIgMTc4MiAwIFIKL0ltMTc4MyAxNzgzIDAgUgovSW0xNzg0IDE3ODQg MCBSCi9JbTE3ODUgMTc4NSAwIFIKL0ltMTc4NiAxNzg2IDAgUgovSW0xNzg3 IDE3ODcgMCBSCi9JbTE3ODggMTc4OCAwIFIKL0ltMTc4OSAxNzg5IDAgUgov SW0xNzkwIDE3OTAgMCBSCi9JbTE3OTEgMTc5MSAwIFIKL0ltMTc5MiAxNzky IDAgUgovSW0xNzkzIDE3OTMgMCBSCi9JbTE3OTQgMTc5NCAwIFIKL0ltMTc5 NSAxNzk1IDAgUgovSW0xNzk2IDE3OTYgMCBSCi9JbTE3OTcgMTc5NyAwIFIK L0ltMTc5OCAxNzk4IDAgUgovSW0xNzk5IDE3OTkgMCBSCi9JbTE4MDAgMTgw MCAwIFIKL0ltMTgwMSAxODAxIDAgUgovSW0xODAyIDE4MDIgMCBSCi9JbTE4 MDMgMTgwMyAwIFIKL0ltMTgwNCAxODA0IDAgUgovSW0xODA1IDE4MDUgMCBS Ci9JbTE4MDYgMTgwNiAwIFIKL0ltMTgwNyAxODA3IDAgUgovSW0xODA4IDE4 MDggMCBSCi9JbTE4MDkgMTgwOSAwIFIKL0ltMTgxMCAxODEwIDAgUgovSW0x ODExIDE4MTEgMCBSCi9JbTE4MTIgMTgxMiAwIFIKL0ltMTgxMyAxODEzIDAg UgovSW0xODE0IDE4MTQgMCBSCi9JbTE4MTUgMTgxNSAwIFIKL0ltMTgxNiAx ODE2IDAgUgovSW0xODE3IDE4MTcgMCBSCi9JbTE4MTggMTgxOCAwIFIKL0lt MTgxOSAxODE5IDAgUgovSW0xODIwIDE4MjAgMCBSCi9JbTE4MjEgMTgyMSAw IFIKL0ltMTgyMiAxODIyIDAgUgovSW0xODIzIDE4MjMgMCBSCi9JbTE4MjQg MTgyNCAwIFIKL0ltMTgyNSAxODI1IDAgUgovSW0xODI2IDE4MjYgMCBSCi9J bTE4MjcgMTgyNyAwIFIKL0ltMTgyOCAxODI4IDAgUgovSW0xODI5IDE4Mjkg MCBSCi9JbTE4MzAgMTgzMCAwIFIKL0ltMTgzMSAxODMxIDAgUgovSW0xODMy IDE4MzIgMCBSCi9JbTE4MzMgMTgzMyAwIFIKL0ltMTgzNCAxODM0IDAgUgov SW0xODM1IDE4MzUgMCBSCi9JbTE4MzYgMTgzNiAwIFIKL0ltMTgzNyAxODM3 IDAgUgovSW0xODM4IDE4MzggMCBSCi9JbTE4MzkgMTgzOSAwIFIKL0ltMTg0 MCAxODQwIDAgUgovSW0xODQxIDE4NDEgMCBSCi9JbTE4NDIgMTg0MiAwIFIK L0ltMTg0MyAxODQzIDAgUgovSW0xODQ0IDE4NDQgMCBSCi9JbTE4NDUgMTg0 NSAwIFIKL0ltMTg0NiAxODQ2IDAgUgovSW0xODQ3IDE4NDcgMCBSCi9JbTE4 NDggMTg0OCAwIFIKL0ltMTg0OSAxODQ5IDAgUgovSW0xODUwIDE4NTAgMCBS Ci9JbTE4NTEgMTg1MSAwIFIKL0ltMTg1MiAxODUyIDAgUgovSW0xODUzIDE4 NTMgMCBSCi9JbTE4NTQgMTg1NCAwIFIKL0ltMTg1NSAxODU1IDAgUgovSW0x ODU2IDE4NTYgMCBSCi9JbTE4NTcgMTg1NyAwIFIKL0ltMTg1OCAxODU4IDAg UgovSW0xODU5IDE4NTkgMCBSCi9JbTE4NjAgMTg2MCAwIFIKL0ltMTg2MSAx ODYxIDAgUgovSW0xODYyIDE4NjIgMCBSCi9JbTE4NjMgMTg2MyAwIFIKL0lt MTg2NCAxODY0IDAgUgovSW0xODY1IDE4NjUgMCBSCi9JbTE4NjYgMTg2NiAw IFIKL0ltMTg2NyAxODY3IDAgUgovSW0xODY4IDE4NjggMCBSCi9JbTE4Njkg MTg2OSAwIFIKL0ltMTg3MCAxODcwIDAgUgovSW0xODcxIDE4NzEgMCBSCi9J bTE4NzIgMTg3MiAwIFIKL0ltMTg3MyAxODczIDAgUgovSW0xODc0IDE4NzQg MCBSCi9JbTE4NzUgMTg3NSAwIFIKL0ltMTg3NiAxODc2IDAgUgovSW0xODc3 IDE4NzcgMCBSCi9JbTE4NzggMTg3OCAwIFIKL0ltMTg3OSAxODc5IDAgUgov SW0xODgwIDE4ODAgMCBSCi9JbTE4ODEgMTg4MSAwIFIKL0ltMTg4MiAxODgy IDAgUgovSW0xODgzIDE4ODMgMCBSCi9JbTE4ODQgMTg4NCAwIFIKL0ltMTg4 NSAxODg1IDAgUgovSW0xODg2IDE4ODYgMCBSCi9JbTE4ODcgMTg4NyAwIFIK L0ltMTg4OCAxODg4IDAgUgovSW0xODg5IDE4ODkgMCBSCi9JbTE4OTAgMTg5 MCAwIFIKL0ltMTg5MSAxODkxIDAgUgovSW0xODkyIDE4OTIgMCBSCi9JbTE4 OTMgMTg5MyAwIFIKL0ltMTg5NCAxODk0IDAgUgovSW0xODk1IDE4OTUgMCBS Ci9JbTE4OTYgMTg5NiAwIFIKL0ltMTg5NyAxODk3IDAgUgovSW0xODk4IDE4 OTggMCBSCi9JbTE4OTkgMTg5OSAwIFIKL0ltMTkwMCAxOTAwIDAgUgovSW0x OTAxIDE5MDEgMCBSCi9JbTE5MDIgMTkwMiAwIFIKL0ltMTkwMyAxOTAzIDAg UgovSW0xOTA0IDE5MDQgMCBSCi9JbTE5MDUgMTkwNSAwIFIKL0ltMTkwNiAx OTA2IDAgUgovSW0xOTA3IDE5MDcgMCBSCi9JbTE5MDggMTkwOCAwIFIKL0lt MTkwOSAxOTA5IDAgUgovSW0xOTEwIDE5MTAgMCBSCi9JbTE5MTEgMTkxMSAw IFIKL0ltMTkxMiAxOTEyIDAgUgovSW0xOTEzIDE5MTMgMCBSCi9JbTE5MTQg MTkxNCAwIFIKL0ltMTkxNSAxOTE1IDAgUgovSW0xOTE2IDE5MTYgMCBSCi9J bTE5MTcgMTkxNyAwIFIKL0ltMTkxOCAxOTE4IDAgUgovSW0xOTE5IDE5MTkg MCBSCi9JbTE5MjAgMTkyMCAwIFIKL0ltMTkyMSAxOTIxIDAgUgovSW0xOTIy IDE5MjIgMCBSCi9JbTE5MjMgMTkyMyAwIFIKL0ltMTkyNCAxOTI0IDAgUgov SW0xOTI1IDE5MjUgMCBSCi9JbTE5MjYgMTkyNiAwIFIKL0ltMTkyNyAxOTI3 IDAgUgovSW0xOTI4IDE5MjggMCBSCi9JbTE5MjkgMTkyOSAwIFIKL0ltMTkz MCAxOTMwIDAgUgovSW0xOTMxIDE5MzEgMCBSCi9JbTE5MzIgMTkzMiAwIFIK L0ltMTkzMyAxOTMzIDAgUgovSW0xOTM0IDE5MzQgMCBSCi9JbTE5MzUgMTkz NSAwIFIKL0ltMTkzNiAxOTM2IDAgUgovSW0xOTM3IDE5MzcgMCBSCi9JbTE5 MzggMTkzOCAwIFIKL0ltMTkzOSAxOTM5IDAgUgovSW0xOTQwIDE5NDAgMCBS Ci9JbTE5NDEgMTk0MSAwIFIKL0ltMTk0MiAxOTQyIDAgUgovSW0xOTQzIDE5 NDMgMCBSCi9JbTE5NDQgMTk0NCAwIFIKL0ltMTk0NSAxOTQ1IDAgUgovSW0x OTQ2IDE5NDYgMCBSCi9JbTE5NDcgMTk0NyAwIFIKL0ltMTk0OCAxOTQ4IDAg UgovSW0xOTQ5IDE5NDkgMCBSCi9JbTE5NTAgMTk1MCAwIFIKL0ltMTk1MSAx OTUxIDAgUgovSW0xOTUyIDE5NTIgMCBSCi9JbTE5NTMgMTk1MyAwIFIKL0lt MTk1NCAxOTU0IDAgUgovSW0xOTU1IDE5NTUgMCBSCi9JbTE5NTYgMTk1NiAw IFIKL0ltMTk1NyAxOTU3IDAgUgovSW0xOTU4IDE5NTggMCBSCi9JbTE5NTkg MTk1OSAwIFIKL0ltMTk2MCAxOTYwIDAgUgovSW0xOTYxIDE5NjEgMCBSCi9J bTE5NjIgMTk2MiAwIFIKL0ltMTk2MyAxOTYzIDAgUgovSW0xOTY0IDE5NjQg MCBSCi9JbTE5NjUgMTk2NSAwIFIKL0ltMTk2NiAxOTY2IDAgUgovSW0xOTY3 IDE5NjcgMCBSCi9JbTE5NjggMTk2OCAwIFIKL0ltMTk2OSAxOTY5IDAgUgov SW0xOTcwIDE5NzAgMCBSCi9JbTE5NzEgMTk3MSAwIFIKL0ltMTk3MiAxOTcy IDAgUgovSW0xOTczIDE5NzMgMCBSCi9JbTE5NzQgMTk3NCAwIFIKL0ltMTk3 NSAxOTc1IDAgUgovSW0xOTc2IDE5NzYgMCBSCi9JbTE5NzcgMTk3NyAwIFIK L0ltMTk3OCAxOTc4IDAgUgovSW0xOTc5IDE5NzkgMCBSCi9JbTE5ODAgMTk4 MCAwIFIKL0ltMTk4MSAxOTgxIDAgUgovSW0xOTgyIDE5ODIgMCBSCi9JbTE5 ODMgMTk4MyAwIFIKL0ltMTk4NCAxOTg0IDAgUgovSW0xOTg1IDE5ODUgMCBS Ci9JbTE5ODYgMTk4NiAwIFIKL0ltMTk4NyAxOTg3IDAgUgovSW0xOTg4IDE5 ODggMCBSCi9JbTE5ODkgMTk4OSAwIFIKL0ltMTk5MCAxOTkwIDAgUgovSW0x OTkxIDE5OTEgMCBSCi9JbTE5OTIgMTk5MiAwIFIKL0ltMTk5MyAxOTkzIDAg UgovSW0xOTk0IDE5OTQgMCBSCi9JbTE5OTUgMTk5NSAwIFIKL0ltMTk5NiAx OTk2IDAgUgovSW0xOTk3IDE5OTcgMCBSCi9JbTE5OTggMTk5OCAwIFIKL0lt MTk5OSAxOTk5IDAgUgovSW0yMDAwIDIwMDAgMCBSCi9JbTIwMDEgMjAwMSAw IFIKL0ltMjAwMiAyMDAyIDAgUgovSW0yMDAzIDIwMDMgMCBSCi9JbTIwMDQg MjAwNCAwIFIKL0ltMjAwNSAyMDA1IDAgUgovSW0yMDA2IDIwMDYgMCBSCi9J bTIwMDcgMjAwNyAwIFIKL0ltMjAwOCAyMDA4IDAgUgovSW0yMDA5IDIwMDkg MCBSCi9JbTIwMTAgMjAxMCAwIFIKL0ltMjAxMSAyMDExIDAgUgovSW0yMDEy IDIwMTIgMCBSCi9JbTIwMTMgMjAxMyAwIFIKL0ltMjAxNCAyMDE0IDAgUgov SW0yMDE1IDIwMTUgMCBSCi9JbTIwMTYgMjAxNiAwIFIKL0ltMjAxNyAyMDE3 IDAgUgovSW0yMDE4IDIwMTggMCBSCi9JbTIwMTkgMjAxOSAwIFIKL0ltMjAy MCAyMDIwIDAgUgovSW0yMDIxIDIwMjEgMCBSCi9JbTIwMjIgMjAyMiAwIFIK L0ltMjAyMyAyMDIzIDAgUgovSW0yMDI0IDIwMjQgMCBSCi9JbTIwMjUgMjAy NSAwIFIKL0ltMjAyNiAyMDI2IDAgUgovSW0yMDI3IDIwMjcgMCBSCi9JbTIw MjggMjAyOCAwIFIKL0ltMjAyOSAyMDI5IDAgUgovSW0yMDMwIDIwMzAgMCBS Ci9JbTIwMzEgMjAzMSAwIFIKL0ltMjAzMiAyMDMyIDAgUgovSW0yMDMzIDIw MzMgMCBSCi9JbTIwMzQgMjAzNCAwIFIKL0ltMjAzNSAyMDM1IDAgUgovSW0y MDM2IDIwMzYgMCBSCi9JbTIwMzcgMjAzNyAwIFIKL0ltMjAzOCAyMDM4IDAg UgovSW0yMDM5IDIwMzkgMCBSCi9JbTIwNDAgMjA0MCAwIFIKL0ltMjA0MSAy MDQxIDAgUgovSW0yMDQyIDIwNDIgMCBSCi9JbTIwNDMgMjA0MyAwIFIKL0lt MjA0NCAyMDQ0IDAgUgovSW0yMDQ1IDIwNDUgMCBSCi9JbTIwNDYgMjA0NiAw IFIKL0ltMjA0NyAyMDQ3IDAgUgovSW0yMDQ4IDIwNDggMCBSCi9JbTIwNDkg MjA0OSAwIFIKL0ltMjA1MCAyMDUwIDAgUgovSW0yMDUxIDIwNTEgMCBSCi9J bTIwNTIgMjA1MiAwIFIKL0ltMjA1MyAyMDUzIDAgUgovSW0yMDU0IDIwNTQg MCBSCi9JbTIwNTUgMjA1NSAwIFIKL0ltMjA1NiAyMDU2IDAgUgovSW0yMDU3 IDIwNTcgMCBSCi9JbTIwNTggMjA1OCAwIFIKL0ltMjA1OSAyMDU5IDAgUgov SW0yMDYwIDIwNjAgMCBSCi9JbTIwNjEgMjA2MSAwIFIKL0ltMjA2MiAyMDYy IDAgUgovSW0yMDYzIDIwNjMgMCBSCi9JbTIwNjQgMjA2NCAwIFIKL0ltMjA2 NSAyMDY1IDAgUgovSW0yMDY2IDIwNjYgMCBSCi9JbTIwNjcgMjA2NyAwIFIK L0ltMjA2OCAyMDY4IDAgUgovSW0yMDY5IDIwNjkgMCBSCi9JbTIwNzAgMjA3 MCAwIFIKL0ltMjA3MSAyMDcxIDAgUgovSW0yMDcyIDIwNzIgMCBSCi9JbTIw NzMgMjA3MyAwIFIKL0ltMjA3NCAyMDc0IDAgUgovSW0yMDc1IDIwNzUgMCBS Ci9JbTIwNzYgMjA3NiAwIFIKL0ltMjA3NyAyMDc3IDAgUgovSW0yMDc4IDIw NzggMCBSCi9JbTIwNzkgMjA3OSAwIFIKL0ltMjA4MCAyMDgwIDAgUgovSW0y MDgxIDIwODEgMCBSCi9JbTIwODIgMjA4MiAwIFIKL0ltMjA4MyAyMDgzIDAg UgovSW0yMDg0IDIwODQgMCBSCi9JbTIwODUgMjA4NSAwIFIKL0ltMjA4NiAy MDg2IDAgUgovSW0yMDg3IDIwODcgMCBSCi9JbTIwODggMjA4OCAwIFIKL0lt MjA4OSAyMDg5IDAgUgovSW0yMDkwIDIwOTAgMCBSCi9JbTIwOTEgMjA5MSAw IFIKL0ltMjA5MiAyMDkyIDAgUgovSW0yMDkzIDIwOTMgMCBSCi9JbTIwOTQg MjA5NCAwIFIKL0ltMjA5NSAyMDk1IDAgUgovSW0yMDk2IDIwOTYgMCBSCi9J bTIxMjEgMjEyMSAwIFIKL0ltMjEyMiAyMTIyIDAgUgovSW0yMTIzIDIxMjMg MCBSCi9JbTIxMjQgMjEyNCAwIFIKL0ltMjEyNSAyMTI1IDAgUgovSW0yMTI2 IDIxMjYgMCBSCi9JbTIxMjcgMjEyNyAwIFIKL0ltMjEyOCAyMTI4IDAgUgov SW0yMTI5IDIxMjkgMCBSCi9JbTIxMzAgMjEzMCAwIFIKL0ltMjEzMSAyMTMx IDAgUgovSW0yMTMyIDIxMzIgMCBSCi9JbTIxMzMgMjEzMyAwIFIKL0ltMjEz NCAyMTM0IDAgUgovSW0yMTM1IDIxMzUgMCBSCi9JbTIxMzYgMjEzNiAwIFIK L0ltMjEzNyAyMTM3IDAgUgovSW0yMTM4IDIxMzggMCBSCi9JbTIxMzkgMjEz OSAwIFIKL0ltMjE0MCAyMTQwIDAgUgovSW0yMTQxIDIxNDEgMCBSCi9JbTIx NDIgMjE0MiAwIFIKL0ltMjE0MyAyMTQzIDAgUgovSW0yMTQ0IDIxNDQgMCBS Ci9JbTIxNDUgMjE0NSAwIFIKL0ltMjE0NiAyMTQ2IDAgUgovSW0yMTQ3IDIx NDcgMCBSCi9JbTIxNDggMjE0OCAwIFIKL0ltMjE0OSAyMTQ5IDAgUgovSW0y MTUwIDIxNTAgMCBSCi9JbTIxNTEgMjE1MSAwIFIKL0ltMjE1MiAyMTUyIDAg UgovSW0yMTUzIDIxNTMgMCBSCi9JbTIxNTQgMjE1NCAwIFIKL0ltMjE1NSAy MTU1IDAgUgovSW0yMTU2IDIxNTYgMCBSCi9JbTIxNTcgMjE1NyAwIFIKL0lt MjE1OCAyMTU4IDAgUgovSW0yMTU5IDIxNTkgMCBSCi9JbTIxNjAgMjE2MCAw IFIKL0ltMjE2MSAyMTYxIDAgUgovSW0yMTYyIDIxNjIgMCBSCi9JbTIxNjMg MjE2MyAwIFIKL0ltMjE2NCAyMTY0IDAgUgovSW0yMTY1IDIxNjUgMCBSCi9J bTIxNjYgMjE2NiAwIFIKL0ltMjE2NyAyMTY3IDAgUgovSW0yMTY4IDIxNjgg MCBSCi9JbTIxNjkgMjE2OSAwIFIKL0ltMjE3MCAyMTcwIDAgUgovSW0yMTcx IDIxNzEgMCBSCi9JbTIxNzIgMjE3MiAwIFIKL0ltMjE3MyAyMTczIDAgUgov SW0yMTc0IDIxNzQgMCBSCi9JbTIxNzUgMjE3NSAwIFIKL0ltMjE3NiAyMTc2 IDAgUgovSW0yMTc3IDIxNzcgMCBSCi9JbTIxNzggMjE3OCAwIFIKL0ltMjE3 OSAyMTc5IDAgUgovSW0yMTgwIDIxODAgMCBSCi9JbTIxODEgMjE4MSAwIFIK L0ltMjE4MiAyMTgyIDAgUgovSW0yMTgzIDIxODMgMCBSCi9JbTIxODQgMjE4 NCAwIFIKL0ltMjE4NSAyMTg1IDAgUgovSW0yMTg2IDIxODYgMCBSCi9JbTIx ODcgMjE4NyAwIFIKL0ltMjE4OCAyMTg4IDAgUgovSW0yMTg5IDIxODkgMCBS Ci9JbTIxOTAgMjE5MCAwIFIKL0ltMjE5MSAyMTkxIDAgUgovSW0yMTkyIDIx OTIgMCBSCi9JbTIxOTMgMjE5MyAwIFIKL0ltMjE5NCAyMTk0IDAgUgovSW0y MTk1IDIxOTUgMCBSCi9JbTIxOTYgMjE5NiAwIFIKL0ltMjE5NyAyMTk3IDAg UgovSW0yMTk4IDIxOTggMCBSCi9JbTIxOTkgMjE5OSAwIFIKL0ltMjIwMCAy MjAwIDAgUgovSW0yMjAxIDIyMDEgMCBSCi9JbTIyMDIgMjIwMiAwIFIKL0lt MjIwMyAyMjAzIDAgUgovSW0yMjA0IDIyMDQgMCBSCi9JbTIyMDUgMjIwNSAw IFIKL0ltMjIwNiAyMjA2IDAgUgovSW0yMjA3IDIyMDcgMCBSCi9JbTIyMDgg MjIwOCAwIFIKL0ltMjIwOSAyMjA5IDAgUgovSW0yMjEwIDIyMTAgMCBSCi9J bTIyMTEgMjIxMSAwIFIKL0ltMjIxMiAyMjEyIDAgUgovSW0yMjEzIDIyMTMg MCBSCi9JbTIyMTQgMjIxNCAwIFIKL0ltMjIxNSAyMjE1IDAgUgovSW0yMjE2 IDIyMTYgMCBSCi9JbTIyMTcgMjIxNyAwIFIKL0ltMjIxOCAyMjE4IDAgUgov SW0yMjE5IDIyMTkgMCBSCi9JbTIyMjAgMjIyMCAwIFIKL0ltMjIyMSAyMjIx IDAgUgovSW0yMjIyIDIyMjIgMCBSCi9JbTIyMjMgMjIyMyAwIFIKL0ltMjIy NCAyMjI0IDAgUgovSW0yMjI1IDIyMjUgMCBSCi9JbTIyMjYgMjIyNiAwIFIK L0ltMjIyNyAyMjI3IDAgUgovSW0yMjI4IDIyMjggMCBSCi9JbTIyMjkgMjIy OSAwIFIKL0ltMjIzMCAyMjMwIDAgUgovSW0yMjMxIDIyMzEgMCBSCi9JbTIy MzIgMjIzMiAwIFIKL0ltMjIzMyAyMjMzIDAgUgovSW0yMjM0IDIyMzQgMCBS Ci9JbTIyMzUgMjIzNSAwIFIKL0ltMjIzNiAyMjM2IDAgUgovSW0yMjM3IDIy MzcgMCBSCi9JbTIyMzggMjIzOCAwIFIKL0ltMjIzOSAyMjM5IDAgUgovSW0y MjQwIDIyNDAgMCBSCi9JbTIyNDEgMjI0MSAwIFIKL0ltMjI0MiAyMjQyIDAg UgovSW0yMjQzIDIyNDMgMCBSCi9JbTIyNDQgMjI0NCAwIFIKL0ltMjI0NSAy MjQ1IDAgUgovSW0yMjQ2IDIyNDYgMCBSCi9JbTIyNDcgMjI0NyAwIFIKL0lt MjI0OCAyMjQ4IDAgUgovSW0yMjQ5IDIyNDkgMCBSCi9JbTIyNTAgMjI1MCAw IFIKL0ltMjI1MSAyMjUxIDAgUgovSW0yMjUyIDIyNTIgMCBSCi9JbTIyNTMg MjI1MyAwIFIKL0ltMjI1NCAyMjU0IDAgUgovSW0yMjU1IDIyNTUgMCBSCi9J bTIyNTYgMjI1NiAwIFIKL0ltMjI1NyAyMjU3IDAgUgovSW0yMjU4IDIyNTgg MCBSCi9JbTIyNTkgMjI1OSAwIFIKL0ltMjI2MCAyMjYwIDAgUgovSW0yMjYx IDIyNjEgMCBSCi9JbTIyNjIgMjI2MiAwIFIKL0ltMjI2MyAyMjYzIDAgUgov SW0yMjY0IDIyNjQgMCBSCi9JbTIyNjUgMjI2NSAwIFIKL0ltMjI2NiAyMjY2 IDAgUgovSW0yMjY3IDIyNjcgMCBSCi9JbTIyNjggMjI2OCAwIFIKL0ltMjI2 OSAyMjY5IDAgUgovSW0yMjcwIDIyNzAgMCBSCi9JbTIyNzEgMjI3MSAwIFIK L0ltMjI3MiAyMjcyIDAgUgovSW0yMjczIDIyNzMgMCBSCi9JbTIyNzQgMjI3 NCAwIFIKL0ltMjI3NSAyMjc1IDAgUgovSW0yMjc2IDIyNzYgMCBSCi9JbTIy NzcgMjI3NyAwIFIKL0ltMjI3OCAyMjc4IDAgUgovSW0yMjc5IDIyNzkgMCBS Ci9JbTIyODAgMjI4MCAwIFIKL0ltMjI4MSAyMjgxIDAgUgovSW0yMjgyIDIy ODIgMCBSCi9JbTIyODMgMjI4MyAwIFIKL0ltMjI4NCAyMjg0IDAgUgovSW0y Mjg1IDIyODUgMCBSCi9JbTIyODYgMjI4NiAwIFIKL0ltMjI4NyAyMjg3IDAg UgovSW0yMjg4IDIyODggMCBSCi9JbTIyODkgMjI4OSAwIFIKL0ltMjI5MCAy MjkwIDAgUgovSW0yMjkxIDIyOTEgMCBSCi9JbTIyOTIgMjI5MiAwIFIKL0lt MjI5MyAyMjkzIDAgUgovSW0yMjk0IDIyOTQgMCBSCi9JbTIyOTUgMjI5NSAw IFIKL0ltMjI5NiAyMjk2IDAgUgovSW0yMjk3IDIyOTcgMCBSCi9JbTIyOTgg MjI5OCAwIFIKL0ltMjI5OSAyMjk5IDAgUgovSW0yMzAwIDIzMDAgMCBSCi9J bTIzMDEgMjMwMSAwIFIKL0ltMjMwMiAyMzAyIDAgUgovSW0yMzAzIDIzMDMg MCBSCi9JbTIzMDQgMjMwNCAwIFIKL0ltMjMwNSAyMzA1IDAgUgovSW0yMzA2 IDIzMDYgMCBSCi9JbTIzMDcgMjMwNyAwIFIKL0ltMjMwOCAyMzA4IDAgUgov SW0yMzA5IDIzMDkgMCBSCi9JbTIzMTAgMjMxMCAwIFIKL0ltMjMxMSAyMzEx IDAgUgovSW0yMzEyIDIzMTIgMCBSCi9JbTIzMTMgMjMxMyAwIFIKL0ltMjMx NCAyMzE0IDAgUgovSW0yMzE1IDIzMTUgMCBSCi9JbTIzMTYgMjMxNiAwIFIK L0ltMjMxNyAyMzE3IDAgUgovSW0yMzE4IDIzMTggMCBSCi9JbTIzMTkgMjMx OSAwIFIKL0ltMjMyMCAyMzIwIDAgUgovSW0yMzIxIDIzMjEgMCBSCi9JbTIz MjIgMjMyMiAwIFIKL0ltMjMyMyAyMzIzIDAgUgovSW0yMzI0IDIzMjQgMCBS Ci9JbTIzMjUgMjMyNSAwIFIKL0ltMjMyNiAyMzI2IDAgUgovSW0yMzI3IDIz MjcgMCBSCi9JbTIzMjggMjMyOCAwIFIKL0ltMjMyOSAyMzI5IDAgUgovSW0y MzMwIDIzMzAgMCBSCi9JbTIzMzEgMjMzMSAwIFIKL0ltMjMzMiAyMzMyIDAg UgovSW0yMzMzIDIzMzMgMCBSCi9JbTIzMzQgMjMzNCAwIFIKL0ltMjMzNSAy MzM1IDAgUgovSW0yMzM2IDIzMzYgMCBSCi9JbTIzMzcgMjMzNyAwIFIKL0lt MjMzOCAyMzM4IDAgUgovSW0yMzM5IDIzMzkgMCBSCi9JbTIzNDAgMjM0MCAw IFIKL0ltMjM0MSAyMzQxIDAgUgovSW0yMzQyIDIzNDIgMCBSCi9JbTIzNDMg MjM0MyAwIFIKL0ltMjM0NCAyMzQ0IDAgUgovSW0yMzQ1IDIzNDUgMCBSCi9J bTIzNDYgMjM0NiAwIFIKL0ltMjM0NyAyMzQ3IDAgUgovSW0yMzQ4IDIzNDgg MCBSCi9JbTIzNDkgMjM0OSAwIFIKL0ltMjM1MCAyMzUwIDAgUgovSW0yMzUx IDIzNTEgMCBSCi9JbTIzNTIgMjM1MiAwIFIKL0ltMjM1MyAyMzUzIDAgUgov SW0yMzU0IDIzNTQgMCBSCi9JbTIzNTUgMjM1NSAwIFIKL0ltMjM1NiAyMzU2 IDAgUgovSW0yMzU3IDIzNTcgMCBSCi9JbTIzNTggMjM1OCAwIFIKL0ltMjM1 OSAyMzU5IDAgUgovSW0yMzYwIDIzNjAgMCBSCi9JbTIzNjEgMjM2MSAwIFIK L0ltMjM2MiAyMzYyIDAgUgovSW0yMzYzIDIzNjMgMCBSCi9JbTIzNjQgMjM2 NCAwIFIKL0ltMjM2NSAyMzY1IDAgUgovSW0yMzY2IDIzNjYgMCBSCi9JbTIz NjcgMjM2NyAwIFIKL0ltMjM2OCAyMzY4IDAgUgovSW0yMzY5IDIzNjkgMCBS Ci9JbTIzNzAgMjM3MCAwIFIKL0ltMjM3MSAyMzcxIDAgUgovSW0yMzcyIDIz NzIgMCBSCi9JbTIzNzMgMjM3MyAwIFIKL0ltMjM3NCAyMzc0IDAgUgovSW0y Mzc1IDIzNzUgMCBSCi9JbTIzNzYgMjM3NiAwIFIKL0ltMjM3NyAyMzc3IDAg UgovSW0yMzc4IDIzNzggMCBSCi9JbTIzNzkgMjM3OSAwIFIKL0ltMjM4MCAy MzgwIDAgUgovSW0yMzgxIDIzODEgMCBSCi9JbTIzODIgMjM4MiAwIFIKL0lt MjM4MyAyMzgzIDAgUgovSW0yMzg0IDIzODQgMCBSCi9JbTIzODUgMjM4NSAw IFIKL0ltMjM4NiAyMzg2IDAgUgovSW0yMzg3IDIzODcgMCBSCi9JbTIzODgg MjM4OCAwIFIKL0ltMjM4OSAyMzg5IDAgUgovSW0yMzkwIDIzOTAgMCBSCi9J bTIzOTEgMjM5MSAwIFIKL0ltMjM5MiAyMzkyIDAgUgovSW0yMzkzIDIzOTMg MCBSCi9JbTIzOTQgMjM5NCAwIFIKL0ltMjM5NSAyMzk1IDAgUgovSW0yMzk2 IDIzOTYgMCBSCi9JbTIzOTcgMjM5NyAwIFIKL0ltMjM5OCAyMzk4IDAgUgov SW0yMzk5IDIzOTkgMCBSCi9JbTI0MDAgMjQwMCAwIFIKL0ltMjQwMSAyNDAx IDAgUgovSW0yNDAyIDI0MDIgMCBSCi9JbTI0MDMgMjQwMyAwIFIKL0ltMjQw NCAyNDA0IDAgUgovSW0yNDA1IDI0MDUgMCBSCi9JbTI0MDYgMjQwNiAwIFIK L0ltMjQwNyAyNDA3IDAgUgovSW0yNDA4IDI0MDggMCBSCi9JbTI0MDkgMjQw OSAwIFIKL0ltMjQxMCAyNDEwIDAgUgovSW0yNDExIDI0MTEgMCBSCi9JbTI0 MTIgMjQxMiAwIFIKL0ltMjQxMyAyNDEzIDAgUgovSW0yNDE0IDI0MTQgMCBS Ci9JbTI0MTUgMjQxNSAwIFIKL0ltMjQxNiAyNDE2IDAgUgovSW0yNDE3IDI0 MTcgMCBSCi9JbTI0MTggMjQxOCAwIFIKL0ltMjQxOSAyNDE5IDAgUgovSW0y NDIwIDI0MjAgMCBSCi9JbTI0MjEgMjQyMSAwIFIKL0ltMjQyMiAyNDIyIDAg UgovSW0yNDIzIDI0MjMgMCBSCi9JbTI0MjQgMjQyNCAwIFIKL0ltMjQyNSAy NDI1IDAgUgovSW0yNDI2IDI0MjYgMCBSCi9JbTI0MjcgMjQyNyAwIFIKL0lt MjQyOCAyNDI4IDAgUgo+PgovUGF0dGVybiA8PAovUGE3IDcgMCBSCi9QYTkg OSAwIFIKL1BhMTEgMTEgMCBSCi9QYTEzIDEzIDAgUgovUGExNSAxNSAwIFIK L1BhMTcgMTcgMCBSCi9QYTE5IDE5IDAgUgovUGEyMSAyMSAwIFIKL1BhMjMg MjMgMCBSCi9QYTI1IDI1IDAgUgovUGEyNyAyNyAwIFIKL1BhMjkgMjkgMCBS Ci9QYTMxIDMxIDAgUgovUGEzMyAzMyAwIFIKL1BhMzUgMzUgMCBSCi9QYTM3 IDM3IDAgUgovUGEzOSAzOSAwIFIKL1BhNDEgNDEgMCBSCi9QYTQzIDQzIDAg UgovUGE0NSA0NSAwIFIKL1BhNDcgNDcgMCBSCi9QYTQ5IDQ5IDAgUgovUGE1 MSA1MSAwIFIKL1BhNTMgNTMgMCBSCi9QYTU1IDU1IDAgUgovUGE1NyA1NyAw IFIKL1BhNTkgNTkgMCBSCi9QYTYxIDYxIDAgUgovUGE2MyA2MyAwIFIKL1Bh NjUgNjUgMCBSCi9QYTY3IDY3IDAgUgovUGE2OSA2OSAwIFIKL1BhMTIxMiAx MjEyIDAgUgovUGExNDE1IDE0MTUgMCBSCi9QYTE0MTcgMTQxNyAwIFIKL1Bh MTQxOSAxNDE5IDAgUgovUGExNDIxIDE0MjEgMCBSCi9QYTE0MjMgMTQyMyAw IFIKL1BhMTQyNSAxNDI1IDAgUgovUGExNDI3IDE0MjcgMCBSCi9QYTE0Mjkg MTQyOSAwIFIKL1BhMjA5NyAyMDk3IDAgUgovUGEyMDk5IDIwOTkgMCBSCi9Q YTIxMDEgMjEwMSAwIFIKL1BhMjEwMyAyMTAzIDAgUgovUGEyMTA1IDIxMDUg MCBSCi9QYTIxMDcgMjEwNyAwIFIKL1BhMjEwOSAyMTA5IDAgUgovUGEyMTEx IDIxMTEgMCBSCi9QYTIxMTMgMjExMyAwIFIKL1BhMjExNSAyMTE1IDAgUgov UGEyMTE3IDIxMTcgMCBSCi9QYTIxMTkgMjExOSAwIFIKPj4KL1Byb2NTZXQg Wy9QREYgL1RleHQgL0ltYWdlQiAvSW1hZ2VDXSA+PgovQ29udGVudHMgMjQy OSAwIFIKPj4KZW5kb2JqCgo0IDAgb2JqCjw8Ci9UeXBlIC9QYWdlcwovS2lk cyBbCjYgMCBSCl0KL0NvdW50IDEKPj4KZW5kb2JqCgoxMjE4IDAgb2JqCjw8 Ci9UeXBlIC9Gb250RGVzY3JpcHRvcgovQXNjZW50IDkzMwovQ2FwSGVpZ2h0 IDc5MAovRGVzY2VudCAtMjEwCi9GbGFncyAzMgovRm9udEJCb3ggWzAgLTIx MCAxMTM3IDkzM10KL0l0YWxpY0FuZ2xlIDAKL1N0ZW1WIDAKL0ZvbnROYW1l IC9BcmlhbE5hcnJvdy1Cb2xkCj4+CmVuZG9iagoKMTIxNiAwIG9iago8PAov VHlwZSAvRm9udAovU3VidHlwZSAvVHJ1ZVR5cGUKL0Jhc2VGb250IC9Bcmlh bE5hcnJvdy1Cb2xkCi9FbmNvZGluZyAvV2luQW5zaUVuY29kaW5nCi9GaXJz dENoYXIgMAovTGFzdENoYXIgMjU1Ci9Gb250RGVzY3JpcHRvciAxMjE4IDAg UgovV2lkdGhzIDEyMTcgMCBSCj4+CmVuZG9iagoKMTIyMSAwIG9iago8PAov VHlwZSAvRm9udERlc2NyaXB0b3IKL0FzY2VudCA5MjIKL0NhcEhlaWdodCA3 OTAKL0Rlc2NlbnQgLTIxMAovRmxhZ3MgMzIKL0ZvbnRCQm94IFswIC0yMTAg MTE4MiA5MjJdCi9JdGFsaWNBbmdsZSAwCi9TdGVtViAwCi9Gb250TmFtZSAv QXJpYWxOYXJyb3cKPj4KZW5kb2JqCgoxMjE5IDAgb2JqCjw8Ci9UeXBlIC9G b250Ci9TdWJ0eXBlIC9UcnVlVHlwZQovQmFzZUZvbnQgL0FyaWFsTmFycm93 Ci9FbmNvZGluZyAvV2luQW5zaUVuY29kaW5nCi9GaXJzdENoYXIgMAovTGFz dENoYXIgMjU1Ci9Gb250RGVzY3JpcHRvciAxMjIxIDAgUgovV2lkdGhzIDEy MjAgMCBSCj4+CmVuZG9iagoKMTQzNCAwIG9iago8PAovVHlwZSAvRm9udERl c2NyaXB0b3IKL0FzY2VudCA4OTEKL0NhcEhlaWdodCA3ODQKL0Rlc2NlbnQg LTIxNgovRmxhZ3MgMzQKL0ZvbnRCQm94IFswIC0yMTYgMjU2OCA4OTFdCi9J dGFsaWNBbmdsZSAwCi9TdGVtViAwCi9Gb250TmFtZSAvVGltZXNOZXdSb21h blBTTVQKPj4KZW5kb2JqCgoxNDMyIDAgb2JqCjw8Ci9UeXBlIC9Gb250Ci9T dWJ0eXBlIC9UcnVlVHlwZQovQmFzZUZvbnQgL1RpbWVzTmV3Um9tYW5QU01U Ci9FbmNvZGluZyAvV2luQW5zaUVuY29kaW5nCi9GaXJzdENoYXIgMAovTGFz dENoYXIgMjU1Ci9Gb250RGVzY3JpcHRvciAxNDM0IDAgUgovV2lkdGhzIDE0 MzMgMCBSCj4+CmVuZG9iagoKMTQzNyAwIG9iago8PAovVHlwZSAvRm9udERl c2NyaXB0b3IKL0FzY2VudCA4NjIKL0NhcEhlaWdodCA3MzcKL0Rlc2NlbnQg LTI2MwovRmxhZ3MgMzQKL0ZvbnRCQm94IFswIC0yNjMgMTMxNSA4NjJdCi9J dGFsaWNBbmdsZSAwCi9TdGVtViAwCi9Gb250TmFtZSAvR2FyYW1vbmQtQm9s ZAo+PgplbmRvYmoKCjE0MzUgMCBvYmoKPDwKL1R5cGUgL0ZvbnQKL1N1YnR5 cGUgL1RydWVUeXBlCi9CYXNlRm9udCAvR2FyYW1vbmQtQm9sZAovRW5jb2Rp bmcgL1dpbkFuc2lFbmNvZGluZwovRmlyc3RDaGFyIDAKL0xhc3RDaGFyIDI1 NQovRm9udERlc2NyaXB0b3IgMTQzNyAwIFIKL1dpZHRocyAxNDM2IDAgUgo+ PgplbmRvYmoKCjE0NDAgMCBvYmoKPDwKL1R5cGUgL0ZvbnREZXNjcmlwdG9y Ci9Bc2NlbnQgODkxCi9DYXBIZWlnaHQgNzg0Ci9EZXNjZW50IC0yMTYKL0Zs YWdzIDM0Ci9Gb250QkJveCBbMCAtMjE2IDI1NTggODkxXQovSXRhbGljQW5n bGUgMAovU3RlbVYgMAovRm9udE5hbWUgL1RpbWVzTmV3Um9tYW5QUy1Cb2xk TVQKPj4KZW5kb2JqCgoxNDM4IDAgb2JqCjw8Ci9UeXBlIC9Gb250Ci9TdWJ0 eXBlIC9UcnVlVHlwZQovQmFzZUZvbnQgL1RpbWVzTmV3Um9tYW5QUy1Cb2xk TVQKL0VuY29kaW5nIC9XaW5BbnNpRW5jb2RpbmcKL0ZpcnN0Q2hhciAwCi9M YXN0Q2hhciAyNTUKL0ZvbnREZXNjcmlwdG9yIDE0NDAgMCBSCi9XaWR0aHMg MTQzOSAwIFIKPj4KZW5kb2JqCgoxNDQzIDAgb2JqCjw8Ci9UeXBlIC9Gb250 RGVzY3JpcHRvcgovQXNjZW50IDkwNQovQ2FwSGVpZ2h0IDc4OAovRGVzY2Vu dCAtMjEyCi9GbGFncyAzMgovRm9udEJCb3ggWzAgLTIxMiAyNjI4IDkwNV0K L0l0YWxpY0FuZ2xlIDAKL1N0ZW1WIDAKL0ZvbnROYW1lIC9BcmlhbC1Cb2xk TVQKPj4KZW5kb2JqCgoxNDQxIDAgb2JqCjw8Ci9UeXBlIC9Gb250Ci9TdWJ0 eXBlIC9UcnVlVHlwZQovQmFzZUZvbnQgL0FyaWFsLUJvbGRNVAovRW5jb2Rp bmcgL1dpbkFuc2lFbmNvZGluZwovRmlyc3RDaGFyIDAKL0xhc3RDaGFyIDI1 NQovRm9udERlc2NyaXB0b3IgMTQ0MyAwIFIKL1dpZHRocyAxNDQyIDAgUgo+ PgplbmRvYmoKCjE0NDYgMCBvYmoKPDwKL1R5cGUgL0ZvbnREZXNjcmlwdG9y Ci9Bc2NlbnQgODYyCi9DYXBIZWlnaHQgNzM3Ci9EZXNjZW50IC0yNjMKL0Zs YWdzIDM0Ci9Gb250QkJveCBbMCAtMjYzIDEyMDIgODYyXQovSXRhbGljQW5n bGUgMAovU3RlbVYgMAovRm9udE5hbWUgL0dhcmFtb25kCj4+CmVuZG9iagoK MTQ0NCAwIG9iago8PAovVHlwZSAvRm9udAovU3VidHlwZSAvVHJ1ZVR5cGUK L0Jhc2VGb250IC9HYXJhbW9uZAovRW5jb2RpbmcgL1dpbkFuc2lFbmNvZGlu ZwovRmlyc3RDaGFyIDAKL0xhc3RDaGFyIDI1NQovRm9udERlc2NyaXB0b3Ig MTQ0NiAwIFIKL1dpZHRocyAxNDQ1IDAgUgo+PgplbmRvYmoKCjE0NDkgMCBv YmoKPDwKL1R5cGUgL0ZvbnREZXNjcmlwdG9yCi9Bc2NlbnQgOTUyCi9DYXBI ZWlnaHQgNzMxCi9EZXNjZW50IC0yNjkKL0ZsYWdzIDM0Ci9Gb250QkJveCBb MCAtMjY5IDE3MjcgOTUyXQovSXRhbGljQW5nbGUgMAovU3RlbVYgMAovRm9u dE5hbWUgL0NvbnN0YW50aWEtQm9sZAo+PgplbmRvYmoKCjE0NDcgMCBvYmoK PDwKL1R5cGUgL0ZvbnQKL1N1YnR5cGUgL1RydWVUeXBlCi9CYXNlRm9udCAv Q29uc3RhbnRpYS1Cb2xkCi9FbmNvZGluZyAvV2luQW5zaUVuY29kaW5nCi9G aXJzdENoYXIgMAovTGFzdENoYXIgMjU1Ci9Gb250RGVzY3JpcHRvciAxNDQ5 IDAgUgovV2lkdGhzIDE0NDggMCBSCj4+CmVuZG9iagoKMTQ1MiAwIG9iago8 PAovVHlwZSAvRm9udERlc2NyaXB0b3IKL0FzY2VudCA5MDUKL0NhcEhlaWdo dCA3ODgKL0Rlc2NlbnQgLTIxMgovRmxhZ3MgMzIKL0ZvbnRCQm94IFswIC0y MTIgMjY2NSA5MDVdCi9JdGFsaWNBbmdsZSAwCi9TdGVtViAwCi9Gb250TmFt ZSAvQXJpYWxNVAo+PgplbmRvYmoKCjE0NTAgMCBvYmoKPDwKL1R5cGUgL0Zv bnQKL1N1YnR5cGUgL1RydWVUeXBlCi9CYXNlRm9udCAvQXJpYWxNVAovRW5j b2RpbmcgL1dpbkFuc2lFbmNvZGluZwovRmlyc3RDaGFyIDAKL0xhc3RDaGFy IDI1NQovRm9udERlc2NyaXB0b3IgMTQ1MiAwIFIKL1dpZHRocyAxNDUxIDAg Ugo+PgplbmRvYmoKCjE0NTUgMCBvYmoKPDwKL1R5cGUgL0ZvbnREZXNjcmlw dG9yCi9Bc2NlbnQgOTQxCi9DYXBIZWlnaHQgNzY5Ci9EZXNjZW50IC0yMzEK L0ZsYWdzIDM0Ci9Gb250QkJveCBbMCAtMjMxIDE2NTUgOTQxXQovSXRhbGlj QW5nbGUgMAovU3RlbVYgMAovRm9udE5hbWUgL0Jvb2ttYW5PbGRTdHlsZS1C b2xkCj4+CmVuZG9iagoKMTQ1MyAwIG9iago8PAovVHlwZSAvRm9udAovU3Vi dHlwZSAvVHJ1ZVR5cGUKL0Jhc2VGb250IC9Cb29rbWFuT2xkU3R5bGUtQm9s ZAovRW5jb2RpbmcgL1dpbkFuc2lFbmNvZGluZwovRmlyc3RDaGFyIDAKL0xh c3RDaGFyIDI1NQovRm9udERlc2NyaXB0b3IgMTQ1NSAwIFIKL1dpZHRocyAx NDU0IDAgUgo+PgplbmRvYmoKCjE0NTggMCBvYmoKPDwKL1R5cGUgL0ZvbnRE ZXNjcmlwdG9yCi9Bc2NlbnQgODk0Ci9DYXBIZWlnaHQgNzY5Ci9EZXNjZW50 IC0yMzEKL0ZsYWdzIDM0Ci9Gb250QkJveCBbMCAtMjMxIDE1MDMgODk0XQov SXRhbGljQW5nbGUgMAovU3RlbVYgMAovRm9udE5hbWUgL0Jvb2ttYW5PbGRT dHlsZQo+PgplbmRvYmoKCjE0NTYgMCBvYmoKPDwKL1R5cGUgL0ZvbnQKL1N1 YnR5cGUgL1RydWVUeXBlCi9CYXNlRm9udCAvQm9va21hbk9sZFN0eWxlCi9F bmNvZGluZyAvV2luQW5zaUVuY29kaW5nCi9GaXJzdENoYXIgMAovTGFzdENo YXIgMjU1Ci9Gb250RGVzY3JpcHRvciAxNDU4IDAgUgovV2lkdGhzIDE0NTcg MCBSCj4+CmVuZG9iagoKMTQ2MSAwIG9iago8PAovVHlwZSAvRm9udERlc2Ny aXB0b3IKL0FzY2VudCA5NTAKL0NhcEhlaWdodCA3NzgKL0Rlc2NlbnQgLTIy MgovRmxhZ3MgMzQKL0ZvbnRCQm94IFswIC0yMjIgMTcxMiA5NTBdCi9JdGFs aWNBbmdsZSAwCi9TdGVtViAwCi9Gb250TmFtZSAvQ2FtYnJpYS1Cb2xkCj4+ CmVuZG9iagoKMTQ1OSAwIG9iago8PAovVHlwZSAvRm9udAovU3VidHlwZSAv VHJ1ZVR5cGUKL0Jhc2VGb250IC9DYW1icmlhLUJvbGQKL0VuY29kaW5nIC9X aW5BbnNpRW5jb2RpbmcKL0ZpcnN0Q2hhciAwCi9MYXN0Q2hhciAyNTUKL0Zv bnREZXNjcmlwdG9yIDE0NjEgMCBSCi9XaWR0aHMgMTQ2MCAwIFIKPj4KZW5k b2JqCgoxNDY0IDAgb2JqCjw8Ci9UeXBlIC9Gb250RGVzY3JpcHRvcgovQXNj ZW50IDExMDEKL0NhcEhlaWdodCA2OTAKL0Rlc2NlbnQgLTMxMAovRmxhZ3Mg OTYKL0ZvbnRCQm94IFswIC0zMTAgMTY4OCAxMTAxXQovSXRhbGljQW5nbGUg MAovU3RlbVYgMAovRm9udE5hbWUgL0FyaWFsLUJsYWNrSXRhbGljCj4+CmVu ZG9iagoKMTQ2MiAwIG9iago8PAovVHlwZSAvRm9udAovU3VidHlwZSAvVHJ1 ZVR5cGUKL0Jhc2VGb250IC9BcmlhbC1CbGFja0l0YWxpYwovRW5jb2Rpbmcg L1dpbkFuc2lFbmNvZGluZwovRmlyc3RDaGFyIDAKL0xhc3RDaGFyIDI1NQov Rm9udERlc2NyaXB0b3IgMTQ2NCAwIFIKL1dpZHRocyAxNDYzIDAgUgo+Pgpl bmRvYmoKCjE0NjcgMCBvYmoKPDwKL1R5cGUgL0ZvbnREZXNjcmlwdG9yCi9B c2NlbnQgMTEwMQovQ2FwSGVpZ2h0IDY5MAovRGVzY2VudCAtMzEwCi9GbGFn cyAzMgovRm9udEJCb3ggWzAgLTMxMCAxODgyIDExMDFdCi9JdGFsaWNBbmds ZSAwCi9TdGVtViAwCi9Gb250TmFtZSAvQXJpYWwtQmxhY2sKPj4KZW5kb2Jq CgoxNDY1IDAgb2JqCjw8Ci9UeXBlIC9Gb250Ci9TdWJ0eXBlIC9UcnVlVHlw ZQovQmFzZUZvbnQgL0FyaWFsLUJsYWNrCi9FbmNvZGluZyAvV2luQW5zaUVu Y29kaW5nCi9GaXJzdENoYXIgMAovTGFzdENoYXIgMjU1Ci9Gb250RGVzY3Jp cHRvciAxNDY3IDAgUgovV2lkdGhzIDE0NjYgMCBSCj4+CmVuZG9iagoKNSAw IG9iagpudWxsCmVuZG9iagoKeHJlZgowIDI0MzAKMDAwMDAwMDAwMCA2NTUz NSBmIAowMDAwOTAyMjQ5IDAwMDAwIG4gCjAwMDAwMDAwMTUgMDAwMDAgbiAK MDAwMDkwMjI4MCAwMDAwMCBuIAowMDAxMDUyNjU3IDAwMDAwIG4gCjAwMDEw NTc2NzcgMDAwMDAgbiAKMDAwMTAxNDc3NyAwMDAwMCBuIAowMDAwMDAwNTAx IDAwMDAwIG4gCjAwMDAwMDAxNzcgMDAwMDAgbiAKMDAwMDAwMTEyMSAwMDAw MCBuIAowMDAwMDAwNzkyIDAwMDAwIG4gCjAwMDAwMDE3MzkgMDAwMDAgbiAK MDAwMDAwMTQxNSAwMDAwMCBuIAowMDAwMDAyMzY5IDAwMDAwIG4gCjAwMDAw MDIwMzQgMDAwMDAgbiAKMDAwMDAwMjk5NCAwMDAwMCBuIAowMDAwMDAyNjY0 IDAwMDAwIG4gCjAwMDAwMDM2MTggMDAwMDAgbiAKMDAwMDAwMzI4OSAwMDAw MCBuIAowMDAwMDA0MjM2IDAwMDAwIG4gCjAwMDAwMDM5MTMgMDAwMDAgbiAK MDAwMDAwNDg2MyAwMDAwMCBuIAowMDAwMDA0NTMxIDAwMDAwIG4gCjAwMDAw MDU0OTAgMDAwMDAgbiAKMDAwMDAwNTE1OCAwMDAwMCBuIAowMDAwMDA2MTEx IDAwMDAwIG4gCjAwMDAwMDU3ODUgMDAwMDAgbiAKMDAwMDAwNjczNSAwMDAw MCBuIAowMDAwMDA2NDA2IDAwMDAwIG4gCjAwMDAwMDczNTUgMDAwMDAgbiAK MDAwMDAwNzAzMCAwMDAwMCBuIAowMDAwMDA3OTg1IDAwMDAwIG4gCjAwMDAw MDc2NTAgMDAwMDAgbiAKMDAwMDAwODYxMCAwMDAwMCBuIAowMDAwMDA4Mjgw IDAwMDAwIG4gCjAwMDAwMDkyMzQgMDAwMDAgbiAKMDAwMDAwODkwNSAwMDAw MCBuIAowMDAwMDA5ODUzIDAwMDAwIG4gCjAwMDAwMDk1MjkgMDAwMDAgbiAK MDAwMDAxMDQ4MCAwMDAwMCBuIAowMDAwMDEwMTQ4IDAwMDAwIG4gCjAwMDAw MTExMDEgMDAwMDAgbiAKMDAwMDAxMDc3NSAwMDAwMCBuIAowMDAwMDExNzI1 IDAwMDAwIG4gCjAwMDAwMTEzOTYgMDAwMDAgbiAKMDAwMDAxMjM0NCAwMDAw MCBuIAowMDAwMDEyMDIwIDAwMDAwIG4gCjAwMDAwMTI5NzQgMDAwMDAgbiAK MDAwMDAxMjYzOSAwMDAwMCBuIAowMDAwMDEzNTk5IDAwMDAwIG4gCjAwMDAw MTMyNjkgMDAwMDAgbiAKMDAwMDAxNDIyMyAwMDAwMCBuIAowMDAwMDEzODk0 IDAwMDAwIG4gCjAwMDAwMTQ4NDEgMDAwMDAgbiAKMDAwMDAxNDUxOCAwMDAw MCBuIAowMDAwMDE1NDY2IDAwMDAwIG4gCjAwMDAwMTUxMzYgMDAwMDAgbiAK MDAwMDAxNjA4NSAwMDAwMCBuIAowMDAwMDE1NzYxIDAwMDAwIG4gCjAwMDAw MTY3MDYgMDAwMDAgbiAKMDAwMDAxNjM4MCAwMDAwMCBuIAowMDAwMDE3MzI0 IDAwMDAwIG4gCjAwMDAwMTcwMDEgMDAwMDAgbiAKMDAwMDAxNzk1MiAwMDAw MCBuIAowMDAwMDE3NjE5IDAwMDAwIG4gCjAwMDAwMTg1NzUgMDAwMDAgbiAK MDAwMDAxODI0NyAwMDAwMCBuIAowMDAwMDE5MTk2IDAwMDAwIG4gCjAwMDAw MTg4NzAgMDAwMDAgbiAKMDAwMDAxOTgxMyAwMDAwMCBuIAowMDAwMDE5NDkx IDAwMDAwIG4gCjAwMDAwMjAxMDggMDAwMDAgbiAKMDAwMDAyMDMyOSAwMDAw MCBuIAowMDAwMDIwNTM3IDAwMDAwIG4gCjAwMDAwMjA3NTEgMDAwMDAgbiAK MDAwMDAyMDk2OSAwMDAwMCBuIAowMDAwMDIxMTg1IDAwMDAwIG4gCjAwMDAw MjEzOTkgMDAwMDAgbiAKMDAwMDAyMTYxMyAwMDAwMCBuIAowMDAwMDIxODI3 IDAwMDAwIG4gCjAwMDAwMjIwNDEgMDAwMDAgbiAKMDAwMDAyMjI1OCAwMDAw MCBuIAowMDAwMDIyNDc0IDAwMDAwIG4gCjAwMDAwMjI2OTMgMDAwMDAgbiAK MDAwMDAyMjkxMiAwMDAwMCBuIAowMDAwMDIzMTMwIDAwMDAwIG4gCjAwMDAw MjMzNDggMDAwMDAgbiAKMDAwMDAyMzU3NiAwMDAwMCBuIAowMDAwMDIzODE5 IDAwMDAwIG4gCjAwMDAwMjQwNjQgMDAwMDAgbiAKMDAwMDAyNDI5OSAwMDAw MCBuIAowMDAwMDI0NTI2IDAwMDAwIG4gCjAwMDAwMjQ3NDIgMDAwMDAgbiAK MDAwMDAyNDk2OSAwMDAwMCBuIAowMDAwMDI1MjAyIDAwMDAwIG4gCjAwMDAw MjU0MjggMDAwMDAgbiAKMDAwMDAyNTY1NSAwMDAwMCBuIAowMDAwMDI1ODg4 IDAwMDAwIG4gCjAwMDAwMjYxMjEgMDAwMDAgbiAKMDAwMDAyNjM1NCAwMDAw MCBuIAowMDAwMDI2NTg3IDAwMDAwIG4gCjAwMDAwMjY4MTYgMDAwMDAgbiAK MDAwMDAyNzA0NSAwMDAwMCBuIAowMDAwMDI3Mjc0IDAwMDAwIG4gCjAwMDAw Mjc0OTYgMDAwMDAgbiAKMDAwMDAyNzcyNCAwMDAwMCBuIAowMDAwMDI3OTU4 IDAwMDAwIG4gCjAwMDAwMjgxODUgMDAwMDAgbiAKMDAwMDAyODQxMiAwMDAw MCBuIAowMDAwMDI4NjM4IDAwMDAwIG4gCjAwMDAwMjg4NTYgMDAwMDAgbiAK MDAwMDAyOTA3MiAwMDAwMCBuIAowMDAwMDI5MjkwIDAwMDAwIG4gCjAwMDAw Mjk1MTQgMDAwMDAgbiAKMDAwMDAyOTczMCAwMDAwMCBuIAowMDAwMDI5OTQ2 IDAwMDAwIG4gCjAwMDAwMzAxNjIgMDAwMDAgbiAKMDAwMDAzMDM4MSAwMDAw MCBuIAowMDAwMDMwNTk5IDAwMDAwIG4gCjAwMDAwMzA4MTcgMDAwMDAgbiAK MDAwMDAzMTAzNiAwMDAwMCBuIAowMDAwMDMxMjU0IDAwMDAwIG4gCjAwMDAw MzE0NzIgMDAwMDAgbiAKMDAwMDAzMTY5MCAwMDAwMCBuIAowMDAwMDMxOTA4 IDAwMDAwIG4gCjAwMDAwMzIxMjcgMDAwMDAgbiAKMDAwMDAzMjM0MyAwMDAw MCBuIAowMDAwMDMyNTYxIDAwMDAwIG4gCjAwMDAwMzI3OTEgMDAwMDAgbiAK MDAwMDAzMzAwOSAwMDAwMCBuIAowMDAwMDMzMjI3IDAwMDAwIG4gCjAwMDAw MzM0NDggMDAwMDAgbiAKMDAwMDAzMzY2OCAwMDAwMCBuIAowMDAwMDMzODg2 IDAwMDAwIG4gCjAwMDAwMzQxMDYgMDAwMDAgbiAKMDAwMDAzNDMzMiAwMDAw MCBuIAowMDAwMDM0NTUxIDAwMDAwIG4gCjAwMDAwMzQ3NjkgMDAwMDAgbiAK MDAwMDAzNDk4NyAwMDAwMCBuIAowMDAwMDM1MjA3IDAwMDAwIG4gCjAwMDAw MzU0MjggMDAwMDAgbiAKMDAwMDAzNTY0NyAwMDAwMCBuIAowMDAwMDM1ODY4 IDAwMDAwIG4gCjAwMDAwMzYwODggMDAwMDAgbiAKMDAwMDAzNjMxMSAwMDAw MCBuIAowMDAwMDM2NTMzIDAwMDAwIG4gCjAwMDAwMzY3NTMgMDAwMDAgbiAK MDAwMDAzNjk3MiAwMDAwMCBuIAowMDAwMDM3MTkyIDAwMDAwIG4gCjAwMDAw Mzc0MTEgMDAwMDAgbiAKMDAwMDAzNzYzMCAwMDAwMCBuIAowMDAwMDM3ODU1 IDAwMDAwIG4gCjAwMDAwMzgwNzQgMDAwMDAgbiAKMDAwMDAzODI5NCAwMDAw MCBuIAowMDAwMDM4NTE0IDAwMDAwIG4gCjAwMDAwMzg3MzYgMDAwMDAgbiAK MDAwMDAzODk1NCAwMDAwMCBuIAowMDAwMDM5MTczIDAwMDAwIG4gCjAwMDAw MzkzOTMgMDAwMDAgbiAKMDAwMDAzOTYxNCAwMDAwMCBuIAowMDAwMDM5ODQw IDAwMDAwIG4gCjAwMDAwNDAwNzAgMDAwMDAgbiAKMDAwMDA0MDI5NCAwMDAw MCBuIAowMDAwMDQwNTEyIDAwMDAwIG4gCjAwMDAwNDA3MzMgMDAwMDAgbiAK MDAwMDA0MDk1MyAwMDAwMCBuIAowMDAwMDQxMTgxIDAwMDAwIG4gCjAwMDAw NDE0MDMgMDAwMDAgbiAKMDAwMDA0MTYyMyAwMDAwMCBuIAowMDAwMDQxODQx IDAwMDAwIG4gCjAwMDAwNDIwNjMgMDAwMDAgbiAKMDAwMDA0MjI4MSAwMDAw MCBuIAowMDAwMDQyNTAxIDAwMDAwIG4gCjAwMDAwNDI3MjMgMDAwMDAgbiAK MDAwMDA0Mjk0NSAwMDAwMCBuIAowMDAwMDQzMTY2IDAwMDAwIG4gCjAwMDAw NDMzODcgMDAwMDAgbiAKMDAwMDA0MzYwNyAwMDAwMCBuIAowMDAwMDQzODMz IDAwMDAwIG4gCjAwMDAwNDQwNjIgMDAwMDAgbiAKMDAwMDA0NDI4NCAwMDAw MCBuIAowMDAwMDQ0NTAyIDAwMDAwIG4gCjAwMDAwNDQ3MjggMDAwMDAgbiAK MDAwMDA0NDk0OSAwMDAwMCBuIAowMDAwMDQ1MTY5IDAwMDAwIG4gCjAwMDAw NDUzODcgMDAwMDAgbiAKMDAwMDA0NTYwNSAwMDAwMCBuIAowMDAwMDQ1ODI4 IDAwMDAwIG4gCjAwMDAwNDYwNDYgMDAwMDAgbiAKMDAwMDA0NjI2MiAwMDAw MCBuIAowMDAwMDQ2NDgwIDAwMDAwIG4gCjAwMDAwNDY3MDEgMDAwMDAgbiAK MDAwMDA0NjkyNyAwMDAwMCBuIAowMDAwMDQ3MTQ3IDAwMDAwIG4gCjAwMDAw NDczNzEgMDAwMDAgbiAKMDAwMDA0NzU4OSAwMDAwMCBuIAowMDAwMDQ3ODA4 IDAwMDAwIG4gCjAwMDAwNDgwMjkgMDAwMDAgbiAKMDAwMDA0ODI1MCAwMDAw MCBuIAowMDAwMDQ4NDc0IDAwMDAwIG4gCjAwMDAwNDg3MDIgMDAwMDAgbiAK MDAwMDA0ODkyNiAwMDAwMCBuIAowMDAwMDQ5MTQ0IDAwMDAwIG4gCjAwMDAw NDkzNjggMDAwMDAgbiAKMDAwMDA0OTU4OCAwMDAwMCBuIAowMDAwMDQ5ODEw IDAwMDAwIG4gCjAwMDAwNTAwMzQgMDAwMDAgbiAKMDAwMDA1MDI1MiAwMDAw MCBuIAowMDAwMDUwNDc0IDAwMDAwIG4gCjAwMDAwNTA2OTIgMDAwMDAgbiAK MDAwMDA1MDkxNCAwMDAwMCBuIAowMDAwMDUxMTMyIDAwMDAwIG4gCjAwMDAw NTEzNTYgMDAwMDAgbiAKMDAwMDA1MTU3NyAwMDAwMCBuIAowMDAwMDUxNzkz IDAwMDAwIG4gCjAwMDAwNTIwMjAgMDAwMDAgbiAKMDAwMDA1MjI0MSAwMDAw MCBuIAowMDAwMDUyNDY4IDAwMDAwIG4gCjAwMDAwNTI2OTIgMDAwMDAgbiAK MDAwMDA1MjkxMCAwMDAwMCBuIAowMDAwMDUzMTI2IDAwMDAwIG4gCjAwMDAw NTMzNTAgMDAwMDAgbiAKMDAwMDA1MzU3NCAwMDAwMCBuIAowMDAwMDUzODAw IDAwMDAwIG4gCjAwMDAwNTQwMjAgMDAwMDAgbiAKMDAwMDA1NDI0NiAwMDAw MCBuIAowMDAwMDU0NDY2IDAwMDAwIG4gCjAwMDAwNTQ2OTEgMDAwMDAgbiAK MDAwMDA1NDkxNyAwMDAwMCBuIAowMDAwMDU1MTM3IDAwMDAwIG4gCjAwMDAw NTUzNTggMDAwMDAgbiAKMDAwMDA1NTU3OSAwMDAwMCBuIAowMDAwMDU1ODAz IDAwMDAwIG4gCjAwMDAwNTYwMzAgMDAwMDAgbiAKMDAwMDA1NjI1NiAwMDAw MCBuIAowMDAwMDU2NDgzIDAwMDAwIG4gCjAwMDAwNTY3MDMgMDAwMDAgbiAK MDAwMDA1NjkyNyAwMDAwMCBuIAowMDAwMDU3MTQ4IDAwMDAwIG4gCjAwMDAw NTczNzQgMDAwMDAgbiAKMDAwMDA1NzU5OSAwMDAwMCBuIAowMDAwMDU3ODI2 IDAwMDAwIG4gCjAwMDAwNTgwNTAgMDAwMDAgbiAKMDAwMDA1ODI3MSAwMDAw MCBuIAowMDAwMDU4NDkxIDAwMDAwIG4gCjAwMDAwNTg3MTggMDAwMDAgbiAK MDAwMDA1ODk0MiAwMDAwMCBuIAowMDAwMDU5MTYyIDAwMDAwIG4gCjAwMDAw NTkzODggMDAwMDAgbiAKMDAwMDA1OTYwNiAwMDAwMCBuIAowMDAwMDU5ODMx IDAwMDAwIG4gCjAwMDAwNjAwNTEgMDAwMDAgbiAKMDAwMDA2MDI2NyAwMDAw MCBuIAowMDAwMDYwNDgzIDAwMDAwIG4gCjAwMDAwNjA3MDEgMDAwMDAgbiAK MDAwMDA2MDkxOSAwMDAwMCBuIAowMDAwMDYxMTM1IDAwMDAwIG4gCjAwMDAw NjE0MDkgMDAwMDAgbiAKMDAwMDA2MTYzMSAwMDAwMCBuIAowMDAwMDYxODUz IDAwMDAwIG4gCjAwMDAwNjIwNzUgMDAwMDAgbiAKMDAwMDA2MjI5MSAwMDAw MCBuIAowMDAwMDYyNTEzIDAwMDAwIG4gCjAwMDAwNjI3MjMgMDAwMDAgbiAK MDAwMDA2MjkzMyAwMDAwMCBuIAowMDAwMDYzMTQzIDAwMDAwIG4gCjAwMDAw NjMzNjUgMDAwMDAgbiAKMDAwMDA2MzU3NSAwMDAwMCBuIAowMDAwMDYzNzg1 IDAwMDAwIG4gCjAwMDAwNjQwMDcgMDAwMDAgbiAKMDAwMDA2NDIyOSAwMDAw MCBuIAowMDAwMDY0NDM5IDAwMDAwIG4gCjAwMDAwNjQ2NTUgMDAwMDAgbiAK MDAwMDA2NDg3MSAwMDAwMCBuIAowMDAwMDY1MDg3IDAwMDAwIG4gCjAwMDAw NjUyOTcgMDAwMDAgbiAKMDAwMDA2NTUxOSAwMDAwMCBuIAowMDAwMDY1NzI5 IDAwMDAwIG4gCjAwMDAwNjU5MzkgMDAwMDAgbiAKMDAwMDA2NjE0OSAwMDAw MCBuIAowMDAwMDY2MzU5IDAwMDAwIG4gCjAwMDAwNjY1ODEgMDAwMDAgbiAK MDAwMDA2NjgwMyAwMDAwMCBuIAowMDAwMDY3MDEzIDAwMDAwIG4gCjAwMDAw NjcyMjkgMDAwMDAgbiAKMDAwMDA2NzQ1MSAwMDAwMCBuIAowMDAwMDY3NjYx IDAwMDAwIG4gCjAwMDAwNjc4OTEgMDAwMDAgbiAKMDAwMDA2ODEwMSAwMDAw MCBuIAowMDAwMDY4MzIzIDAwMDAwIG4gCjAwMDAwNjg1MzkgMDAwMDAgbiAK MDAwMDA2ODc2MSAwMDAwMCBuIAowMDAwMDY4OTcxIDAwMDAwIG4gCjAwMDAw NjkxODEgMDAwMDAgbiAKMDAwMDA2OTQxOSAwMDAwMCBuIAowMDAwMDY5NjQx IDAwMDAwIG4gCjAwMDAwNjk4NTEgMDAwMDAgbiAKMDAwMDA3MDA5OSAwMDAw MCBuIAowMDAwMDcwMzIzIDAwMDAwIG4gCjAwMDAwNzA1NTUgMDAwMDAgbiAK MDAwMDA3MDc3OSAwMDAwMCBuIAowMDAwMDcxMDA1IDAwMDAwIG4gCjAwMDAw NzEyMzUgMDAwMDAgbiAKMDAwMDA3MTQ2NSAwMDAwMCBuIAowMDAwMDcxNjk1 IDAwMDAwIG4gCjAwMDAwNzE5MzUgMDAwMDAgbiAKMDAwMDA3MjE1NyAwMDAw MCBuIAowMDAwMDcyMzczIDAwMDAwIG4gCjAwMDAwNzI2NDEgMDAwMDAgbiAK MDAwMDA3Mjg2MyAwMDAwMCBuIAowMDAwMDczMDg1IDAwMDAwIG4gCjAwMDAw NzMzMzkgMDAwMDAgbiAKMDAwMDA3MzU2MSAwMDAwMCBuIAowMDAwMDczNzgz IDAwMDAwIG4gCjAwMDAwNzQwMjkgMDAwMDAgbiAKMDAwMDA3NDI2OSAwMDAw MCBuIAowMDAwMDc0NTA2IDAwMDAwIG4gCjAwMDAwNzQ3NDYgMDAwMDAgbiAK MDAwMDA3NDk2NCAwMDAwMCBuIAowMDAwMDc1MTk0IDAwMDAwIG4gCjAwMDAw NzU0MzYgMDAwMDAgbiAKMDAwMDA3NTY1NCAwMDAwMCBuIAowMDAwMDc1ODcy IDAwMDAwIG4gCjAwMDAwNzYxMDAgMDAwMDAgbiAKMDAwMDA3NjMzNCAwMDAw MCBuIAowMDAwMDc2NTg5IDAwMDAwIG4gCjAwMDAwNzY4NjIgMDAwMDAgbiAK MDAwMDA3NzA5NiAwMDAwMCBuIAowMDAwMDc3MzIzIDAwMDAwIG4gCjAwMDAw Nzc1NTAgMDAwMDAgbiAKMDAwMDA3Nzc4MyAwMDAwMCBuIAowMDAwMDc4MDMw IDAwMDAwIG4gCjAwMDAwNzgyNzQgMDAwMDAgbiAKMDAwMDA3ODQ5MCAwMDAw MCBuIAowMDAwMDc4NzE4IDAwMDAwIG4gCjAwMDAwNzg5NDIgMDAwMDAgbiAK MDAwMDA3OTE1OCAwMDAwMCBuIAowMDAwMDc5MzY4IDAwMDAwIG4gCjAwMDAw Nzk1OTAgMDAwMDAgbiAKMDAwMDA3OTgxMiAwMDAwMCBuIAowMDAwMDgwMDQy IDAwMDAwIG4gCjAwMDAwODAyNjYgMDAwMDAgbiAKMDAwMDA4MDQ4MiAwMDAw MCBuIAowMDAwMDgwNjk4IDAwMDAwIG4gCjAwMDAwODA5MjIgMDAwMDAgbiAK MDAwMDA4MTE0MCAwMDAwMCBuIAowMDAwMDgxMzU2IDAwMDAwIG4gCjAwMDAw ODE1NzggMDAwMDAgbiAKMDAwMDA4MTgwOCAwMDAwMCBuIAowMDAwMDgyMDMy IDAwMDAwIG4gCjAwMDAwODIyNDggMDAwMDAgbiAKMDAwMDA4MjQ3OCAwMDAw MCBuIAowMDAwMDgyNzAyIDAwMDAwIG4gCjAwMDAwODI5MzIgMDAwMDAgbiAK MDAwMDA4MzE3MyAwMDAwMCBuIAowMDAwMDgzMzk3IDAwMDAwIG4gCjAwMDAw ODM2MjcgMDAwMDAgbiAKMDAwMDA4Mzg1MSAwMDAwMCBuIAowMDAwMDg0MDY3 IDAwMDAwIG4gCjAwMDAwODQyODMgMDAwMDAgbiAKMDAwMDA4NDUwNSAwMDAw MCBuIAowMDAwMDg0NzMwIDAwMDAwIG4gCjAwMDAwODQ5NDkgMDAwMDAgbiAK MDAwMDA4NTE3OSAwMDAwMCBuIAowMDAwMDg1NDAzIDAwMDAwIG4gCjAwMDAw ODU2MjcgMDAwMDAgbiAKMDAwMDA4NTg1MSAwMDAwMCBuIAowMDAwMDg2MDgx IDAwMDAwIG4gCjAwMDAwODYyOTkgMDAwMDAgbiAKMDAwMDA4NjUyMyAwMDAw MCBuIAowMDAwMDg2NzQ3IDAwMDAwIG4gCjAwMDAwODY5ODggMDAwMDAgbiAK MDAwMDA4NzIzMSAwMDAwMCBuIAowMDAwMDg3NDUzIDAwMDAwIG4gCjAwMDAw ODc2NzUgMDAwMDAgbiAKMDAwMDA4Nzg5MSAwMDAwMCBuIAowMDAwMDg4MTE2 IDAwMDAwIG4gCjAwMDAwODgzNDEgMDAwMDAgbiAKMDAwMDA4ODU2NSAwMDAw MCBuIAowMDAwMDg4NzgzIDAwMDAwIG4gCjAwMDAwODkwMDcgMDAwMDAgbiAK MDAwMDA4OTIzMSAwMDAwMCBuIAowMDAwMDg5NDYxIDAwMDAwIG4gCjAwMDAw ODk3MDUgMDAwMDAgbiAKMDAwMDA4OTkyMSAwMDAwMCBuIAowMDAwMDkwMTM3 IDAwMDAwIG4gCjAwMDAwOTAzNzggMDAwMDAgbiAKMDAwMDA5MDU5NCAwMDAw MCBuIAowMDAwMDkwODE4IDAwMDAwIG4gCjAwMDAwOTEwNDAgMDAwMDAgbiAK MDAwMDA5MTI2MiAwMDAwMCBuIAowMDAwMDkxNDc4IDAwMDAwIG4gCjAwMDAw OTE3MDAgMDAwMDAgbiAKMDAwMDA5MTkyOCAwMDAwMCBuIAowMDAwMDkyMTUw IDAwMDAwIG4gCjAwMDAwOTIzODAgMDAwMDAgbiAKMDAwMDA5MjYxOCAwMDAw MCBuIAowMDAwMDkyODQwIDAwMDAwIG4gCjAwMDAwOTMwNjIgMDAwMDAgbiAK MDAwMDA5MzI4NiAwMDAwMCBuIAowMDAwMDkzNTAyIDAwMDAwIG4gCjAwMDAw OTM3MjYgMDAwMDAgbiAKMDAwMDA5Mzk0MiAwMDAwMCBuIAowMDAwMDk0MTU4 IDAwMDAwIG4gCjAwMDAwOTQ0MDEgMDAwMDAgbiAKMDAwMDA5NDY0OSAwMDAw MCBuIAowMDAwMDk0ODY1IDAwMDAwIG4gCjAwMDAwOTUwOTAgMDAwMDAgbiAK MDAwMDA5NTMxMiAwMDAwMCBuIAowMDAwMDk1NTQ2IDAwMDAwIG4gCjAwMDAw OTU3ODcgMDAwMDAgbiAKMDAwMDA5NjAxMSAwMDAwMCBuIAowMDAwMDk2MjU5 IDAwMDAwIG4gCjAwMDAwOTY0ODMgMDAwMDAgbiAKMDAwMDA5NjY5OSAwMDAw MCBuIAowMDAwMDk2OTIxIDAwMDAwIG4gCjAwMDAwOTcxNTQgMDAwMDAgbiAK MDAwMDA5NzM3NiAwMDAwMCBuIAowMDAwMDk3NjA5IDAwMDAwIG4gCjAwMDAw OTc4MzMgMDAwMDAgbiAKMDAwMDA5ODA2NSAwMDAwMCBuIAowMDAwMDk4Mjg3 IDAwMDAwIG4gCjAwMDAwOTg1MjIgMDAwMDAgbiAKMDAwMDA5ODc0MCAwMDAw MCBuIAowMDAwMDk4OTU4IDAwMDAwIG4gCjAwMDAwOTkxODggMDAwMDAgbiAK MDAwMDA5OTQwNCAwMDAwMCBuIAowMDAwMDk5NjQ3IDAwMDAwIG4gCjAwMDAw OTk4ODYgMDAwMDAgbiAKMDAwMDEwMDExMCAwMDAwMCBuIAowMDAwMTAwMzM0 IDAwMDAwIG4gCjAwMDAxMDA1NjAgMDAwMDAgbiAKMDAwMDEwMDc4MiAwMDAw MCBuIAowMDAwMTAxMDE3IDAwMDAwIG4gCjAwMDAxMDEyNDcgMDAwMDAgbiAK MDAwMDEwMTQ3MSAwMDAwMCBuIAowMDAwMTAxNzAxIDAwMDAwIG4gCjAwMDAx MDE5MjUgMDAwMDAgbiAKMDAwMDEwMjE1MiAwMDAwMCBuIAowMDAwMTAyMzgy IDAwMDAwIG4gCjAwMDAxMDI1OTggMDAwMDAgbiAKMDAwMDEwMjgyMCAwMDAw MCBuIAowMDAwMTAzMDM2IDAwMDAwIG4gCjAwMDAxMDMyNTggMDAwMDAgbiAK MDAwMDEwMzQ4MiAwMDAwMCBuIAowMDAwMTAzNzA4IDAwMDAwIG4gCjAwMDAx MDM5NTAgMDAwMDAgbiAKMDAwMDEwNDE3MiAwMDAwMCBuIAowMDAwMTA0Mzk2 IDAwMDAwIG4gCjAwMDAxMDQ2MjAgMDAwMDAgbiAKMDAwMDEwNDg0MiAwMDAw MCBuIAowMDAwMTA1MDY0IDAwMDAwIG4gCjAwMDAxMDUzMDkgMDAwMDAgbiAK MDAwMDEwNTUzMyAwMDAwMCBuIAowMDAwMTA1NzU3IDAwMDAwIG4gCjAwMDAx MDU5ODcgMDAwMDAgbiAKMDAwMDEwNjIwMyAwMDAwMCBuIAowMDAwMTA2NDUz IDAwMDAwIG4gCjAwMDAxMDY2NzcgMDAwMDAgbiAKMDAwMDEwNjg5OSAwMDAw MCBuIAowMDAwMTA3MTI5IDAwMDAwIG4gCjAwMDAxMDczNDggMDAwMDAgbiAK MDAwMDEwNzU3MyAwMDAwMCBuIAowMDAwMTA3ODI0IDAwMDAwIG4gCjAwMDAx MDgwNjggMDAwMDAgbiAKMDAwMDEwODI5MiAwMDAwMCBuIAowMDAwMTA4NTIy IDAwMDAwIG4gCjAwMDAxMDg3NTIgMDAwMDAgbiAKMDAwMDEwODk4NCAwMDAw MCBuIAowMDAwMTA5MjA4IDAwMDAwIG4gCjAwMDAxMDk0MzggMDAwMDAgbiAK MDAwMDEwOTY1NiAwMDAwMCBuIAowMDAwMTA5ODg2IDAwMDAwIG4gCjAwMDAx MTAxMzYgMDAwMDAgbiAKMDAwMDExMDM1NCAwMDAwMCBuIAowMDAwMTEwNTgy IDAwMDAwIG4gCjAwMDAxMTA4MDYgMDAwMDAgbiAKMDAwMDExMTAzMSAwMDAw MCBuIAowMDAwMTExMjU1IDAwMDAwIG4gCjAwMDAxMTE0NzkgMDAwMDAgbiAK MDAwMDExMTY5NyAwMDAwMCBuIAowMDAwMTExOTE1IDAwMDAwIG4gCjAwMDAx MTIxNDUgMDAwMDAgbiAKMDAwMDExMjM2OSAwMDAwMCBuIAowMDAwMTEyNTk1 IDAwMDAwIG4gCjAwMDAxMTI4MjUgMDAwMDAgbiAKMDAwMDExMzA0MyAwMDAw MCBuIAowMDAwMTEzMjgxIDAwMDAwIG4gCjAwMDAxMTM0OTcgMDAwMDAgbiAK MDAwMDExMzc0MCAwMDAwMCBuIAowMDAwMTEzOTcwIDAwMDAwIG4gCjAwMDAx MTQxOTIgMDAwMDAgbiAKMDAwMDExNDQzMCAwMDAwMCBuIAowMDAwMTE0NjUy IDAwMDAwIG4gCjAwMDAxMTQ4NjggMDAwMDAgbiAKMDAwMDExNTA5MiAwMDAw MCBuIAowMDAwMTE1MzIyIDAwMDAwIG4gCjAwMDAxMTU1NDQgMDAwMDAgbiAK MDAwMDExNTc3NCAwMDAwMCBuIAowMDAwMTE2MDA0IDAwMDAwIG4gCjAwMDAx MTYyMzQgMDAwMDAgbiAKMDAwMDExNjQ1MiAwMDAwMCBuIAowMDAwMTE2Njc2 IDAwMDAwIG4gCjAwMDAxMTY4OTIgMDAwMDAgbiAKMDAwMDExNzEyMCAwMDAw MCBuIAowMDAwMTE3MzM2IDAwMDAwIG4gCjAwMDAxMTc1NTggMDAwMDAgbiAK MDAwMDExNzc3NCAwMDAwMCBuIAowMDAwMTE3OTk5IDAwMDAwIG4gCjAwMDAx MTgyMTUgMDAwMDAgbiAKMDAwMDExODQzNyAwMDAwMCBuIAowMDAwMTE4NjU5 IDAwMDAwIG4gCjAwMDAxMTg4ODEgMDAwMDAgbiAKMDAwMDExOTEwMCAwMDAw MCBuIAowMDAwMTE5MzIyIDAwMDAwIG4gCjAwMDAxMTk1NDQgMDAwMDAgbiAK MDAwMDExOTc2MyAwMDAwMCBuIAowMDAwMTE5OTg1IDAwMDAwIG4gCjAwMDAx MjAyMDcgMDAwMDAgbiAKMDAwMDEyMDQzOCAwMDAwMCBuIAowMDAwMTIwNjU0 IDAwMDAwIG4gCjAwMDAxMjA4OTMgMDAwMDAgbiAKMDAwMDEyMTEyMyAwMDAw MCBuIAowMDAwMTIxMzUzIDAwMDAwIG4gCjAwMDAxMjE1NzcgMDAwMDAgbiAK MDAwMDEyMTgwMSAwMDAwMCBuIAowMDAwMTIyMDQwIDAwMDAwIG4gCjAwMDAx MjIyNzAgMDAwMDAgbiAKMDAwMDEyMjUwMiAwMDAwMCBuIAowMDAwMTIyNzI2 IDAwMDAwIG4gCjAwMDAxMjI5NTEgMDAwMDAgbiAKMDAwMDEyMzE4MSAwMDAw MCBuIAowMDAwMTIzMzk5IDAwMDAwIG4gCjAwMDAxMjM2MjMgMDAwMDAgbiAK MDAwMDEyMzg1NSAwMDAwMCBuIAowMDAwMTI0MDg1IDAwMDAwIG4gCjAwMDAx MjQzMTcgMDAwMDAgbiAKMDAwMDEyNDUzMyAwMDAwMCBuIAowMDAwMTI0Nzcx IDAwMDAwIG4gCjAwMDAxMjQ5OTAgMDAwMDAgbiAKMDAwMDEyNTIxNCAwMDAw MCBuIAowMDAwMTI1NDU0IDAwMDAwIG4gCjAwMDAxMjU2NzkgMDAwMDAgbiAK MDAwMDEyNTg5NSAwMDAwMCBuIAowMDAwMTI2MTE3IDAwMDAwIG4gCjAwMDAx MjYzNTUgMDAwMDAgbiAKMDAwMDEyNjU3NCAwMDAwMCBuIAowMDAwMTI2ODA0 IDAwMDAwIG4gCjAwMDAxMjcwMzQgMDAwMDAgbiAKMDAwMDEyNzI2NCAwMDAw MCBuIAowMDAwMTI3NDk0IDAwMDAwIG4gCjAwMDAxMjc3NDQgMDAwMDAgbiAK MDAwMDEyNzk3NSAwMDAwMCBuIAowMDAwMTI4MjA1IDAwMDAwIG4gCjAwMDAx Mjg0MzAgMDAwMDAgbiAKMDAwMDEyODY2MCAwMDAwMCBuIAowMDAwMTI4ODkw IDAwMDAwIG4gCjAwMDAxMjkxMDYgMDAwMDAgbiAKMDAwMDEyOTMzOSAwMDAw MCBuIAowMDAwMTI5NTYzIDAwMDAwIG4gCjAwMDAxMjk3OTQgMDAwMDAgbiAK MDAwMDEzMDAyNCAwMDAwMCBuIAowMDAwMTMwMjU0IDAwMDAwIG4gCjAwMDAx MzA0ODYgMDAwMDAgbiAKMDAwMDEzMDcwOCAwMDAwMCBuIAowMDAwMTMwOTMz IDAwMDAwIG4gCjAwMDAxMzExNjMgMDAwMDAgbiAKMDAwMDEzMTM3OSAwMDAw MCBuIAowMDAwMTMxNjAxIDAwMDAwIG4gCjAwMDAxMzE4NDEgMDAwMDAgbiAK MDAwMDEzMjA1NyAwMDAwMCBuIAowMDAwMTMyMjgzIDAwMDAwIG4gCjAwMDAx MzI1MjEgMDAwMDAgbiAKMDAwMDEzMjc3MSAwMDAwMCBuIAowMDAwMTMyOTg5 IDAwMDAwIG4gCjAwMDAxMzMyMTQgMDAwMDAgbiAKMDAwMDEzMzQ0NiAwMDAw MCBuIAowMDAwMTMzNjcwIDAwMDAwIG4gCjAwMDAxMzM5MDIgMDAwMDAgbiAK MDAwMDEzNDEyMCAwMDAwMCBuIAowMDAwMTM0MzU0IDAwMDAwIG4gCjAwMDAx MzQ1NzIgMDAwMDAgbiAKMDAwMDEzNDc5NyAwMDAwMCBuIAowMDAwMTM1MDI4 IDAwMDAwIG4gCjAwMDAxMzUyNTIgMDAwMDAgbiAKMDAwMDEzNTQ4MyAwMDAw MCBuIAowMDAwMTM1NzA3IDAwMDAwIG4gCjAwMDAxMzU5MjkgMDAwMDAgbiAK MDAwMDEzNjE2MyAwMDAwMCBuIAowMDAwMTM2MzkzIDAwMDAwIG4gCjAwMDAx MzY2NDMgMDAwMDAgbiAKMDAwMDEzNjg2NSAwMDAwMCBuIAowMDAwMTM3MDgx IDAwMDAwIG4gCjAwMDAxMzczMDMgMDAwMDAgbiAKMDAwMDE0MzE4MiAwMDAw MCBuIAowMDAwMTQ4MzgzIDAwMDAwIG4gCjAwMDAxNDg1OTMgMDAwMDAgbiAK MDAwMDE0ODgxMSAwMDAwMCBuIAowMDAwMTQ5MDI3IDAwMDAwIG4gCjAwMDAx NDkyNDUgMDAwMDAgbiAKMDAwMDE0OTQ2MSAwMDAwMCBuIAowMDAwMTQ5Njc3 IDAwMDAwIG4gCjAwMDAxNDk4OTUgMDAwMDAgbiAKMDAwMDE1MDEyNSAwMDAw MCBuIAowMDAwMTUwMzUwIDAwMDAwIG4gCjAwMDAxNTA1ODAgMDAwMDAgbiAK MDAwMDE1MDgxOSAwMDAwMCBuIAowMDAwMTUxMDY0IDAwMDAwIG4gCjAwMDAx NTEzMTEgMDAwMDAgbiAKMDAwMDE1MTUyNyAwMDAwMCBuIAowMDAwMTUxNzc5 IDAwMDAwIG4gCjAwMDAxNTE5OTkgMDAwMDAgbiAKMDAwMDE1MjI1MiAwMDAw MCBuIAowMDAwMTUyNDcwIDAwMDAwIG4gCjAwMDAxNTI2OTggMDAwMDAgbiAK MDAwMDE1Mjk1NyAwMDAwMCBuIAowMDAwMTUzMTg0IDAwMDAwIG4gCjAwMDAx NTM0NDYgMDAwMDAgbiAKMDAwMDE1MzY2MiAwMDAwMCBuIAowMDAwMTUzODg3 IDAwMDAwIG4gCjAwMDAxNTQxMTUgMDAwMDAgbiAKMDAwMDE1NDM4MSAwMDAw MCBuIAowMDAwMTU0Njc3IDAwMDAwIG4gCjAwMDAxNTQ4ODcgMDAwMDAgbiAK MDAwMDE1NTEwNSAwMDAwMCBuIAowMDAwMTU1MzUzIDAwMDAwIG4gCjAwMDAx NTU2MTkgMDAwMDAgbiAKMDAwMDE1NTkxNSAwMDAwMCBuIAowMDAwMTU2MTI1 IDAwMDAwIG4gCjAwMDAxNTYzNDkgMDAwMDAgbiAKMDAwMDE1NjYxMCAwMDAw MCBuIAowMDAwMTU2ODgyIDAwMDAwIG4gCjAwMDAxNTcxNzIgMDAwMDAgbiAK MDAwMDE1NzQwMiAwMDAwMCBuIAowMDAwMTU3NjMyIDAwMDAwIG4gCjAwMDAx NTc5MzQgMDAwMDAgbiAKMDAwMDE1ODIzNyAwMDAwMCBuIAowMDAwMTU4NDU1 IDAwMDAwIG4gCjAwMDAxNTg2OTMgMDAwMDAgbiAKMDAwMDE1ODkzNCAwMDAw MCBuIAowMDAwMTU5MjI0IDAwMDAwIG4gCjAwMDAxNTk1MjcgMDAwMDAgbiAK MDAwMDE1OTc0NSAwMDAwMCBuIAowMDAwMTYwMDAxIDAwMDAwIG4gCjAwMDAx NjAzMDMgMDAwMDAgbiAKMDAwMDE2MDU5MyAwMDAwMCBuIAowMDAwMTYwODE4 IDAwMDAwIG4gCjAwMDAxNjEwODcgMDAwMDAgbiAKMDAwMDE2MTQwMiAwMDAw MCBuIAowMDAwMTYxNjk5IDAwMDAwIG4gCjAwMDAxNjE5NTQgMDAwMDAgbiAK MDAwMDE2MjE3NiAwMDAwMCBuIAowMDAwMTYyNDIyIDAwMDAwIG4gCjAwMDAx NjI3MTcgMDAwMDAgbiAKMDAwMDE2MzAwNSAwMDAwMCBuIAowMDAwMTYzMjY2 IDAwMDAwIG4gCjAwMDAxNjM1MzIgMDAwMDAgbiAKMDAwMDE2MzgyMSAwMDAw MCBuIAowMDAwMTY0MTMzIDAwMDAwIG4gCjAwMDAxNjQ0MjAgMDAwMDAgbiAK MDAwMDE2NDY5NiAwMDAwMCBuIAowMDAwMTY0OTk3IDAwMDAwIG4gCjAwMDAx NjUyNzQgMDAwMDAgbiAKMDAwMDE2NTU3NiAwMDAwMCBuIAowMDAwMTY1ODcx IDAwMDAwIG4gCjAwMDAxNjYxNDggMDAwMDAgbiAKMDAwMDE2NjM2NCAwMDAw MCBuIAowMDAwMTY2NjY2IDAwMDAwIG4gCjAwMDAxNjY5NTkgMDAwMDAgbiAK MDAwMDE2NzIzNyAwMDAwMCBuIAowMDAwMTY3NDU5IDAwMDAwIG4gCjAwMDAx Njc3NjEgMDAwMDAgbiAKMDAwMDE2ODA1NCAwMDAwMCBuIAowMDAwMTY4MzIw IDAwMDAwIG4gCjAwMDAxNjg1NTAgMDAwMDAgbiAKMDAwMDE2ODg2MyAwMDAw MCBuIAowMDAwMTY5MTc2IDAwMDAwIG4gCjAwMDAxNjk0ODggMDAwMDAgbiAK MDAwMDE2OTc4OSAwMDAwMCBuIAowMDAwMTcwMTAyIDAwMDAwIG4gCjAwMDAx NzA0MjQgMDAwMDAgbiAKMDAwMDE3MDczNyAwMDAwMCBuIAowMDAwMTcxMDM4 IDAwMDAwIG4gCjAwMDAxNzE0ODMgMDAwMDAgbiAKMDAwMDE3MTcxMSAwMDAw MCBuIAowMDAwMTcyMDE4IDAwMDAwIG4gCjAwMDAxNzIyNDIgMDAwMDAgbiAK MDAwMDE3MjcwNSAwMDAwMCBuIAowMDAwMTcyOTQzIDAwMDAwIG4gCjAwMDAx NzMyNjIgMDAwMDAgbiAKMDAwMDE3MzQ5MiAwMDAwMCBuIAowMDAwMTczOTUy IDAwMDAwIG4gCjAwMDAxNzQyOTYgMDAwMDAgbiAKMDAwMDE3NDczNyAwMDAw MCBuIAowMDAwMTc0OTg5IDAwMDAwIG4gCjAwMDAxNzUzMDYgMDAwMDAgbiAK MDAwMDE3NTgwOCAwMDAwMCBuIAowMDAwMTc2MTI4IDAwMDAwIG4gCjAwMDAx NzY2MTYgMDAwMDAgbiAKMDAwMDE3Njk1NyAwMDAwMCBuIAowMDAwMTc3MzU5 IDAwMDAwIG4gCjAwMDAxNzc3NzEgMDAwMDAgbiAKMDAwMDE3ODE2MCAwMDAw MCBuIAowMDAwMTc4NTYyIDAwMDAwIG4gCjAwMDAxNzg5NDEgMDAwMDAgbiAK MDAwMDE3OTI3NyAwMDAwMCBuIAowMDAwMTc5NzI3IDAwMDAwIG4gCjAwMDAx ODAxNzIgMDAwMDAgbiAKMDAwMDE4MDM5MCAwMDAwMCBuIAowMDAwMTgwNjA2 IDAwMDAwIG4gCjAwMDAxODA4MjUgMDAwMDAgbiAKMDAwMDE4MTA0NyAwMDAw MCBuIAowMDAwMTgxMjczIDAwMDAwIG4gCjAwMDAxODE1MDMgMDAwMDAgbiAK MDAwMDE4MTc0MyAwMDAwMCBuIAowMDAwMTgxOTg3IDAwMDAwIG4gCjAwMDAx ODIyNDAgMDAwMDAgbiAKMDAwMDE4MjQ5MSAwMDAwMCBuIAowMDAwMTgyNzQ0 IDAwMDAwIG4gCjAwMDAxODI5OTYgMDAwMDAgbiAKMDAwMDE4MzI1OSAwMDAw MCBuIAowMDAwMTgzNTI1IDAwMDAwIG4gCjAwMDAxODM4MjEgMDAwMDAgbiAK MDAwMDE4NDA4NiAwMDAwMCBuIAowMDAwMTg0MzgzIDAwMDAwIG4gCjAwMDAx ODQ2NTUgMDAwMDAgbiAKMDAwMDE4NDk0NiAwMDAwMCBuIAowMDAwMTg1MjQ4 IDAwMDAwIG4gCjAwMDAxODU1NTIgMDAwMDAgbiAKMDAwMDE4NTg0MiAwMDAw MCBuIAowMDAwMTg2MTQ2IDAwMDAwIG4gCjAwMDAxODY0NDggMDAwMDAgbiAK MDAwMDE4NjczOCAwMDAwMCBuIAowMDAwMTg3MDUzIDAwMDAwIG4gCjAwMDAx ODczNTAgMDAwMDAgbiAKMDAwMDE4NzY0NSAwMDAwMCBuIAowMDAwMTg3OTMz IDAwMDAwIG4gCjAwMDAxODgyMjIgMDAwMDAgbiAKMDAwMDE4ODUzNSAwMDAw MCBuIAowMDAwMTg4ODExIDAwMDAwIG4gCjAwMDAxODkxMTMgMDAwMDAgbiAK MDAwMDE4OTM5OSAwMDAwMCBuIAowMDAwMTg5NjgxIDAwMDAwIG4gCjAwMDAx ODk5ODkgMDAwMDAgbiAKMDAwMDE5MDI5MCAwMDAwMCBuIAowMDAwMTkwNTg1 IDAwMDAwIG4gCjAwMDAxOTA4MDcgMDAwMDAgbiAKMDAwMDE5MTEwOSAwMDAw MCBuIAowMDAwMTkxNDAzIDAwMDAwIG4gCjAwMDAxOTE2MzMgMDAwMDAgbiAK MDAwMDE5MTk0MSAwMDAwMCBuIAowMDAwMTkyMjM1IDAwMDAwIG4gCjAwMDAx OTI0NzIgMDAwMDAgbiAKMDAwMDE5Mjc4NSAwMDAwMCBuIAowMDAwMTkzMDk5 IDAwMDAwIG4gCjAwMDAxOTM0MTIgMDAwMDAgbiAKMDAwMDE5MzcxMiAwMDAw MCBuIAowMDAwMTk0MDI2IDAwMDAwIG4gCjAwMDAxOTQ0NzAgMDAwMDAgbiAK MDAwMDE5NDc3OCAwMDAwMCBuIAowMDAwMTk1MDAyIDAwMDAwIG4gCjAwMDAx OTU0NjcgMDAwMDAgbiAKMDAwMDE5NTc4NiAwMDAwMCBuIAowMDAwMTk2MDE3 IDAwMDAwIG4gCjAwMDAxOTY0NzcgMDAwMDAgbiAKMDAwMDE5NjgyMSAwMDAw MCBuIAowMDAwMTk3MjYzIDAwMDAwIG4gCjAwMDAxOTc1ODAgMDAwMDAgbiAK MDAwMDE5ODA2NCAwMDAwMCBuIAowMDAwMTk4Mjg4IDAwMDAwIG4gCjAwMDAx OTg2MjUgMDAwMDAgbiAKMDAwMDE5OTEyOCAwMDAwMCBuIAowMDAwMTk5NDQ4 IDAwMDAwIG4gCjAwMDAxOTk5MzggMDAwMDAgbiAKMDAwMDIwMDI3OSAwMDAw MCBuIAowMDAwMjAwNjkwIDAwMDAwIG4gCjAwMDAyMDExMTAgMDAwMDAgbiAK MDAwMDIwMTUwNyAwMDAwMCBuIAowMDAwMjAxOTE2IDAwMDAwIG4gCjAwMDAy MDIyOTggMDAwMDAgbiAKMDAwMDIwMjYzMyAwMDAwMCBuIAowMDAwMjAzMDgz IDAwMDAwIG4gCjAwMDAyMDM1MjggMDAwMDAgbiAKMDAwMDIwMzc0NiAwMDAw MCBuIAowMDAwMjAzOTYyIDAwMDAwIG4gCjAwMDAyMDQxOTIgMDAwMDAgbiAK MDAwMDIwNDQyMiAwMDAwMCBuIAowMDAwMjA0NjYzIDAwMDAwIG4gCjAwMDAy MDQ5MTYgMDAwMDAgbiAKMDAwMDIwNTEzNyAwMDAwMCBuIAowMDAwMjA1Mzkx IDAwMDAwIG4gCjAwMDAyMDU2NTAgMDAwMDAgbiAKMDAwMDIwNTg3NyAwMDAw MCBuIAowMDAwMjA2MTQwIDAwMDAwIG4gCjAwMDAyMDYzNTkgMDAwMDAgbiAK MDAwMDIwNjU4MSAwMDAwMCBuIAowMDAwMjA2ODM1IDAwMDAwIG4gCjAwMDAy MDcwNjggMDAwMDAgbiAKMDAwMDIwNzMyNiAwMDAwMCBuIAowMDAwMjA3NTQ0 IDAwMDAwIG4gCjAwMDAyMDc3NzAgMDAwMDAgbiAKMDAwMDIwODAzNyAwMDAw MCBuIAowMDAwMjA4MzM0IDAwMDAwIG4gCjAwMDAyMDg1ODMgMDAwMDAgbiAK MDAwMDIwODg0OSAwMDAwMCBuIAowMDAwMjA5MTQ3IDAwMDAwIG4gCjAwMDAy MDk0MDggMDAwMDAgbiAKMDAwMDIwOTY4MSAwMDAwMCBuIAowMDAwMjA5OTcz IDAwMDAwIG4gCjAwMDAyMTAyMDMgMDAwMDAgbiAKMDAwMDIxMDQzMyAwMDAw MCBuIAowMDAwMjEwNzM2IDAwMDAwIG4gCjAwMDAyMTEwNDEgMDAwMDAgbiAK MDAwMDIxMTI3OSAwMDAwMCBuIAowMDAwMjExNTIxIDAwMDAwIG4gCjAwMDAy MTE4MTIgMDAwMDAgbiAKMDAwMDIxMjExNyAwMDAwMCBuIAowMDAwMjEyMzc0 IDAwMDAwIG4gCjAwMDAyMTI2NzcgMDAwMDAgbiAKMDAwMDIxMjk2NyAwMDAw MCBuIAowMDAwMjEzMjM3IDAwMDAwIG4gCjAwMDAyMTM1NTMgMDAwMDAgbiAK MDAwMDIxMzg1MSAwMDAwMCBuIAowMDAwMjE0MTA2IDAwMDAwIG4gCjAwMDAy MTQzNTMgMDAwMDAgbiAKMDAwMDIxNDY0OSAwMDAwMCBuIAowMDAwMjE0OTM3 IDAwMDAwIG4gCjAwMDAyMTUxOTggMDAwMDAgbiAKMDAwMDIxNTQ2NSAwMDAw MCBuIAowMDAwMjE1NzU1IDAwMDAwIG4gCjAwMDAyMTYwNjggMDAwMDAgbiAK MDAwMDIxNjM1NiAwMDAwMCBuIAowMDAwMjE2NjMzIDAwMDAwIG4gCjAwMDAy MTY5MzUgMDAwMDAgbiAKMDAwMDIxNzIyMiAwMDAwMCBuIAowMDAwMjE3NTA1 IDAwMDAwIG4gCjAwMDAyMTc4MTUgMDAwMDAgbiAKMDAwMDIxODA5MyAwMDAw MCBuIAowMDAwMjE4Mzk3IDAwMDAwIG4gCjAwMDAyMTg2OTEgMDAwMDAgbiAK MDAwMDIxODk2OCAwMDAwMCBuIAowMDAwMjE5MjcxIDAwMDAwIG4gCjAwMDAy MTk1NjYgMDAwMDAgbiAKMDAwMDIxOTgzMiAwMDAwMCBuIAowMDAwMjIwMDcw IDAwMDAwIG4gCjAwMDAyMjAzODUgMDAwMDAgbiAKMDAwMDIyMDcwMCAwMDAw MCBuIAowMDAwMjIxMDE0IDAwMDAwIG4gCjAwMDAyMjEzMTcgMDAwMDAgbiAK MDAwMDIyMTYzMiAwMDAwMCBuIAowMDAwMjIxOTU1IDAwMDAwIG4gCjAwMDAy MjIyNjkgMDAwMDAgbiAKMDAwMDIyMjU3MiAwMDAwMCBuIAowMDAwMjIzMDE5 IDAwMDAwIG4gCjAwMDAyMjMzMjggMDAwMDAgbiAKMDAwMDIyMzU1MyAwMDAw MCBuIAowMDAwMjI0MDE4IDAwMDAwIG4gCjAwMDAyMjQzMzggMDAwMDAgbiAK MDAwMDIyNDU3MCAwMDAwMCBuIAowMDAwMjI1MDMzIDAwMDAwIG4gCjAwMDAy MjUzNzggMDAwMDAgbiAKMDAwMDIyNTgyMSAwMDAwMCBuIAowMDAwMjI2MTQw IDAwMDAwIG4gCjAwMDAyMjY2MjggMDAwMDAgbiAKMDAwMDIyNjk2NyAwMDAw MCBuIAowMDAwMjI3NDczIDAwMDAwIG4gCjAwMDAyMjc3OTQgMDAwMDAgbiAK MDAwMDIyODI4NiAwMDAwMCBuIAowMDAwMjI4NjI3IDAwMDAwIG4gCjAwMDAy MjkwMzggMDAwMDAgbiAKMDAwMDIyOTQ1OCAwMDAwMCBuIAowMDAwMjI5ODU3 IDAwMDAwIG4gCjAwMDAyMzAyNjggMDAwMDAgbiAKMDAwMDIzMDY0OCAwMDAw MCBuIAowMDAwMjMwOTg3IDAwMDAwIG4gCjAwMDAyMzE0MzkgMDAwMDAgbiAK MDAwMDIzMTg4NiAwMDAwMCBuIAowMDAwMjMyMTQ5IDAwMDAwIG4gCjAwMDAy MzIzNjcgMDAwMDAgbiAKMDAwMDIzMjYyMCAwMDAwMCBuIAowMDAwMjMyODc4 IDAwMDAwIG4gCjAwMDAyMzMwOTYgMDAwMDAgbiAKMDAwMDIzMzM5MyAwMDAw MCBuIAowMDAwMjMzNjkxIDAwMDAwIG4gCjAwMDAyMzM5NjQgMDAwMDAgbiAK MDAwMDIzNDI1NiAwMDAwMCBuIAowMDAwMjM0NTU5IDAwMDAwIG4gCjAwMDAy MzQ4NjQgMDAwMDAgbiAKMDAwMDIzNTEwMiAwMDAwMCBuIAowMDAwMjM1Mzkz IDAwMDAwIG4gCjAwMDAyMzU2OTggMDAwMDAgbiAKMDAwMDIzNjAwMSAwMDAw MCBuIAowMDAwMjM2MjkxIDAwMDAwIG4gCjAwMDAyMzY2MDcgMDAwMDAgbiAK MDAwMDIzNjkwNSAwMDAwMCBuIAowMDAwMjM3MTYwIDAwMDAwIG4gCjAwMDAy Mzc0NTYgMDAwMDAgbiAKMDAwMDIzNzc0NCAwMDAwMCBuIAowMDAwMjM4MDM0 IDAwMDAwIG4gCjAwMDAyMzgzNDggMDAwMDAgbiAKMDAwMDIzODYzNSAwMDAw MCBuIAowMDAwMjM4OTEyIDAwMDAwIG4gCjAwMDAyMzkyMTUgMDAwMDAgbiAK MDAwMDIzOTUwMiAwMDAwMCBuIAowMDAwMjM5Nzg1IDAwMDAwIG4gCjAwMDAy NDAwOTQgMDAwMDAgbiAKMDAwMDI0MDM5NiAwMDAwMCBuIAowMDAwMjQwNjky IDAwMDAwIG4gCjAwMDAyNDA5NjkgMDAwMDAgbiAKMDAwMDI0MTI3MiAwMDAw MCBuIAowMDAwMjQxNTY3IDAwMDAwIG4gCjAwMDAyNDE4NDUgMDAwMDAgbiAK MDAwMDI0MjA3NSAwMDAwMCBuIAowMDAwMjQyMzg0IDAwMDAwIG4gCjAwMDAy NDI2NzkgMDAwMDAgbiAKMDAwMDI0MjkxNyAwMDAwMCBuIAowMDAwMjQzMjMx IDAwMDAwIG4gCjAwMDAyNDM1NDYgMDAwMDAgbiAKMDAwMDI0Mzg2MCAwMDAw MCBuIAowMDAwMjQ0MTYyIDAwMDAwIG4gCjAwMDAyNDQ0NzcgMDAwMDAgbiAK MDAwMDI0NDgwMCAwMDAwMCBuIAowMDAwMjQ1MTE0IDAwMDAwIG4gCjAwMDAy NDU0MTcgMDAwMDAgbiAKMDAwMDI0NTg2NCAwMDAwMCBuIAowMDAwMjQ2MTcz IDAwMDAwIG4gCjAwMDAyNDYzOTggMDAwMDAgbiAKMDAwMDI0Njg2MyAwMDAw MCBuIAowMDAwMjQ3MTgzIDAwMDAwIG4gCjAwMDAyNDc0MTUgMDAwMDAgbiAK MDAwMDI0Nzg3NyAwMDAwMCBuIAowMDAwMjQ4MjIyIDAwMDAwIG4gCjAwMDAy NDg2NjUgMDAwMDAgbiAKMDAwMDI0ODk4NCAwMDAwMCBuIAowMDAwMjQ5NDcw IDAwMDAwIG4gCjAwMDAyNDk4MDkgMDAwMDAgbiAKMDAwMDI1MDMxNSAwMDAw MCBuIAowMDAwMjUwNjM2IDAwMDAwIG4gCjAwMDAyNTExMjYgMDAwMDAgbiAK MDAwMDI1MTQ2NiAwMDAwMCBuIAowMDAwMjUxODc5IDAwMDAwIG4gCjAwMDAy NTIzMDAgMDAwMDAgbiAKMDAwMDI1MjY5OCAwMDAwMCBuIAowMDAwMjUzMTA5 IDAwMDAwIG4gCjAwMDAyNTM0OTIgMDAwMDAgbiAKMDAwMDI1MzgyOCAwMDAw MCBuIAowMDAwMjU0Mjc4IDAwMDAwIG4gCjAwMDAyNTQ3MjIgMDAwMDAgbiAK MDAwMDI1NDk1MyAwMDAwMCBuIAowMDAwMjU1MTg1IDAwMDAwIG4gCjAwMDAy NTU0MjcgMDAwMDAgbiAKMDAwMDI1NTY2MCAwMDAwMCBuIAowMDAwMjU1OTEx IDAwMDAwIG4gCjAwMDAyNTYxODQgMDAwMDAgbiAKMDAwMDI1NjM5NCAwMDAw MCBuIAowMDAwMjU2Njg2IDAwMDAwIG4gCjAwMDAyNTY5MzAgMDAwMDAgbiAK MDAwMDI1NzIyMSAwMDAwMCBuIAowMDAwMjU3NDcxIDAwMDAwIG4gCjAwMDAy NTc3NzEgMDAwMDAgbiAKMDAwMDI1ODA2NyAwMDAwMCBuIAowMDAwMjU4MzE4 IDAwMDAwIG4gCjAwMDAyNTg2MTggMDAwMDAgbiAKMDAwMDI1ODg2OSAwMDAw MCBuIAowMDAwMjU5MTQzIDAwMDAwIG4gCjAwMDAyNTk0MDcgMDAwMDAgbiAK MDAwMDI1OTY2NyAwMDAwMCBuIAowMDAwMjU5OTQzIDAwMDAwIG4gCjAwMDAy NjAyMDggMDAwMDAgbiAKMDAwMDI2MDQ4MCAwMDAwMCBuIAowMDAwMjYwNzQ2 IDAwMDAwIG4gCjAwMDAyNjEwNDQgMDAwMDAgbiAKMDAwMDI2MTMxOSAwMDAw MCBuIAowMDAwMjYxNTM4IDAwMDAwIG4gCjAwMDAyNjE4MzEgMDAwMDAgbiAK MDAwMDI2MjE3NyAwMDAwMCBuIAowMDAwMjYyNDU2IDAwMDAwIG4gCjAwMDAy NjI3NzkgMDAwMDAgbiAKMDAwMDI2MzEyMSAwMDAwMCBuIAowMDAwMjYzNTE1 IDAwMDAwIG4gCjAwMDAyNjM5MTQgMDAwMDAgbiAKMDAwMDI2NDEzOCAwMDAw MCBuIAowMDAwMjY0NDA0IDAwMDAwIG4gCjAwMDAyNjQ2NDggMDAwMDAgbiAK MDAwMDI2NDg3OCAwMDAwMCBuIAowMDAwMjY1MTk1IDAwMDAwIG4gCjAwMDAy NjU0MzMgMDAwMDAgbiAKMDAwMDI2NTY2NCAwMDAwMCBuIAowMDAwMjY1OTI5 IDAwMDAwIG4gCjAwMDAyNjYxNzMgMDAwMDAgbiAKMDAwMDI2NjQ1MiAwMDAw MCBuIAowMDAwMjY2Njk2IDAwMDAwIG4gCjAwMDAyNjY5MjcgMDAwMDAgbiAK MDAwMDI2NzE2OCAwMDAwMCBuIAowMDAwMjY3NDEyIDAwMDAwIG4gCjAwMDAy Njc2OTggMDAwMDAgbiAKMDAwMDI2Nzk0MiAwMDAwMCBuIAowMDAwMjY4MTgx IDAwMDAwIG4gCjAwMDAyNjg0NDAgMDAwMDAgbiAKMDAwMDI2ODY4NCAwMDAw MCBuIAowMDAwMjY4OTE0IDAwMDAwIG4gCjAwMDAyNjkxOTYgMDAwMDAgbiAK MDAwMDI2OTQzNyAwMDAwMCBuIAowMDAwMjY5Njc4IDAwMDAwIG4gCjAwMDAy Njk5MTggMDAwMDAgbiAKMDAwMDI3MDE2NCAwMDAwMCBuIAowMDAwMjcwNDM0 IDAwMDAwIG4gCjAwMDAyNzA2NjYgMDAwMDAgbiAKMDAwMDI3MDkwOCAwMDAw MCBuIAowMDAwMjcxMTQwIDAwMDAwIG4gCjAwMDAyNzE0MjggMDAwMDAgbiAK MDAwMDI3MTY2OCAwMDAwMCBuIAowMDAwMjcxOTAwIDAwMDAwIG4gCjAwMDAy NzIxNjkgMDAwMDAgbiAKMDAwMDI3MjQwMSAwMDAwMCBuIAowMDAwMjcyNjMz IDAwMDAwIG4gCjAwMDAyNzI5MDIgMDAwMDAgbiAKMDAwMDI3MzEyOCAwMDAw MCBuIAowMDAwMjczMzk3IDAwMDAwIG4gCjAwMDAyNzM2MjMgMDAwMDAgbiAK MDAwMDI3Mzg1NSAwMDAwMCBuIAowMDAwMjc0MTM2IDAwMDAwIG4gCjAwMDAy NzQzNTQgMDAwMDAgbiAKMDAwMDI3NDYxMSAwMDAwMCBuIAowMDAwMjc0ODQz IDAwMDAwIG4gCjAwMDAyNzUwNjkgMDAwMDAgbiAKMDAwMDI3NTM2MyAwMDAw MCBuIAowMDAwMjc1NjE4IDAwMDAwIG4gCjAwMDAyNzU5NDUgMDAwMDAgbiAK MDAwMDI3NjE3MSAwMDAwMCBuIAowMDAwMjc2NDcyIDAwMDAwIG4gCjAwMDAy NzY3NjYgMDAwMDAgbiAKMDAwMDI3NzEyMiAwMDAwMCBuIAowMDAwMjc3Mzc0 IDAwMDAwIG4gCjAwMDAyNzc2NTkgMDAwMDAgbiAKMDAwMDI3NzkyNyAwMDAw MCBuIAowMDAwMjc4MTg0IDAwMDAwIG4gCjAwMDAyNzg0MDQgMDAwMDAgbiAK MDAwMDI3ODcyMiAwMDAwMCBuIAowMDAwMjc4OTcxIDAwMDAwIG4gCjAwMDAy NzkxOTcgMDAwMDAgbiAKMDAwMDI3OTQ0MyAwMDAwMCBuIAowMDAwMjc5Njky IDAwMDAwIG4gCjAwMDAyNzk5NDggMDAwMDAgbiAKMDAwMDI4MDE4MSAwMDAw MCBuIAowMDAwMjgwNDM3IDAwMDAwIG4gCjAwMDAyODA2NjQgMDAwMDAgbiAK MDAwMDI4MDkxMyAwMDAwMCBuIAowMDAwMjgxMTYzIDAwMDAwIG4gCjAwMDAy ODE0MzQgMDAwMDAgbiAKMDAwMDI4MTY4MSAwMDAwMCBuIAowMDAwMjgxOTQy IDAwMDAwIG4gCjAwMDAyODIxNjQgMDAwMDAgbiAKMDAwMDI4MjM4NCAwMDAw MCBuIAowMDAwMjgyNjM3IDAwMDAwIG4gCjAwMDAyODI5MjEgMDAwMDAgbiAK MDAwMDI4MzE4MSAwMDAwMCBuIAowMDAwMjgzNDQ4IDAwMDAwIG4gCjAwMDAy ODM3MDEgMDAwMDAgbiAKMDAwMDI4Mzk0MiAwMDAwMCBuIAowMDAwMjg0MjEz IDAwMDAwIG4gCjAwMDAyODQ0NjggMDAwMDAgbiAKMDAwMDI4NDcxNyAwMDAw MCBuIAowMDAwMjg0OTYzIDAwMDAwIG4gCjAwMDAyODUyMzQgMDAwMDAgbiAK MDAwMDI4NTQ3MyAwMDAwMCBuIAowMDAwMjg1NzI4IDAwMDAwIG4gCjAwMDAy ODU5ODMgMDAwMDAgbiAKMDAwMDI4NjIwNCAwMDAwMCBuIAowMDAwMjg2NDYw IDAwMDAwIG4gCjAwMDAyODY2ODYgMDAwMDAgbiAKMDAwMDI4NjkyNyAwMDAw MCBuIAowMDAwMjg3MTc2IDAwMDAwIG4gCjAwMDAyODc0MDggMDAwMDAgbiAK MDAwMDI4NzY0NyAwMDAwMCBuIAowMDAwMjg3OTA3IDAwMDAwIG4gCjAwMDAy ODgxNTYgMDAwMDAgbiAKMDAwMDI4ODQxMCAwMDAwMCBuIAowMDAwMjg4Njgz IDAwMDAwIG4gCjAwMDAyODg5MzAgMDAwMDAgbiAKMDAwMDI4OTE4NiAwMDAw MCBuIAowMDAwMjg5NDc5IDAwMDAwIG4gCjAwMDAyODk3MjkgMDAwMDAgbiAK MDAwMDI4OTk3OCAwMDAwMCBuIAowMDAwMjkwMjU3IDAwMDAwIG4gCjAwMDAy OTA0ODkgMDAwMDAgbiAKMDAwMDI5MDc4NCAwMDAwMCBuIAowMDAwMjkxMDI3 IDAwMDAwIG4gCjAwMDAyOTEyNzUgMDAwMDAgbiAKMDAwMDI5MTUyMyAwMDAw MCBuIAowMDAwMjkxNzc4IDAwMDAwIG4gCjAwMDAyOTIwMTAgMDAwMDAgbiAK MDAwMDI5MjMwNSAwMDAwMCBuIAowMDAwMjkyNTQ4IDAwMDAwIG4gCjAwMDAy OTI4MDQgMDAwMDAgbiAKMDAwMDI5MzA0NSAwMDAwMCBuIAowMDAwMjkzMjcy IDAwMDAwIG4gCjAwMDAyOTM1MjkgMDAwMDAgbiAKMDAwMDI5Mzc2MSAwMDAw MCBuIAowMDAwMjk0MDAxIDAwMDAwIG4gCjAwMDAyOTQyNjcgMDAwMDAgbiAK MDAwMDI5NDUyMiAwMDAwMCBuIAowMDAwMjk0Nzc4IDAwMDAwIG4gCjAwMDAy OTUwMjAgMDAwMDAgbiAKMDAwMDI5NTI4MyAwMDAwMCBuIAowMDAwMjk1NTIz IDAwMDAwIG4gCjAwMDAyOTU3NjMgMDAwMDAgbiAKMDAwMDI5NjAwMyAwMDAw MCBuIAowMDAwMjk2Mjc1IDAwMDAwIG4gCjAwMDAyOTY1MDkgMDAwMDAgbiAK MDAwMDI5Njc4MyAwMDAwMCBuIAowMDAwMjk3MDU2IDAwMDAwIG4gCjAwMDAy OTcyODggMDAwMDAgbiAKMDAwMDI5NzUyOCAwMDAwMCBuIAowMDAwMjk3Nzc0 IDAwMDAwIG4gCjAwMDAyOTgwNDAgMDAwMDAgbiAKMDAwMDI5ODM0NiAwMDAw MCBuIAowMDAwMjk4NjI5IDAwMDAwIG4gCjAwMDAyOTg4NjkgMDAwMDAgbiAK MDAwMDI5OTEwMSAwMDAwMCBuIAowMDAwMjk5MzczIDAwMDAwIG4gCjAwMDAy OTk2NjAgMDAwMDAgbiAKMDAwMDI5OTkzMSAwMDAwMCBuIAowMDAwMzAwMTcx IDAwMDAwIG4gCjAwMDAzMDA0MTEgMDAwMDAgbiAKMDAwMDMwMDcwMiAwMDAw MCBuIAowMDAwMzAwOTg3IDAwMDAwIG4gCjAwMDAzMDEyNjQgMDAwMDAgbiAK MDAwMDMwMTUwNCAwMDAwMCBuIAowMDAwMzAxNzMwIDAwMDAwIG4gCjAwMDAz MDIwMDIgMDAwMDAgbiAKMDAwMDMwMjI4MCAwMDAwMCBuIAowMDAwMzAyNTY1 IDAwMDAwIG4gCjAwMDAzMDI4MDUgMDAwMDAgbiAKMDAwMDMwMzA3NCAwMDAw MCBuIAowMDAwMzAzMjk0IDAwMDAwIG4gCjAwMDAzMDM1ODUgMDAwMDAgbiAK MDAwMDMwMzg0MCAwMDAwMCBuIAowMDAwMzA0MTIyIDAwMDAwIG4gCjAwMDAz MDQ0OTUgMDAwMDAgbiAKMDAwMDMwNDgyNSAwMDAwMCBuIAowMDAwMzA1MTc2 IDAwMDAwIG4gCjAwMDAzMDU0NDYgMDAwMDAgbiAKMDAwMDMwNTcyMyAwMDAw MCBuIAowMDAwMzA1OTkwIDAwMDAwIG4gCjAwMDAzMDYyNTMgMDAwMDAgbiAK MDAwMDMwNjQ4NiAwMDAwMCBuIAowMDAwMzA2NzUyIDAwMDAwIG4gCjAwMDAz MDcwMjEgMDAwMDAgbiAKMDAwMDMwNzI3NiAwMDAwMCBuIAowMDAwMzA3NTUz IDAwMDAwIG4gCjAwMDAzMDc4NzIgMDAwMDAgbiAKMDAwMDMwODEyMCAwMDAw MCBuIAowMDAwMzA4Mzk2IDAwMDAwIG4gCjAwMDAzMDg2NzMgMDAwMDAgbiAK MDAwMDMwODk3NCAwMDAwMCBuIAowMDAwMzA5MjA2IDAwMDAwIG4gCjAwMDAz MDk0NzAgMDAwMDAgbiAKMDAwMDMwOTcwMiAwMDAwMCBuIAowMDAwMzA5OTc2 IDAwMDAwIG4gCjAwMDAzMTAyNTkgMDAwMDAgbiAKMDAwMDMxMDU1NSAwMDAw MCBuIAowMDAwMzEwNzg3IDAwMDAwIG4gCjAwMDAzMTEwMzcgMDAwMDAgbiAK MDAwMDMxMTMwMSAwMDAwMCBuIAowMDAwMzExNjAzIDAwMDAwIG4gCjAwMDAz MTE4NDkgMDAwMDAgbiAKMDAwMDMxMjEwNSAwMDAwMCBuIAowMDAwMzEyMzI4 IDAwMDAwIG4gCjAwMDAzMTI2MzAgMDAwMDAgbiAKMDAwMDMxMjg2MiAwMDAw MCBuIAowMDAwMzEzMTAzIDAwMDAwIG4gCjAwMDAzMTM0MjIgMDAwMDAgbiAK MDAwMDMxMzY0OCAwMDAwMCBuIAowMDAwMzEzODgwIDAwMDAwIG4gCjAwMDAz MTQxODYgMDAwMDAgbiAKMDAwMDMxNDQyNiAwMDAwMCBuIAowMDAwMzE0NzI2 IDAwMDAwIG4gCjAwMDAzMTUwMTUgMDAwMDAgbiAKMDAwMDMxNTI5NSAwMDAw MCBuIAowMDAwMzE1NjAzIDAwMDAwIG4gCjAwMDAzMTU5MDIgMDAwMDAgbiAK MDAwMDMxNjE5OCAwMDAwMCBuIAowMDAwMzE2NDcyIDAwMDAwIG4gCjAwMDAz MTY3NTAgMDAwMDAgbiAKMDAwMDMxNzAxNSAwMDAwMCBuIAowMDAwMzE3Mjk5 IDAwMDAwIG4gCjAwMDAzMTc1NzggMDAwMDAgbiAKMDAwMDMxNzg2OCAwMDAw MCBuIAowMDAwMzE4MTYyIDAwMDAwIG4gCjAwMDAzMTg0NTggMDAwMDAgbiAK MDAwMDMxODc0NyAwMDAwMCBuIAowMDAwMzE5MDE4IDAwMDAwIG4gCjAwMDAz MTkzMTQgMDAwMDAgbiAKMDAwMDMxOTU5MSAwMDAwMCBuIAowMDAwMzE5ODgz IDAwMDAwIG4gCjAwMDAzMjAxNjAgMDAwMDAgbiAKMDAwMDMyMDQ4MCAwMDAw MCBuIAowMDAwMzIwNzY0IDAwMDAwIG4gCjAwMDAzMjEwNzEgMDAwMDAgbiAK MDAwMDMyMTQ1NCAwMDAwMCBuIAowMDAwMzIxODIzIDAwMDAwIG4gCjAwMDAz MjIxOTkgMDAwMDAgbiAKMDAwMDMyMjU1MyAwMDAwMCBuIAowMDAwMzIyODA4 IDAwMDAwIG4gCjAwMDAzMjMxMjggMDAwMDAgbiAKMDAwMDMyMzM0OCAwMDAw MCBuIAowMDAwMzIzNjU4IDAwMDAwIG4gCjAwMDAzMjM5NzkgMDAwMDAgbiAK MDAwMDMyNDI3NCAwMDAwMCBuIAowMDAwMzI0NTUyIDAwMDAwIG4gCjAwMDAz MjQ3NzggMDAwMDAgbiAKMDAwMDMyNTI5NiAwMDAwMCBuIAowMDAwMzI1MDA5 IDAwMDAwIG4gCjAwMDAzMjU1OTkgMDAwMDAgbiAKMDAwMDU2NTk1OSAwMDAw MCBuIAowMDAxMDUyODk1IDAwMDAwIG4gCjAwMDA1OTUzODIgMDAwMDAgbiAK MDAwMTA1MjcxNyAwMDAwMCBuIAowMDAxMDUzMjQ4IDAwMDAwIG4gCjAwMDA1 OTYzNjkgMDAwMDAgbiAKMDAwMTA1MzA3NSAwMDAwMCBuIAowMDAwNTk3MzU2 IDAwMDAwIG4gCjAwMDA1OTgyODAgMDAwMDAgbiAKMDAwMDU5OTIwNiAwMDAw MCBuIAowMDAwNTk5NDU0IDAwMDAwIG4gCjAwMDA1OTk2NzIgMDAwMDAgbiAK MDAwMDU5OTg5MCAwMDAwMCBuIAowMDAwNjAwMTIyIDAwMDAwIG4gCjAwMDA2 MDAzODUgMDAwMDAgbiAKMDAwMDYwMDYyNCAwMDAwMCBuIAowMDAwNjAwODUw IDAwMDAwIG4gCjAwMDA2MDExMTMgMDAwMDAgbiAKMDAwMDYwMTMzMyAwMDAw MCBuIAowMDAwNjAxNTQ1IDAwMDAwIG4gCjAwMDA2MDE3OTQgMDAwMDAgbiAK MDAwMDYwMjAyNiAwMDAwMCBuIAowMDAwNjAyMjc1IDAwMDAwIG4gCjAwMDA2 MDI1MDEgMDAwMDAgbiAKMDAwMDYwMjc1MCAwMDAwMCBuIAowMDAwNjAyOTkw IDAwMDAwIG4gCjAwMDA2MDMyMDggMDAwMDAgbiAKMDAwMDYwMzQ2MyAwMDAw MCBuIAowMDAwNjAzNjgzIDAwMDAwIG4gCjAwMDA2MDM5MDMgMDAwMDAgbiAK MDAwMDYwNDE2NCAwMDAwMCBuIAowMDAwNjA0MzgyIDAwMDAwIG4gCjAwMDA2 MDQ1OTQgMDAwMDAgbiAKMDAwMDYwNDgxOCAwMDAwMCBuIAowMDAwNjA1MDM2 IDAwMDAwIG4gCjAwMDA2MDUyODUgMDAwMDAgbiAKMDAwMDYwNTUxNyAwMDAw MCBuIAowMDAwNjA1NzY2IDAwMDAwIG4gCjAwMDA2MDYwMTMgMDAwMDAgbiAK MDAwMDYwNjI1MiAwMDAwMCBuIAowMDAwNjA2NDg1IDAwMDAwIG4gCjAwMDA2 MDY3MjggMDAwMDAgbiAKMDAwMDYwNjk2MCAwMDAwMCBuIAowMDAwNjA3MjE1 IDAwMDAwIG4gCjAwMDA2MDc0MzUgMDAwMDAgbiAKMDAwMDYwNzY0NyAwMDAw MCBuIAowMDAwNjA3ODY1IDAwMDAwIG4gCjAwMDA2MDgxMDUgMDAwMDAgbiAK MDAwMDYwODM5MiAwMDAwMCBuIAowMDAwNjA4NjgwIDAwMDAwIG4gCjAwMDA2 MDg5NjQgMDAwMDAgbiAKMDAwMDYwOTI2MSAwMDAwMCBuIAowMDAwNjA5NjEw IDAwMDAwIG4gCjAwMDA2MDk5MTUgMDAwMDAgbiAKMDAwMDYxMDMyNSAwMDAw MCBuIAowMDAwNjEwNzkzIDAwMDAwIG4gCjAwMDA2MTExMzQgMDAwMDAgbiAK MDAwMDYxMTQwOCAwMDAwMCBuIAowMDAwNjExNjc2IDAwMDAwIG4gCjAwMDA2 MTE5NTAgMDAwMDAgbiAKMDAwMDYxMjM1NyAwMDAwMCBuIAowMDAwNjEyNTk1 IDAwMDAwIG4gCjAwMDA2MTI4MjAgMDAwMDAgbiAKMDAwMDYxMzA2MSAwMDAw MCBuIAowMDAwNjEzMzMwIDAwMDAwIG4gCjAwMDA2MTM2MTMgMDAwMDAgbiAK MDAwMDYxMzg5OCAwMDAwMCBuIAowMDAwNjE0MTk2IDAwMDAwIG4gCjAwMDA2 MTQ1MjEgMDAwMDAgbiAKMDAwMDYxNDg1OCAwMDAwMCBuIAowMDAwNjE1MjQ0 IDAwMDAwIG4gCjAwMDA2MTU1NTIgMDAwMDAgbiAKMDAwMDYxNTg1NCAwMDAw MCBuIAowMDAwNjE2MTYyIDAwMDAwIG4gCjAwMDA2MTY0NTIgMDAwMDAgbiAK MDAwMDYxNjc0MiAwMDAwMCBuIAowMDAwNjE3MDMyIDAwMDAwIG4gCjAwMDA2 MTczMzQgMDAwMDAgbiAKMDAwMDYxNzYzNiAwMDAwMCBuIAowMDAwNjE3OTgw IDAwMDAwIG4gCjAwMDA2MTgyNjggMDAwMDAgbiAKMDAwMDYxODU0MSAwMDAw MCBuIAowMDAwNjE4ODA0IDAwMDAwIG4gCjAwMDA2MTkxODEgMDAwMDAgbiAK MDAwMDYxOTQzMiAwMDAwMCBuIAowMDAwNjE5NjU3IDAwMDAwIG4gCjAwMDA2 MTk4ODMgMDAwMDAgbiAKMDAwMDYyMDE1MSAwMDAwMCBuIAowMDAwNjIwNDIw IDAwMDAwIG4gCjAwMDA2MjA2OTcgMDAwMDAgbiAKMDAwMDYyMDk4MiAwMDAw MCBuIAowMDAwNjIxMjg2IDAwMDAwIG4gCjAwMDA2MjE1NzkgMDAwMDAgbiAK MDAwMDYyMTk2OCAwMDAwMCBuIAowMDAwNjIyMjc1IDAwMDAwIG4gCjAwMDA2 MjI1ODIgMDAwMDAgbiAKMDAwMDYyMjg3NyAwMDAwMCBuIAowMDAwNjIzMTU5 IDAwMDAwIG4gCjAwMDA2MjM0NDggMDAwMDAgbiAKMDAwMDYyMzczMCAwMDAw MCBuIAowMDAwNjI0MDEyIDAwMDAwIG4gCjAwMDA2MjQzMTMgMDAwMDAgbiAK MDAwMDYyNDYzMyAwMDAwMCBuIAowMDAwNjI0ODk1IDAwMDAwIG4gCjAwMDA2 MjUxNTQgMDAwMDAgbiAKMDAwMDYyNTQwNCAwMDAwMCBuIAowMDAwNjI1Nzk0 IDAwMDAwIG4gCjAwMDA2MjYwMzIgMDAwMDAgbiAKMDAwMDYyNjI1NyAwMDAw MCBuIAowMDAwNjI2NDk3IDAwMDAwIG4gCjAwMDA2MjY3NzEgMDAwMDAgbiAK MDAwMDYyNzA0NiAwMDAwMCBuIAowMDAwNjI3MzE3IDAwMDAwIG4gCjAwMDA2 Mjc2MDIgMDAwMDAgbiAKMDAwMDYyNzkxMyAwMDAwMCBuIAowMDAwNjI4MjEy IDAwMDAwIG4gCjAwMDA2Mjg1ODUgMDAwMDAgbiAKMDAwMDYyODg5OCAwMDAw MCBuIAowMDAwNjI5MjExIDAwMDAwIG4gCjAwMDA2Mjk1MTIgMDAwMDAgbiAK MDAwMDYyOTgxMyAwMDAwMCBuIAowMDAwNjMwMTE0IDAwMDAwIG4gCjAwMDA2 MzA0MDkgMDAwMDAgbiAKMDAwMDYzMDcwNCAwMDAwMCBuIAowMDAwNjMxMDEx IDAwMDAwIG4gCjAwMDA2MzEzNzYgMDAwMDAgbiAKMDAwMDYzMTY1MCAwMDAw MCBuIAowMDAwNjMxOTI2IDAwMDAwIG4gCjAwMDA2MzIyMDAgMDAwMDAgbiAK MDAwMDYzMjU3NyAwMDAwMCBuIAowMDAwNjMyODE1IDAwMDAwIG4gCjAwMDA2 MzMwNDAgMDAwMDAgbiAKMDAwMDYzMzI3MiAwMDAwMCBuIAowMDAwNjMzNTUz IDAwMDAwIG4gCjAwMDA2MzM4MjIgMDAwMDAgbiAKMDAwMDYzNDA5OSAwMDAw MCBuIAowMDAwNjM0MzkwIDAwMDAwIG4gCjAwMDA2MzQ2OTMgMDAwMDAgbiAK MDAwMDYzNDk5OCAwMDAwMCBuIAowMDAwNjM1MzkyIDAwMDAwIG4gCjAwMDA2 MzU3MDUgMDAwMDAgbiAKMDAwMDYzNjAxMiAwMDAwMCBuIAowMDAwNjM2MzE5 IDAwMDAwIG4gCjAwMDA2MzY2MDYgMDAwMDAgbiAKMDAwMDYzNjg5NSAwMDAw MCBuIAowMDAwNjM3MTg0IDAwMDAwIG4gCjAwMDA2Mzc0NjYgMDAwMDAgbiAK MDAwMDYzNzc2NyAwMDAwMCBuIAowMDAwNjM4MTE0IDAwMDAwIG4gCjAwMDA2 Mzg0MDEgMDAwMDAgbiAKMDAwMDYzODY3MiAwMDAwMCBuIAowMDAwNjM4OTI5 IDAwMDAwIG4gCjAwMDA2MzkzMzUgMDAwMDAgbiAKMDAwMDYzOTU3MyAwMDAw MCBuIAowMDAwNjM5Nzk4IDAwMDAwIG4gCjAwMDA2NDAwMjQgMDAwMDAgbiAK MDAwMDY0MDI5MiAwMDAwMCBuIAowMDAwNjQwNTU1IDAwMDAwIG4gCjAwMDA2 NDA4MzkgMDAwMDAgbiAKMDAwMDY0MTExNyAwMDAwMCBuIAowMDAwNjQxNDI4 IDAwMDAwIG4gCjAwMDA2NDE3MzkgMDAwMDAgbiAKMDAwMDY0MjEyNiAwMDAw MCBuIAowMDAwNjQyNDI3IDAwMDAwIG4gCjAwMDA2NDI3NDAgMDAwMDAgbiAK MDAwMDY0MzA0MSAwMDAwMCBuIAowMDAwNjQzMzM2IDAwMDAwIG4gCjAwMDA2 NDM2MTggMDAwMDAgbiAKMDAwMDY0MzkxMyAwMDAwMCBuIAowMDAwNjQ0MjAy IDAwMDAwIG4gCjAwMDA2NDQ0ODQgMDAwMDAgbiAKMDAwMDY0NDgzMSAwMDAw MCBuIAowMDAwNjQ1MTE4IDAwMDAwIG4gCjAwMDA2NDUzNzYgMDAwMDAgbiAK MDAwMDY0NTYyNyAwMDAwMCBuIAowMDAwNjQ2MDQyIDAwMDAwIG4gCjAwMDA2 NDYyODAgMDAwMDAgbiAKMDAwMDY0NjUwNSAwMDAwMCBuIAowMDAwNjQ2NzMx IDAwMDAwIG4gCjAwMDA2NDcwMDUgMDAwMDAgbiAKMDAwMDY0NzI4MCAwMDAw MCBuIAowMDAwNjQ3NTcwIDAwMDAwIG4gCjAwMDA2NDc4NjEgMDAwMDAgbiAK MDAwMDY0ODE3OCAwMDAwMCBuIAowMDAwNjQ4NDk1IDAwMDAwIG4gCjAwMDA2 NDg4OTcgMDAwMDAgbiAKMDAwMDY0OTIxMCAwMDAwMCBuIAowMDAwNjQ5NTE3 IDAwMDAwIG4gCjAwMDA2NDk4MjQgMDAwMDAgbiAKMDAwMDY1MDEyNSAwMDAw MCBuIAowMDAwNjUwNDMyIDAwMDAwIG4gCjAwMDA2NTA3MzMgMDAwMDAgbiAK MDAwMDY1MTAxMyAwMDAwMCBuIAowMDAwNjUxMzA4IDAwMDAwIG4gCjAwMDA2 NTE2NzIgMDAwMDAgbiAKMDAwMDY1MTk1MiAwMDAwMCBuIAowMDAwNjUyMjE2 IDAwMDAwIG4gCjAwMDA2NTI0ODYgMDAwMDAgbiAKMDAwMDY1Mjg4MCAwMDAw MCBuIAowMDAwNjUzMTMwIDAwMDAwIG4gCjAwMDA2NTM2OTEgMDAwMDAgbiAK MDAwMDY1MzM1NSAwMDAwMCBuIAowMDAwNjU0MzI0IDAwMDAwIG4gCjAwMDA2 NTM5OTQgMDAwMDAgbiAKMDAwMDY1NDk2MCAwMDAwMCBuIAowMDAwNjU0NjI3 IDAwMDAwIG4gCjAwMDA2NTU1OTEgMDAwMDAgbiAKMDAwMDY1NTI2MyAwMDAw MCBuIAowMDAwNjU2MjMzIDAwMDAwIG4gCjAwMDA2NTU4OTQgMDAwMDAgbiAK MDAwMDY1Njg3MCAwMDAwMCBuIAowMDAwNjU2NTM2IDAwMDAwIG4gCjAwMDA2 NTc1MDYgMDAwMDAgbiAKMDAwMDY1NzE3MyAwMDAwMCBuIAowMDAwNjU4MTM2 IDAwMDAwIG4gCjAwMDA2NTc4MDkgMDAwMDAgbiAKMDAwMDY1ODQzOSAwMDAw MCBuIAowMDAxMDUzNjAyIDAwMDAwIG4gCjAwMDA2NTk4MzUgMDAwMDAgbiAK MDAwMTA1MzQyMyAwMDAwMCBuIAowMDAxMDUzOTU4IDAwMDAwIG4gCjAwMDA2 NjA4MjUgMDAwMDAgbiAKMDAwMTA1Mzc4MyAwMDAwMCBuIAowMDAxMDU0MzE5 IDAwMDAwIG4gCjAwMDA2NjE4MTYgMDAwMDAgbiAKMDAwMTA1NDEzNSAwMDAw MCBuIAowMDAxMDU0Njc5IDAwMDAwIG4gCjAwMDA2NjI4MTEgMDAwMDAgbiAK MDAwMTA1NDUwNSAwMDAwMCBuIAowMDAxMDU1MDI1IDAwMDAwIG4gCjAwMDA2 NjM4MDQgMDAwMDAgbiAKMDAwMTA1NDg1NSAwMDAwMCBuIAowMDAxMDU1Mzc0 IDAwMDAwIG4gCjAwMDA2NjQ3OTQgMDAwMDAgbiAKMDAwMTA1NTE5NyAwMDAw MCBuIAowMDAxMDU1NzIyIDAwMDAwIG4gCjAwMDA2NjU4MzkgMDAwMDAgbiAK MDAwMTA1NTU1MyAwMDAwMCBuIAowMDAxMDU2MDc1IDAwMDAwIG4gCjAwMDA2 NjY4MzMgMDAwMDAgbiAKMDAwMTA1NTg5MyAwMDAwMCBuIAowMDAxMDU2NDM2 IDAwMDAwIG4gCjAwMDA2Njc4MjYgMDAwMDAgbiAKMDAwMTA1NjI1OSAwMDAw MCBuIAowMDAxMDU2Nzg5IDAwMDAwIG4gCjAwMDA2Njg4MTggMDAwMDAgbiAK MDAwMTA1NjYxNSAwMDAwMCBuIAowMDAxMDU3MTQ2IDAwMDAwIG4gCjAwMDA2 Njk4MDcgMDAwMDAgbiAKMDAwMTA1Njk2NSAwMDAwMCBuIAowMDAxMDU3NTAy IDAwMDAwIG4gCjAwMDA2NzA4MTYgMDAwMDAgbiAKMDAwMTA1NzMyNyAwMDAw MCBuIAowMDAwNjcxODE2IDAwMDAwIG4gCjAwMDA2NzIxNTEgMDAwMDAgbiAK MDAwMDY3MjM2OSAwMDAwMCBuIAowMDAwNjcyNTkzIDAwMDAwIG4gCjAwMDA2 NzI4MTEgMDAwMDAgbiAKMDAwMDY3MzAzNSAwMDAwMCBuIAowMDAwNjczMjU5 IDAwMDAwIG4gCjAwMDA2NzM0NzcgMDAwMDAgbiAKMDAwMDY3MzY4OSAwMDAw MCBuIAowMDAwNjczOTAxIDAwMDAwIG4gCjAwMDA2NzQxMjUgMDAwMDAgbiAK MDAwMDY3NDMzNyAwMDAwMCBuIAowMDAwNjc0NTQ5IDAwMDAwIG4gCjAwMDA2 NzQ3NjEgMDAwMDAgbiAKMDAwMDY3NDk3MyAwMDAwMCBuIAowMDAwNjc1MTk3 IDAwMDAwIG4gCjAwMDA2NzU0MTUgMDAwMDAgbiAKMDAwMDY3NTYyNyAwMDAw MCBuIAowMDAwNjc1ODQ1IDAwMDAwIG4gCjAwMDA2NzYwNjMgMDAwMDAgbiAK MDAwMDY3NjI3NSAwMDAwMCBuIAowMDAwNjc2NDg3IDAwMDAwIG4gCjAwMDA2 NzY3MDUgMDAwMDAgbiAKMDAwMDY3NjkyMyAwMDAwMCBuIAowMDAwNjc3MTQx IDAwMDAwIG4gCjAwMDA2NzczNjUgMDAwMDAgbiAKMDAwMDY3NzU4MyAwMDAw MCBuIAowMDAwNjc3Nzk1IDAwMDAwIG4gCjAwMDA2NzgwMDcgMDAwMDAgbiAK MDAwMDY3ODIxOSAwMDAwMCBuIAowMDAwNjc4NDMxIDAwMDAwIG4gCjAwMDA2 Nzg2NTUgMDAwMDAgbiAKMDAwMDY3ODg3MyAwMDAwMCBuIAowMDAwNjc5MDg1 IDAwMDAwIG4gCjAwMDA2NzkzMDMgMDAwMDAgbiAKMDAwMDY3OTUxNSAwMDAw MCBuIAowMDAwNjc5NzI3IDAwMDAwIG4gCjAwMDA2Nzk5MzkgMDAwMDAgbiAK MDAwMDY4MDE1NyAwMDAwMCBuIAowMDAwNjgwMzc1IDAwMDAwIG4gCjAwMDA2 ODA1OTMgMDAwMDAgbiAKMDAwMDY4MDgzMiAwMDAwMCBuIAowMDAwNjgxMDUw IDAwMDAwIG4gCjAwMDA2ODEyNjggMDAwMDAgbiAKMDAwMDY4MTQ5OCAwMDAw MCBuIAowMDAwNjgxNzI4IDAwMDAwIG4gCjAwMDA2ODE5NDYgMDAwMDAgbiAK MDAwMDY4MjE1OCAwMDAwMCBuIAowMDAwNjgyMzcwIDAwMDAwIG4gCjAwMDA2 ODI2MDAgMDAwMDAgbiAKMDAwMDY4MjgxOCAwMDAwMCBuIAowMDAwNjgzMDMw IDAwMDAwIG4gCjAwMDA2ODMyNDIgMDAwMDAgbiAKMDAwMDY4MzQ1NCAwMDAw MCBuIAowMDAwNjgzNzA2IDAwMDAwIG4gCjAwMDA2ODM5MzAgMDAwMDAgbiAK MDAwMDY4NDE0MiAwMDAwMCBuIAowMDAwNjg0NDI5IDAwMDAwIG4gCjAwMDA2 ODQ2NTMgMDAwMDAgbiAKMDAwMDY4NDg3NyAwMDAwMCBuIAowMDAwNjg1MTM2 IDAwMDAwIG4gCjAwMDA2ODUzNDggMDAwMDAgbiAKMDAwMDY4NTU3MiAwMDAw MCBuIAowMDAwNjg1ODE5IDAwMDAwIG4gCjAwMDA2ODYwNDMgMDAwMDAgbiAK MDAwMDY4NjI4MiAwMDAwMCBuIAowMDAwNjg2NTI4IDAwMDAwIG4gCjAwMDA2 ODY3NjcgMDAwMDAgbiAKMDAwMDY4NzAyNiAwMDAwMCBuIAowMDAwNjg3MjUw IDAwMDAwIG4gCjAwMDA2ODc0NjggMDAwMDAgbiAKMDAwMDY4Nzc2MiAwMDAw MCBuIAowMDAwNjg3OTg2IDAwMDAwIG4gCjAwMDA2ODgyMDQgMDAwMDAgbiAK MDAwMDY4ODQ3OSAwMDAwMCBuIAowMDAwNjg4NzAzIDAwMDAwIG4gCjAwMDA2 ODg5MjEgMDAwMDAgbiAKMDAwMDY4OTE4NCAwMDAwMCBuIAowMDAwNjg5NDQx IDAwMDAwIG4gCjAwMDA2ODk2NzMgMDAwMDAgbiAKMDAwMDY4OTkyNCAwMDAw MCBuIAowMDAwNjkwMTUwIDAwMDAwIG4gCjAwMDA2OTAzODIgMDAwMDAgbiAK MDAwMDY5MDYyNyAwMDAwMCBuIAowMDAwNjkwODUzIDAwMDAwIG4gCjAwMDA2 OTEwNzkgMDAwMDAgbiAKMDAwMDY5MTMwOCAwMDAwMCBuIAowMDAwNjkxNTI4 IDAwMDAwIG4gCjAwMDA2OTE3NzMgMDAwMDAgbiAKMDAwMDY5MjAzMSAwMDAw MCBuIAowMDAwNjkyMzE4IDAwMDAwIG4gCjAwMDA2OTI1ODMgMDAwMDAgbiAK MDAwMDY5MjgyNSAwMDAwMCBuIAowMDAwNjkzMDY4IDAwMDAwIG4gCjAwMDA2 OTMzMjIgMDAwMDAgbiAKMDAwMDY5MzU2NyAwMDAwMCBuIAowMDAwNjkzNzg1 IDAwMDAwIG4gCjAwMDA2OTQwMDMgMDAwMDAgbiAKMDAwMDY5NDIxNSAwMDAw MCBuIAowMDAwNjk0NDQ1IDAwMDAwIG4gCjAwMDA2OTQ2NzEgMDAwMDAgbiAK MDAwMDY5NDg4OSAwMDAwMCBuIAowMDAwNjk1MTA3IDAwMDAwIG4gCjAwMDA2 OTUzMzEgMDAwMDAgbiAKMDAwMDY5NTU1NSAwMDAwMCBuIAowMDAwNjk1Nzgx IDAwMDAwIG4gCjAwMDA2OTYwMTEgMDAwMDAgbiAKMDAwMDY5NjIyOSAwMDAw MCBuIAowMDAwNjk2NDQ3IDAwMDAwIG4gCjAwMDA2OTY2NjUgMDAwMDAgbiAK MDAwMDY5Njg4NSAwMDAwMCBuIAowMDAwNjk3MTA5IDAwMDAwIG4gCjAwMDA2 OTczMzMgMDAwMDAgbiAKMDAwMDY5NzU1MSAwMDAwMCBuIAowMDAwNjk3NzYz IDAwMDAwIG4gCjAwMDA2OTc5ODEgMDAwMDAgbiAKMDAwMDY5ODIyMSAwMDAw MCBuIAowMDAwNjk4NDM5IDAwMDAwIG4gCjAwMDA2OTg2NjMgMDAwMDAgbiAK MDAwMDY5ODg4MSAwMDAwMCBuIAowMDAwNjk5MTExIDAwMDAwIG4gCjAwMDA2 OTkzMzUgMDAwMDAgbiAKMDAwMDY5OTU2NSAwMDAwMCBuIAowMDAwNjk5ODA0 IDAwMDAwIG4gCjAwMDA3MDAwNDQgMDAwMDAgbiAKMDAwMDcwMDI3NiAwMDAw MCBuIAowMDAwNzAwNTMwIDAwMDAwIG4gCjAwMDA3MDA3NjIgMDAwMDAgbiAK MDAwMDcwMDk5NCAwMDAwMCBuIAowMDAwNzAxMjI0IDAwMDAwIG4gCjAwMDA3 MDE0NDggMDAwMDAgbiAKMDAwMDcwMTY3MiAwMDAwMCBuIAowMDAwNzAxODk2 IDAwMDAwIG4gCjAwMDA3MDIxMzYgMDAwMDAgbiAKMDAwMDcwMjM3NyAwMDAw MCBuIAowMDAwNzAyNjA5IDAwMDAwIG4gCjAwMDA3MDI4NDEgMDAwMDAgbiAK MDAwMDcwMzA2NyAwMDAwMCBuIAowMDAwNzAzMjg3IDAwMDAwIG4gCjAwMDA3 MDM1MTMgMDAwMDAgbiAKMDAwMDcwMzc0MyAwMDAwMCBuIAowMDAwNzAzOTYz IDAwMDAwIG4gCjAwMDA3MDQxOTUgMDAwMDAgbiAKMDAwMDcwNDQyNyAwMDAw MCBuIAowMDAwNzA0NjYxIDAwMDAwIG4gCjAwMDA3MDQ4ODcgMDAwMDAgbiAK MDAwMDcwNTExMyAwMDAwMCBuIAowMDAwNzA1MzM3IDAwMDAwIG4gCjAwMDA3 MDU1NjEgMDAwMDAgbiAKMDAwMDcwNTc4NSAwMDAwMCBuIAowMDAwNzA2MDA5 IDAwMDAwIG4gCjAwMDA3MDYyMzUgMDAwMDAgbiAKMDAwMDcwNjQ5MiAwMDAw MCBuIAowMDAwNzA2NzE4IDAwMDAwIG4gCjAwMDA3MDY5NTAgMDAwMDAgbiAK MDAwMDcwNzE5MCAwMDAwMCBuIAowMDAwNzA3NDM2IDAwMDAwIG4gCjAwMDA3 MDc2NjAgMDAwMDAgbiAKMDAwMDcwNzkyMyAwMDAwMCBuIAowMDAwNzA4MTQ3 IDAwMDAwIG4gCjAwMDA3MDgzNzEgMDAwMDAgbiAKMDAwMDcwODYwNSAwMDAw MCBuIAowMDAwNzA4ODIzIDAwMDAwIG4gCjAwMDA3MDkwNDcgMDAwMDAgbiAK MDAwMDcwOTI3MSAwMDAwMCBuIAowMDAwNzA5NDg5IDAwMDAwIG4gCjAwMDA3 MDk3MTMgMDAwMDAgbiAKMDAwMDcwOTkzNyAwMDAwMCBuIAowMDAwNzEwMTYx IDAwMDAwIG4gCjAwMDA3MTAzOTEgMDAwMDAgbiAKMDAwMDcxMDY1NyAwMDAw MCBuIAowMDAwNzEwODk3IDAwMDAwIG4gCjAwMDA3MTExMDkgMDAwMDAgbiAK MDAwMDcxMTM0OCAwMDAwMCBuIAowMDAwNzExNTYwIDAwMDAwIG4gCjAwMDA3 MTE3ODQgMDAwMDAgbiAKMDAwMDcxMjAwOCAwMDAwMCBuIAowMDAwNzEyMjM4 IDAwMDAwIG4gCjAwMDA3MTI0NjIgMDAwMDAgbiAKMDAwMDcxMjY5MiAwMDAw MCBuIAowMDAwNzEyOTEwIDAwMDAwIG4gCjAwMDA3MTMxNDAgMDAwMDAgbiAK MDAwMDcxMzQwOCAwMDAwMCBuIAowMDAwNzEzNjQ3IDAwMDAwIG4gCjAwMDA3 MTM4ODYgMDAwMDAgbiAKMDAwMDcxNDEwNCAwMDAwMCBuIAowMDAwNzE0MzIy IDAwMDAwIG4gCjAwMDA3MTQ1NjIgMDAwMDAgbiAKMDAwMDcxNDgzNCAwMDAw MCBuIAowMDAwNzE1MDgxIDAwMDAwIG4gCjAwMDA3MTUzMTEgMDAwMDAgbiAK MDAwMDcxNTU4NSAwMDAwMCBuIAowMDAwNzE1ODA5IDAwMDAwIG4gCjAwMDA3 MTYwMjEgMDAwMDAgbiAKMDAwMDcxNjI0NSAwMDAwMCBuIAowMDAwNzE2NDY5 IDAwMDAwIG4gCjAwMDA3MTY3MTkgMDAwMDAgbiAKMDAwMDcxNjk0NSAwMDAw MCBuIAowMDAwNzE3MTc3IDAwMDAwIG4gCjAwMDA3MTc0MDkgMDAwMDAgbiAK MDAwMDcxNzY0MiAwMDAwMCBuIAowMDAwNzE3OTIyIDAwMDAwIG4gCjAwMDA3 MTgxNDggMDAwMDAgbiAKMDAwMDcxODM3MiAwMDAwMCBuIAowMDAwNzE4NTk4 IDAwMDAwIG4gCjAwMDA3MTg4MzAgMDAwMDAgbiAKMDAwMDcxOTA2MCAwMDAw MCBuIAowMDAwNzE5Mjc4IDAwMDAwIG4gCjAwMDA3MTk1MDIgMDAwMDAgbiAK MDAwMDcxOTcyNiAwMDAwMCBuIAowMDAwNzE5OTk0IDAwMDAwIG4gCjAwMDA3 MjAyMzQgMDAwMDAgbiAKMDAwMDcyMDQ2MCAwMDAwMCBuIAowMDAwNzIwNjg2 IDAwMDAwIG4gCjAwMDA3MjA5MTMgMDAwMDAgbiAKMDAwMDcyMTE5MyAwMDAw MCBuIAowMDAwNzIxNDI1IDAwMDAwIG4gCjAwMDA3MjE2NDkgMDAwMDAgbiAK MDAwMDcyMTg4OSAwMDAwMCBuIAowMDAwNzIyMTIxIDAwMDAwIG4gCjAwMDA3 MjIzNjQgMDAwMDAgbiAKMDAwMDcyMjU5NCAwMDAwMCBuIAowMDAwNzIyODEy IDAwMDAwIG4gCjAwMDA3MjMwMzYgMDAwMDAgbiAKMDAwMDcyMzI2NiAwMDAw MCBuIAowMDAwNzIzNDkwIDAwMDAwIG4gCjAwMDA3MjM3MTQgMDAwMDAgbiAK MDAwMDcyMzkzOCAwMDAwMCBuIAowMDAwNzI0MTcwIDAwMDAwIG4gCjAwMDA3 MjQ0MDQgMDAwMDAgbiAKMDAwMDcyNDY4OSAwMDAwMCBuIAowMDAwNzI0OTEz IDAwMDAwIG4gCjAwMDA3MjUxNDUgMDAwMDAgbiAKMDAwMDcyNTM2OSAwMDAw MCBuIAowMDAwNzI1NTkzIDAwMDAwIG4gCjAwMDA3MjU4MDUgMDAwMDAgbiAK MDAwMDcyNjAyMyAwMDAwMCBuIAowMDAwNzI2Mjc1IDAwMDAwIG4gCjAwMDA3 MjY1MDEgMDAwMDAgbiAKMDAwMDcyNjc0NyAwMDAwMCBuIAowMDAwNzI2OTcx IDAwMDAwIG4gCjAwMDA3MjcxOTcgMDAwMDAgbiAKMDAwMDcyNzQ0MyAwMDAw MCBuIAowMDAwNzI3Njc1IDAwMDAwIG4gCjAwMDA3Mjc4OTkgMDAwMDAgbiAK MDAwMDcyODEyMyAwMDAwMCBuIAowMDAwNzI4MzQzIDAwMDAwIG4gCjAwMDA3 Mjg2MDcgMDAwMDAgbiAKMDAwMDcyODg1OSAwMDAwMCBuIAowMDAwNzI5MDg1 IDAwMDAwIG4gCjAwMDA3MjkzMjUgMDAwMDAgbiAKMDAwMDcyOTU3MSAwMDAw MCBuIAowMDAwNzI5ODAzIDAwMDAwIG4gCjAwMDA3MzAwMzUgMDAwMDAgbiAK MDAwMDczMDI2NyAwMDAwMCBuIAowMDAwNzMwNDkzIDAwMDAwIG4gCjAwMDA3 MzA3MjMgMDAwMDAgbiAKMDAwMDczMDk2MyAwMDAwMCBuIAowMDAwNzMxMTk1 IDAwMDAwIG4gCjAwMDA3MzE0MTkgMDAwMDAgbiAKMDAwMDczMTY0MyAwMDAw MCBuIAowMDAwNzMxODczIDAwMDAwIG4gCjAwMDA3MzIwOTkgMDAwMDAgbiAK MDAwMDczMjMzOSAwMDAwMCBuIAowMDAwNzMyNTY1IDAwMDAwIG4gCjAwMDA3 MzI3ODUgMDAwMDAgbiAKMDAwMDczMzAwOSAwMDAwMCBuIAowMDAwNzMzMjQ5 IDAwMDAwIG4gCjAwMDA3MzM0NzUgMDAwMDAgbiAKMDAwMDczMzcwNyAwMDAw MCBuIAowMDAwNzMzOTM5IDAwMDAwIG4gCjAwMDA3MzQxNjMgMDAwMDAgbiAK MDAwMDczNDQwMiAwMDAwMCBuIAowMDAwNzM0NjMyIDAwMDAwIG4gCjAwMDA3 MzQ4NzIgMDAwMDAgbiAKMDAwMDczNTExMSAwMDAwMCBuIAowMDAwNzM1MzQx IDAwMDAwIG4gCjAwMDA3MzU1NjUgMDAwMDAgbiAKMDAwMDczNTc4MyAwMDAw MCBuIAowMDAwNzM2MDIzIDAwMDAwIG4gCjAwMDA3MzYyNDcgMDAwMDAgbiAK MDAwMDczNjQ3NyAwMDAwMCBuIAowMDAwNzM2NzA5IDAwMDAwIG4gCjAwMDA3 MzY5NDEgMDAwMDAgbiAKMDAwMDczNzE1OSAwMDAwMCBuIAowMDAwNzM3Mzk5 IDAwMDAwIG4gCjAwMDA3Mzc2MjUgMDAwMDAgbiAKMDAwMDczNzg0OSAwMDAw MCBuIAowMDAwNzM4MDc5IDAwMDAwIG4gCjAwMDA3MzgyOTkgMDAwMDAgbiAK MDAwMDczODUyMyAwMDAwMCBuIAowMDAwNzM4NzQ5IDAwMDAwIG4gCjAwMDA3 Mzg5NjcgMDAwMDAgbiAKMDAwMDczOTE5MSAwMDAwMCBuIAowMDAwNzM5NDA5 IDAwMDAwIG4gCjAwMDA3Mzk2MzMgMDAwMDAgbiAKMDAwMDczOTg1MSAwMDAw MCBuIAowMDAwNzQwMDY5IDAwMDAwIG4gCjAwMDA3NDAyOTUgMDAwMDAgbiAK MDAwMDc0MDUxMyAwMDAwMCBuIAowMDAwNzQwNzMxIDAwMDAwIG4gCjAwMDA3 NDA5NTUgMDAwMDAgbiAKMDAwMDc0MTE3NSAwMDAwMCBuIAowMDAwNzQxMzk5 IDAwMDAwIG4gCjAwMDA3NDE2MjMgMDAwMDAgbiAKMDAwMDc0MTg0MyAwMDAw MCBuIAowMDAwNzQyMDY3IDAwMDAwIG4gCjAwMDA3NDIyODUgMDAwMDAgbiAK MDAwMDc0MjQ5NyAwMDAwMCBuIAowMDAwNzQyNzE1IDAwMDAwIG4gCjAwMDA3 NDI5MzMgMDAwMDAgbiAKMDAwMDc0MzE1NyAwMDAwMCBuIAowMDAwNzQzNDAz IDAwMDAwIG4gCjAwMDA3NDM2MjcgMDAwMDAgbiAKMDAwMDc0Mzg0NSAwMDAw MCBuIAowMDAwNzQ0MDY5IDAwMDAwIG4gCjAwMDA3NDQyOTMgMDAwMDAgbiAK MDAwMDc0NDUxMSAwMDAwMCBuIAowMDAwNzQ0NzUxIDAwMDAwIG4gCjAwMDA3 NDQ5ODMgMDAwMDAgbiAKMDAwMDc0NTIwNyAwMDAwMCBuIAowMDAwNzQ1NDMx IDAwMDAwIG4gCjAwMDA3NDU2NjMgMDAwMDAgbiAKMDAwMDc0NTg4OSAwMDAw MCBuIAowMDAwNzQ2MTE1IDAwMDAwIG4gCjAwMDA3NDYzNTUgMDAwMDAgbiAK MDAwMDc0NjU4NyAwMDAwMCBuIAowMDAwNzQ2ODIwIDAwMDAwIG4gCjAwMDA3 NDcwNDYgMDAwMDAgbiAKMDAwMDc0NzI5MiAwMDAwMCBuIAowMDAwNzQ3NTI0 IDAwMDAwIG4gCjAwMDA3NDc3NTAgMDAwMDAgbiAKMDAwMDc0ODAwMSAwMDAw MCBuIAowMDAwNzQ4MjQxIDAwMDAwIG4gCjAwMDA3NDg0ODIgMDAwMDAgbiAK MDAwMDc0ODcxMiAwMDAwMCBuIAowMDAwNzQ4OTM2IDAwMDAwIG4gCjAwMDA3 NDkxNjIgMDAwMDAgbiAKMDAwMDc0OTM4MCAwMDAwMCBuIAowMDAwNzQ5NTky IDAwMDAwIG4gCjAwMDA3NDk4MjQgMDAwMDAgbiAKMDAwMDc1MDA4MCAwMDAw MCBuIAowMDAwNzUwMzEzIDAwMDAwIG4gCjAwMDA3NTA1MzEgMDAwMDAgbiAK MDAwMDc1MDc0OSAwMDAwMCBuIAowMDAwNzUwOTY3IDAwMDAwIG4gCjAwMDA3 NTExOTEgMDAwMDAgbiAKMDAwMDc1MTQxNyAwMDAwMCBuIAowMDAwNzUxNjQ5 IDAwMDAwIG4gCjAwMDA3NTE4NzMgMDAwMDAgbiAKMDAwMDc1MjExNSAwMDAw MCBuIAowMDAwNzUyMzc3IDAwMDAwIG4gCjAwMDA3NTI1OTUgMDAwMDAgbiAK MDAwMDc1MjgzOCAwMDAwMCBuIAowMDAwNzUzMDcwIDAwMDAwIG4gCjAwMDA3 NTMzMTAgMDAwMDAgbiAKMDAwMDc1MzUyOCAwMDAwMCBuIAowMDAwNzUzNzU2 IDAwMDAwIG4gCjAwMDA3NTQwMTIgMDAwMDAgbiAKMDAwMDc1NDIzMCAwMDAw MCBuIAowMDAwNzU0NDU0IDAwMDAwIG4gCjAwMDA3NTQ2ODYgMDAwMDAgbiAK MDAwMDc1NDkyNSAwMDAwMCBuIAowMDAwNzU1MTgwIDAwMDAwIG4gCjAwMDA3 NTU0NDIgMDAwMDAgbiAKMDAwMDc1NTY4MyAwMDAwMCBuIAowMDAwNzU1OTAx IDAwMDAwIG4gCjAwMDA3NTYxNDEgMDAwMDAgbiAKMDAwMDc1NjM3MyAwMDAw MCBuIAowMDAwNzU2NjEyIDAwMDAwIG4gCjAwMDA3NTY4MzYgMDAwMDAgbiAK MDAwMDc1NzA5MiAwMDAwMCBuIAowMDAwNzU3MzMzIDAwMDAwIG4gCjAwMDA3 NTc1NjYgMDAwMDAgbiAKMDAwMDc1NzgxMiAwMDAwMCBuIAowMDAwNzU4MDM2 IDAwMDAwIG4gCjAwMDA3NTgyOTkgMDAwMDAgbiAKMDAwMDc1ODUzMSAwMDAw MCBuIAowMDAwNzU4NzgzIDAwMDAwIG4gCjAwMDA3NTkwMTUgMDAwMDAgbiAK MDAwMDc1OTI1NiAwMDAwMCBuIAowMDAwNzU5NDgyIDAwMDAwIG4gCjAwMDA3 NTk3MDYgMDAwMDAgbiAKMDAwMDc1OTk1MSAwMDAwMCBuIAowMDAwNzYwMTgz IDAwMDAwIG4gCjAwMDA3NjA0MjMgMDAwMDAgbiAKMDAwMDc2MDY0OSAwMDAw MCBuIAowMDAwNzYwODk1IDAwMDAwIG4gCjAwMDA3NjExMjcgMDAwMDAgbiAK MDAwMDc2MTM1MSAwMDAwMCBuIAowMDAwNzYxNjIwIDAwMDAwIG4gCjAwMDA3 NjE4NDQgMDAwMDAgbiAKMDAwMDc2MjA5MCAwMDAwMCBuIAowMDAwNzYyMzE0 IDAwMDAwIG4gCjAwMDA3NjI1MzIgMDAwMDAgbiAKMDAwMDc2Mjc2MiAwMDAw MCBuIAowMDAwNzYzMDk1IDAwMDAwIG4gCjAwMDA3NjMzMDcgMDAwMDAgbiAK MDAwMDc2MzUxOSAwMDAwMCBuIAowMDAwNzYzNzMxIDAwMDAwIG4gCjAwMDA3 NjM5ODkgMDAwMDAgbiAKMDAwMDc2NDI3MCAwMDAwMCBuIAowMDAwNzY0NTAw IDAwMDAwIG4gCjAwMDA3NjQ3NjAgMDAwMDAgbiAKMDAwMDc2NDk5MCAwMDAw MCBuIAowMDAwNzY1MjM4IDAwMDAwIG4gCjAwMDA3NjU0NzcgMDAwMDAgbiAK MDAwMDc2NTcyOSAwMDAwMCBuIAowMDAwNzY1OTY4IDAwMDAwIG4gCjAwMDA3 NjYyMjggMDAwMDAgbiAKMDAwMDc2NjUyMyAwMDAwMCBuIAowMDAwNzY2ODA2 IDAwMDAwIG4gCjAwMDA3NjcwNzYgMDAwMDAgbiAKMDAwMDc2NzMzNCAwMDAw MCBuIAowMDAwNzY3NTg2IDAwMDAwIG4gCjAwMDA3Njc4MzggMDAwMDAgbiAK MDAwMDc2ODA2OCAwMDAwMCBuIAowMDAwNzY4MzE0IDAwMDAwIG4gCjAwMDA3 Njg1NzcgMDAwMDAgbiAKMDAwMDc2ODg3NCAwMDAwMCBuIAowMDAwNzY5MTM5 IDAwMDAwIG4gCjAwMDA3NjkzODMgMDAwMDAgbiAKMDAwMDc2OTYzMyAwMDAw MCBuIAowMDAwNzY5ODg3IDAwMDAwIG4gCjAwMDA3NzAxMjYgMDAwMDAgbiAK MDAwMDc3MDM1MCAwMDAwMCBuIAowMDAwNzcwNTg5IDAwMDAwIG4gCjAwMDA3 NzA4MTUgMDAwMDAgbiAKMDAwMDc3MTAzMyAwMDAwMCBuIAowMDAwNzcxMjUx IDAwMDAwIG4gCjAwMDA3NzE0ODMgMDAwMDAgbiAKMDAwMDc3MTcxMyAwMDAw MCBuIAowMDAwNzcxOTUyIDAwMDAwIG4gCjAwMDA3NzIxNzggMDAwMDAgbiAK MDAwMDc3MjQzMyAwMDAwMCBuIAowMDAwNzcyNjU5IDAwMDAwIG4gCjAwMDA3 NzI4OTkgMDAwMDAgbiAKMDAwMDc3MzEzMSAwMDAwMCBuIAowMDAwNzczMzQ5 IDAwMDAwIG4gCjAwMDA3NzM1ODkgMDAwMDAgbiAKMDAwMDc3MzgyOCAwMDAw MCBuIAowMDAwNzc0MDYwIDAwMDAwIG4gCjAwMDA3NzQyODYgMDAwMDAgbiAK MDAwMDc3NDUwNiAwMDAwMCBuIAowMDAwNzc0NzM4IDAwMDAwIG4gCjAwMDA3 NzQ5NzAgMDAwMDAgbiAKMDAwMDc3NTIxMyAwMDAwMCBuIAowMDAwNzc1NDM5 IDAwMDAwIG4gCjAwMDA3NzU2NjUgMDAwMDAgbiAKMDAwMDc3NTg4OSAwMDAw MCBuIAowMDAwNzc2MTEzIDAwMDAwIG4gCjAwMDA3NzYzMzkgMDAwMDAgbiAK MDAwMDc3NjU4NiAwMDAwMCBuIAowMDAwNzc2ODEyIDAwMDAwIG4gCjAwMDA3 NzcwMzggMDAwMDAgbiAKMDAwMDc3NzMwMSAwMDAwMCBuIAowMDAwNzc3NTY0 IDAwMDAwIG4gCjAwMDA3Nzc3OTQgMDAwMDAgbiAKMDAwMDc3ODAxMiAwMDAw MCBuIAowMDAwNzc4MjU1IDAwMDAwIG4gCjAwMDA3Nzg0ODUgMDAwMDAgbiAK MDAwMDc3ODcxNSAwMDAwMCBuIAowMDAwNzc4OTMzIDAwMDAwIG4gCjAwMDA3 NzkxOTcgMDAwMDAgbiAKMDAwMDc3OTQyMSAwMDAwMCBuIAowMDAwNzc5NjYx IDAwMDAwIG4gCjAwMDA3Nzk4OTMgMDAwMDAgbiAKMDAwMDc4MDEzMyAwMDAw MCBuIAowMDAwNzgwMzY1IDAwMDAwIG4gCjAwMDA3ODA1OTcgMDAwMDAgbiAK MDAwMDc4MDg2NSAwMDAwMCBuIAowMDAwNzgxMTA0IDAwMDAwIG4gCjAwMDA3 ODEzNDkgMDAwMDAgbiAKMDAwMDc4MTU2NyAwMDAwMCBuIAowMDAwNzgxNzg1 IDAwMDAwIG4gCjAwMDA3ODIwMjYgMDAwMDAgbiAKMDAwMDc4MjI0NCAwMDAw MCBuIAowMDAwNzgyNTE0IDAwMDAwIG4gCjAwMDA3ODI3NjggMDAwMDAgbiAK MDAwMDc4MzAwMCAwMDAwMCBuIAowMDAwNzgzMjY4IDAwMDAwIG4gCjAwMDA3 ODM1MTggMDAwMDAgbiAKMDAwMDc4Mzc0NCAwMDAwMCBuIAowMDAwNzgzOTc2 IDAwMDAwIG4gCjAwMDA3ODQyMDggMDAwMDAgbiAKMDAwMDc4NDQ1MCAwMDAw MCBuIAowMDAwNzg0Njc0IDAwMDAwIG4gCjAwMDA3ODQ5NDEgMDAwMDAgbiAK MDAwMDc4NTE3MyAwMDAwMCBuIAowMDAwNzg1NDA1IDAwMDAwIG4gCjAwMDA3 ODU2NTAgMDAwMDAgbiAKMDAwMDc4NTg2MiAwMDAwMCBuIAowMDAwNzg2MDg2 IDAwMDAwIG4gCjAwMDA3ODYzNDkgMDAwMDAgbiAKMDAwMDc4NjU4OSAwMDAw MCBuIAowMDAwNzg2ODIxIDAwMDAwIG4gCjAwMDA3ODcwNDcgMDAwMDAgbiAK MDAwMDc4NzI3NSAwMDAwMCBuIAowMDAwNzg3NDk5IDAwMDAwIG4gCjAwMDA3 ODc3NzggMDAwMDAgbiAKMDAwMDc4ODAwNCAwMDAwMCBuIAowMDAwNzg4MjUx IDAwMDAwIG4gCjAwMDA3ODg0OTEgMDAwMDAgbiAKMDAwMDc4ODczNCAwMDAw MCBuIAowMDAwNzg4OTY2IDAwMDAwIG4gCjAwMDA3ODkxOTIgMDAwMDAgbiAK MDAwMDc4OTQyNCAwMDAwMCBuIAowMDAwNzg5NjU0IDAwMDAwIG4gCjAwMDA3 ODk4NzggMDAwMDAgbiAKMDAwMDc5MDExMCAwMDAwMCBuIAowMDAwNzkwMzQ0 IDAwMDAwIG4gCjAwMDA3OTA1NjggMDAwMDAgbiAKMDAwMDc5MDgzNiAwMDAw MCBuIAowMDAwNzkxMDU0IDAwMDAwIG4gCjAwMDA3OTEyODAgMDAwMDAgbiAK MDAwMDc5MTUxMCAwMDAwMCBuIAowMDAwNzkxNzQyIDAwMDAwIG4gCjAwMDA3 OTE5OTQgMDAwMDAgbiAKMDAwMDc5MjI0MCAwMDAwMCBuIAowMDAwNzkyNDcy IDAwMDAwIG4gCjAwMDA3OTI2OTggMDAwMDAgbiAKMDAwMDc5Mjk1MCAwMDAw MCBuIAowMDAwNzkzMTgyIDAwMDAwIG4gCjAwMDA3OTM0MTQgMDAwMDAgbiAK MDAwMDc5MzYzNCAwMDAwMCBuIAowMDAwNzkzODY3IDAwMDAwIG4gCjAwMDA3 OTQxMjUgMDAwMDAgbiAKMDAwMDc5NDM3MSAwMDAwMCBuIAowMDAwNzk0NTk3 IDAwMDAwIG4gCjAwMDA3OTQ4NjcgMDAwMDAgbiAKMDAwMDc5NTEwMCAwMDAw MCBuIAowMDAwNzk1MzMyIDAwMDAwIG4gCjAwMDA3OTU1NTggMDAwMDAgbiAK MDAwMDc5NTc5MCAwMDAwMCBuIAowMDAwNzk2MDMwIDAwMDAwIG4gCjAwMDA3 OTYyNzAgMDAwMDAgbiAKMDAwMDc5NjQ5NCAwMDAwMCBuIAowMDAwNzk2NzI2 IDAwMDAwIG4gCjAwMDA3OTY5NTIgMDAwMDAgbiAKMDAwMDc5NzE3OCAwMDAw MCBuIAowMDAwNzk3NDMwIDAwMDAwIG4gCjAwMDA3OTc2NjMgMDAwMDAgbiAK MDAwMDc5Nzg5NSAwMDAwMCBuIAowMDAwNzk4MTM0IDAwMDAwIG4gCjAwMDA3 OTgzNzMgMDAwMDAgbiAKMDAwMDc5ODYxMyAwMDAwMCBuIAowMDAwNzk4ODUz IDAwMDAwIG4gCjAwMDA3OTkwODMgMDAwMDAgbiAKMDAwMDc5OTMwNyAwMDAw MCBuIAowMDAwNzk5NTUzIDAwMDAwIG4gCjAwMDA3OTk3NzcgMDAwMDAgbiAK MDAwMDgwMDAwMyAwMDAwMCBuIAowMDAwODAwMjM1IDAwMDAwIG4gCjAwMDA4 MDA0NTMgMDAwMDAgbiAKMDAwMDgwMDcxMCAwMDAwMCBuIAowMDAwODAwOTM0 IDAwMDAwIG4gCjAwMDA4MDExNTggMDAwMDAgbiAKMDAwMDgwMTM3OCAwMDAw MCBuIAowMDAwODAxNTk4IDAwMDAwIG4gCjAwMDA4MDE4MjQgMDAwMDAgbiAK MDAwMDgwMjA0MiAwMDAwMCBuIAowMDAwODAyMjYwIDAwMDAwIG4gCjAwMDA4 MDI0NzggMDAwMDAgbiAKMDAwMDgwMjY5NiAwMDAwMCBuIAowMDAwODAyOTIz IDAwMDAwIG4gCjAwMDA4MDMxNDcgMDAwMDAgbiAKMDAwMDgwMzM3MSAwMDAw MCBuIAowMDAwODAzNTkyIDAwMDAwIG4gCjAwMDA4MDM4MTMgMDAwMDAgbiAK MDAwMDgwNDAzMSAwMDAwMCBuIAowMDAwODA0MjU1IDAwMDAwIG4gCjAwMDA4 MDQ1MDIgMDAwMDAgbiAKMDAwMDgwNDczMiAwMDAwMCBuIAowMDAwODA0OTU2 IDAwMDAwIG4gCjAwMDA4MDUxODAgMDAwMDAgbiAKMDAwMDgwNTQwNCAwMDAw MCBuIAowMDAwODA1NjMwIDAwMDAwIG4gCjAwMDA4MDU4NTQgMDAwMDAgbiAK MDAwMDgwNjA4NiAwMDAwMCBuIAowMDAwODA2MzEyIDAwMDAwIG4gCjAwMDA4 MDY1MzggMDAwMDAgbiAKMDAwMDgwNjc2NCAwMDAwMCBuIAowMDAwODA3MDI4 IDAwMDAwIG4gCjAwMDA4MDcyNTQgMDAwMDAgbiAKMDAwMDgwNzQ4NyAwMDAw MCBuIAowMDAwODA3NzI3IDAwMDAwIG4gCjAwMDA4MDc5NDUgMDAwMDAgbiAK MDAwMDgwODE2OSAwMDAwMCBuIAowMDAwODA4MzkzIDAwMDAwIG4gCjAwMDA4 MDg2MjggMDAwMDAgbiAKMDAwMDgwODg2OSAwMDAwMCBuIAowMDAwODA5MTEw IDAwMDAwIG4gCjAwMDA4MDkzMzQgMDAwMDAgbiAKMDAwMDgwOTU1OCAwMDAw MCBuIAowMDAwODA5ODA5IDAwMDAwIG4gCjAwMDA4MTAwMzUgMDAwMDAgbiAK MDAwMDgxMDI3NSAwMDAwMCBuIAowMDAwODEwNTA1IDAwMDAwIG4gCjAwMDA4 MTA3NDggMDAwMDAgbiAKMDAwMDgxMTAwNiAwMDAwMCBuIAowMDAwODExMjMy IDAwMDAwIG4gCjAwMDA4MTE0NzIgMDAwMDAgbiAKMDAwMDgxMTcwMiAwMDAw MCBuIAowMDAwODExOTI4IDAwMDAwIG4gCjAwMDA4MTIxNjggMDAwMDAgbiAK MDAwMDgxMjQxNCAwMDAwMCBuIAowMDAwODEyNjYwIDAwMDAwIG4gCjAwMDA4 MTI4ODQgMDAwMDAgbiAKMDAwMDgxMzEwOCAwMDAwMCBuIAowMDAwODEzMzQ5 IDAwMDAwIG4gCjAwMDA4MTM1NzMgMDAwMDAgbiAKMDAwMDgxMzc5MSAwMDAw MCBuIAowMDAwODE0MDM4IDAwMDAwIG4gCjAwMDA4MTQyNTYgMDAwMDAgbiAK MDAwMDgxNDQ5NiAwMDAwMCBuIAowMDAwODE0NzIwIDAwMDAwIG4gCjAwMDA4 MTQ5ODQgMDAwMDAgbiAKMDAwMDgxNTIxNiAwMDAwMCBuIAowMDAwODE1NDU3 IDAwMDAwIG4gCjAwMDA4MTU2ODMgMDAwMDAgbiAKMDAwMDgxNTkwNyAwMDAw MCBuIAowMDAwODE2MTQzIDAwMDAwIG4gCjAwMDA4MTYzNjkgMDAwMDAgbiAK MDAwMDgxNjYwOSAwMDAwMCBuIAowMDAwODE2ODM1IDAwMDAwIG4gCjAwMDA4 MTcwNTkgMDAwMDAgbiAKMDAwMDgxNzMyMiAwMDAwMCBuIAowMDAwODE3NTY4 IDAwMDAwIG4gCjAwMDA4MTc3OTIgMDAwMDAgbiAKMDAwMDgxODM2MyAwMDAw MCBuIAowMDAwODE4MDI0IDAwMDAwIG4gCjAwMDA4MTkwMDAgMDAwMDAgbiAK MDAwMDgxODY2NiAwMDAwMCBuIAowMDAwODE5NjM2IDAwMDAwIG4gCjAwMDA4 MTkzMDMgMDAwMDAgbiAKMDAwMDgyMDI2NSAwMDAwMCBuIAowMDAwODE5OTM4 IDAwMDAwIG4gCjAwMDA4MjA5MDMgMDAwMDAgbiAKMDAwMDgyMDU2OCAwMDAw MCBuIAowMDAwODIxNTM1IDAwMDAwIG4gCjAwMDA4MjEyMDYgMDAwMDAgbiAK MDAwMDgyMjE3MCAwMDAwMCBuIAowMDAwODIxODM4IDAwMDAwIG4gCjAwMDA4 MjI4MDEgMDAwMDAgbiAKMDAwMDgyMjQ3MyAwMDAwMCBuIAowMDAwODIzNDQy IDAwMDAwIG4gCjAwMDA4MjMxMDQgMDAwMDAgbiAKMDAwMDgyNDA3OCAwMDAw MCBuIAowMDAwODIzNzQ1IDAwMDAwIG4gCjAwMDA4MjQ3MTMgMDAwMDAgbiAK MDAwMDgyNDM4MSAwMDAwMCBuIAowMDAwODI1MzQzIDAwMDAwIG4gCjAwMDA4 MjUwMTYgMDAwMDAgbiAKMDAwMDgyNTY0NiAwMDAwMCBuIAowMDAwODI3MDMy IDAwMDAwIG4gCjAwMDA4Mjg0MjAgMDAwMDAgbiAKMDAwMDgyOTA1MSAwMDAw MCBuIAowMDAwODMwNDQzIDAwMDAwIG4gCjAwMDA4MzA3ODQgMDAwMDAgbiAK MDAwMDgzMTAwOCAwMDAwMCBuIAowMDAwODMxMjMyIDAwMDAwIG4gCjAwMDA4 MzE0NTYgMDAwMDAgbiAKMDAwMDgzMTY4MCAwMDAwMCBuIAowMDAwODMxOTA0 IDAwMDAwIG4gCjAwMDA4MzIxMjggMDAwMDAgbiAKMDAwMDgzMjM1MiAwMDAw MCBuIAowMDAwODMyNTc2IDAwMDAwIG4gCjAwMDA4MzI4MDAgMDAwMDAgbiAK MDAwMDgzMzAyNCAwMDAwMCBuIAowMDAwODMzMjYzIDAwMDAwIG4gCjAwMDA4 MzM0ODcgMDAwMDAgbiAKMDAwMDgzMzcyNiAwMDAwMCBuIAowMDAwODMzOTY1 IDAwMDAwIG4gCjAwMDA4MzQyMDQgMDAwMDAgbiAKMDAwMDgzNDQyOCAwMDAw MCBuIAowMDAwODM0Njk0IDAwMDAwIG4gCjAwMDA4MzQ5ODIgMDAwMDAgbiAK MDAwMDgzNTIxNCAwMDAwMCBuIAowMDAwODM1NDgxIDAwMDAwIG4gCjAwMDA4 MzU2OTkgMDAwMDAgbiAKMDAwMDgzNTkzMSAwMDAwMCBuIAowMDAwODM2MTg2 IDAwMDAwIG4gCjAwMDA4MzY0MTAgMDAwMDAgbiAKMDAwMDgzNjY1NiAwMDAw MCBuIAowMDAwODM2OTE2IDAwMDAwIG4gCjAwMDA4MzcxNjIgMDAwMDAgbiAK MDAwMDgzNzQyOSAwMDAwMCBuIAowMDAwODM3NjQ3IDAwMDAwIG4gCjAwMDA4 Mzc5NTYgMDAwMDAgbiAKMDAwMDgzODE4MCAwMDAwMCBuIAowMDAwODM4NDY1 IDAwMDAwIG4gCjAwMDA4Mzg2ODkgMDAwMDAgbiAKMDAwMDgzODk2MSAwMDAw MCBuIAowMDAwODM5MjI3IDAwMDAwIG4gCjAwMDA4Mzk0NjYgMDAwMDAgbiAK MDAwMDgzOTcyNiAwMDAwMCBuIAowMDAwODM5OTU4IDAwMDAwIG4gCjAwMDA4 NDAyMTggMDAwMDAgbiAKMDAwMDg0MDQ0NCAwMDAwMCBuIAowMDAwODQwNjgx IDAwMDAwIG4gCjAwMDA4NDA5MzUgMDAwMDAgbiAKMDAwMDg0MTIwNyAwMDAw MCBuIAowMDAwODQxNTE1IDAwMDAwIG4gCjAwMDA4NDE3NjggMDAwMDAgbiAK MDAwMDg0MjAxNSAwMDAwMCBuIAowMDAwODQyMjYwIDAwMDAwIG4gCjAwMDA4 NDI1MTEgMDAwMDAgbiAKMDAwMDg0Mjc2NiAwMDAwMCBuIAowMDAwODQzMDEy IDAwMDAwIG4gCjAwMDA4NDMyMzIgMDAwMDAgbiAKMDAwMDg0MzQ1MCAwMDAw MCBuIAowMDAwODQzNjcwIDAwMDAwIG4gCjAwMDA4NDM4OTQgMDAwMDAgbiAK MDAwMDg0NDEyNiAwMDAwMCBuIAowMDAwODQ0MzQ2IDAwMDAwIG4gCjAwMDA4 NDQ1NjQgMDAwMDAgbiAKMDAwMDg0NDc4OCAwMDAwMCBuIAowMDAwODQ1MDE0 IDAwMDAwIG4gCjAwMDA4NDUyNDAgMDAwMDAgbiAKMDAwMDg0NTQ2NCAwMDAw MCBuIAowMDAwODQ1NzA0IDAwMDAwIG4gCjAwMDA4NDU5MjggMDAwMDAgbiAK MDAwMDg0NjE2MCAwMDAwMCBuIAowMDAwODQ2Mzg2IDAwMDAwIG4gCjAwMDA4 NDY2MjYgMDAwMDAgbiAKMDAwMDg0Njg2NiAwMDAwMCBuIAowMDAwODQ3MDk4 IDAwMDAwIG4gCjAwMDA4NDczNjAgMDAwMDAgbiAKMDAwMDg0NzU5MiAwMDAw MCBuIAowMDAwODQ3ODI0IDAwMDAwIG4gCjAwMDA4NDgwNDggMDAwMDAgbiAK MDAwMDg0ODI5MCAwMDAwMCBuIAowMDAwODQ4NTMzIDAwMDAwIG4gCjAwMDA4 NDg3NzMgMDAwMDAgbiAKMDAwMDg0OTAwNSAwMDAwMCBuIAowMDAwODQ5MjMx IDAwMDAwIG4gCjAwMDA4NDk0NjMgMDAwMDAgbiAKMDAwMDg0OTY5NSAwMDAw MCBuIAowMDAwODQ5OTE2IDAwMDAwIG4gCjAwMDA4NTAxNDggMDAwMDAgbiAK MDAwMDg1MDM4MSAwMDAwMCBuIAowMDAwODUwNjMxIDAwMDAwIG4gCjAwMDA4 NTA4NTcgMDAwMDAgbiAKMDAwMDg1MTA4NCAwMDAwMCBuIAowMDAwODUxMzEw IDAwMDAwIG4gCjAwMDA4NTE1MzQgMDAwMDAgbiAKMDAwMDg1MTc2MiAwMDAw MCBuIAowMDAwODUyMDExIDAwMDAwIG4gCjAwMDA4NTIyMzcgMDAwMDAgbiAK MDAwMDg1MjQ2MyAwMDAwMCBuIAowMDAwODUyNjk1IDAwMDAwIG4gCjAwMDA4 NTI5MzUgMDAwMDAgbiAKMDAwMDg1MzE4MiAwMDAwMCBuIAowMDAwODUzNDA4 IDAwMDAwIG4gCjAwMDA4NTM2NzMgMDAwMDAgbiAKMDAwMDg1MzkwNSAwMDAw MCBuIAowMDAwODU0MTU1IDAwMDAwIG4gCjAwMDA4NTQzODcgMDAwMDAgbiAK MDAwMDg1NDYxOSAwMDAwMCBuIAowMDAwODU0ODQzIDAwMDAwIG4gCjAwMDA4 NTUxMDkgMDAwMDAgbiAKMDAwMDg1NTMzMyAwMDAwMCBuIAowMDAwODU1NTc0 IDAwMDAwIG4gCjAwMDA4NTU4MTQgMDAwMDAgbiAKMDAwMDg1NjA0NiAwMDAw MCBuIAowMDAwODU2Mjc4IDAwMDAwIG4gCjAwMDA4NTY1MTAgMDAwMDAgbiAK MDAwMDg1NjcyOCAwMDAwMCBuIAowMDAwODU2OTYwIDAwMDAwIG4gCjAwMDA4 NTcyMzAgMDAwMDAgbiAKMDAwMDg1NzQ3NiAwMDAwMCBuIAowMDAwODU3NzIy IDAwMDAwIG4gCjAwMDA4NTc5NDIgMDAwMDAgbiAKMDAwMDg1ODE4NCAwMDAw MCBuIAowMDAwODU4NDEwIDAwMDAwIG4gCjAwMDA4NTg2ODIgMDAwMDAgbiAK MDAwMDg1ODkzNyAwMDAwMCBuIAowMDAwODU5MjEyIDAwMDAwIG4gCjAwMDA4 NTk0MzggMDAwMDAgbiAKMDAwMDg1OTY2NCAwMDAwMCBuIAowMDAwODU5ODg4 IDAwMDAwIG4gCjAwMDA4NjAxMzkgMDAwMDAgbiAKMDAwMDg2MDM2NSAwMDAw MCBuIAowMDAwODYwNTkxIDAwMDAwIG4gCjAwMDA4NjA4MjQgMDAwMDAgbiAK MDAwMDg2MTA1NiAwMDAwMCBuIAowMDAwODYxMjk5IDAwMDAwIG4gCjAwMDA4 NjE1MzEgMDAwMDAgbiAKMDAwMDg2MTgwNSAwMDAwMCBuIAowMDAwODYyMDM3 IDAwMDAwIG4gCjAwMDA4NjIyNjMgMDAwMDAgbiAKMDAwMDg2MjQ5NiAwMDAw MCBuIAowMDAwODYyNzI4IDAwMDAwIG4gCjAwMDA4NjI5NTQgMDAwMDAgbiAK MDAwMDg2MzE3OCAwMDAwMCBuIAowMDAwODYzNDQ4IDAwMDAwIG4gCjAwMDA4 NjM2ODkgMDAwMDAgbiAKMDAwMDg2MzkxNSAwMDAwMCBuIAowMDAwODY0MTQ5 IDAwMDAwIG4gCjAwMDA4NjQzODEgMDAwMDAgbiAKMDAwMDg2NDY2MSAwMDAw MCBuIAowMDAwODY0ODkzIDAwMDAwIG4gCjAwMDA4NjUxMzMgMDAwMDAgbiAK MDAwMDg2NTM3OCAwMDAwMCBuIAowMDAwODY1NjEwIDAwMDAwIG4gCjAwMDA4 NjU4MzYgMDAwMDAgbiAKMDAwMDg2NjA2OCAwMDAwMCBuIAowMDAwODY2MzAz IDAwMDAwIG4gCjAwMDA4NjY1MjkgMDAwMDAgbiAKMDAwMDg2Njc5OCAwMDAw MCBuIAowMDAwODY3MDIyIDAwMDAwIG4gCjAwMDA4NjcyNDggMDAwMDAgbiAK MDAwMDg2NzQ4MCAwMDAwMCBuIAowMDAwODY3NzM0IDAwMDAwIG4gCjAwMDA4 Njc5NjAgMDAwMDAgbiAKMDAwMDg2ODIwNyAwMDAwMCBuIAowMDAwODY4NDI3 IDAwMDAwIG4gCjAwMDA4Njg2NTQgMDAwMDAgbiAKMDAwMDg2ODkwNyAwMDAw MCBuIAowMDAwODY5MTM5IDAwMDAwIG4gCjAwMDA4NjkzNjUgMDAwMDAgbiAK MDAwMDg2OTU4NyAwMDAwMCBuIAowMDAwODY5ODIxIDAwMDAwIG4gCjAwMDA4 NzAwODAgMDAwMDAgbiAKMDAwMDg3MDMzMyAwMDAwMCBuIAowMDAwODcwNTU5 IDAwMDAwIG4gCjAwMDA4NzA4MDAgMDAwMDAgbiAKMDAwMDg3MTA0NyAwMDAw MCBuIAowMDAwODcxMjgxIDAwMDAwIG4gCjAwMDA4NzE1MTQgMDAwMDAgbiAK MDAwMDg3MTc0NiAwMDAwMCBuIAowMDAwODcxOTczIDAwMDAwIG4gCjAwMDA4 NzIxOTkgMDAwMDAgbiAKMDAwMDg3MjQ0MCAwMDAwMCBuIAowMDAwODcyNjgx IDAwMDAwIG4gCjAwMDA4NzI5MDcgMDAwMDAgbiAKMDAwMDg3MzEzOSAwMDAw MCBuIAowMDAwODczMzY3IDAwMDAwIG4gCjAwMDA4NzM2MDkgMDAwMDAgbiAK MDAwMDg3MzgzNSAwMDAwMCBuIAowMDAwODc0MDU1IDAwMDAwIG4gCjAwMDA4 NzQyODEgMDAwMDAgbiAKMDAwMDg3NDUyMiAwMDAwMCBuIAowMDAwODc0NzU1 IDAwMDAwIG4gCjAwMDA4NzQ5ODkgMDAwMDAgbiAKMDAwMDg3NTIyMSAwMDAw MCBuIAowMDAwODc1NDY3IDAwMDAwIG4gCjAwMDA4NzU2OTMgMDAwMDAgbiAK MDAwMDg3NTkzMyAwMDAwMCBuIAowMDAwODc2MTczIDAwMDAwIG4gCjAwMDA4 NzY0MTIgMDAwMDAgbiAKMDAwMDg3NjYzOCAwMDAwMCBuIAowMDAwODc2ODg1 IDAwMDAwIG4gCjAwMDA4NzcxMTUgMDAwMDAgbiAKMDAwMDg3NzM0NyAwMDAw MCBuIAowMDAwODc3NTc5IDAwMDAwIG4gCjAwMDA4Nzc4MTEgMDAwMDAgbiAK MDAwMDg3ODAzNSAwMDAwMCBuIAowMDAwODc4MjgxIDAwMDAwIG4gCjAwMDA4 Nzg1MTMgMDAwMDAgbiAKMDAwMDg3ODc0NSAwMDAwMCBuIAowMDAwODc4OTc3 IDAwMDAwIG4gCjAwMDA4NzkxOTcgMDAwMDAgbiAKMDAwMDg3OTQyMyAwMDAw MCBuIAowMDAwODc5NjQ5IDAwMDAwIG4gCjAwMDA4Nzk4NzUgMDAwMDAgbiAK MDAwMDg4MDA5NSAwMDAwMCBuIAowMDAwODgwMzI3IDAwMDAwIG4gCjAwMDA4 ODA1NDcgMDAwMDAgbiAKMDAwMDg4MDc3MSAwMDAwMCBuIAowMDAwODgwOTkx IDAwMDAwIG4gCjAwMDA4ODEyMTEgMDAwMDAgbiAKMDAwMDg4MTQzOSAwMDAw MCBuIAowMDAwODgxNjYzIDAwMDAwIG4gCjAwMDA4ODE4ODkgMDAwMDAgbiAK MDAwMDg4MjExNSAwMDAwMCBuIAowMDAwODgyMzM3IDAwMDAwIG4gCjAwMDA4 ODI1NjEgMDAwMDAgbiAKMDAwMDg4Mjc4NSAwMDAwMCBuIAowMDAwODgzMDEx IDAwMDAwIG4gCjAwMDA4ODMyMzMgMDAwMDAgbiAKMDAwMDg4MzQ1NyAwMDAw MCBuIAowMDAwODgzNjgxIDAwMDAwIG4gCjAwMDA4ODM5MDcgMDAwMDAgbiAK MDAwMDg4NDEzMyAwMDAwMCBuIAowMDAwODg0MzgxIDAwMDAwIG4gCjAwMDA4 ODQ1OTkgMDAwMDAgbiAKMDAwMDg4NDgyOSAwMDAwMCBuIAowMDAwODg1MDUz IDAwMDAwIG4gCjAwMDA4ODUyOTUgMDAwMDAgbiAKMDAwMDg4NTUyNyAwMDAw MCBuIAowMDAwODg1NzUzIDAwMDAwIG4gCjAwMDA4ODU5NzkgMDAwMDAgbiAK MDAwMDg4NjIwNSAwMDAwMCBuIAowMDAwODg2NDQ2IDAwMDAwIG4gCjAwMDA4 ODY2NzggMDAwMDAgbiAKMDAwMDg4NjkxMiAwMDAwMCBuIAowMDAwODg3MTM4 IDAwMDAwIG4gCjAwMDA4ODczODYgMDAwMDAgbiAKMDAwMDg4NzYxOCAwMDAw MCBuIAowMDAwODg3ODQ0IDAwMDAwIG4gCjAwMDA4ODgwNzcgMDAwMDAgbiAK MDAwMDg4ODMxMSAwMDAwMCBuIAowMDAwODg4NTUzIDAwMDAwIG4gCjAwMDA4 ODg3OTYgMDAwMDAgbiAKMDAwMDg4OTAyMiAwMDAwMCBuIAowMDAwODg5MjUw IDAwMDAwIG4gCjAwMDA4ODk0OTAgMDAwMDAgbiAKMDAwMDg4OTcxNiAwMDAw MCBuIAowMDAwODg5OTY0IDAwMDAwIG4gCjAwMDA4OTAyMDcgMDAwMDAgbiAK MDAwMDg5MDQzMyAwMDAwMCBuIAowMDAwODkwNjYxIDAwMDAwIG4gCjAwMDA4 OTA5MDEgMDAwMDAgbiAKMDAwMDg5MTEyNSAwMDAwMCBuIAowMDAwODkxMzU3 IDAwMDAwIG4gCjAwMDA4OTE2MDUgMDAwMDAgbiAKMDAwMDg5MTgzNyAwMDAw MCBuIAowMDAwODkyMDgyIDAwMDAwIG4gCjAwMDA4OTIzMTYgMDAwMDAgbiAK MDAwMDg5MjU1NiAwMDAwMCBuIAowMDAwODkyNzc0IDAwMDAwIG4gCjAwMDA4 OTMwMDIgMDAwMDAgbiAKMDAwMDg5MzI0NCAwMDAwMCBuIAowMDAwODkzNDc2 IDAwMDAwIG4gCjAwMDA4OTM3MDIgMDAwMDAgbiAKMDAwMDg5MzkzNSAwMDAw MCBuIAowMDAwODk0MTU5IDAwMDAwIG4gCjAwMDA4OTQ0MTMgMDAwMDAgbiAK MDAwMDg5NDY2MSAwMDAwMCBuIAowMDAwODk0ODkzIDAwMDAwIG4gCjAwMDA4 OTUxMzYgMDAwMDAgbiAKMDAwMDg5NTM2MiAwMDAwMCBuIAowMDAwODk1NjA0 IDAwMDAwIG4gCjAwMDA4OTU4NDMgMDAwMDAgbiAKMDAwMDg5NjA2OSAwMDAw MCBuIAowMDAwODk2MzE3IDAwMDAwIG4gCjAwMDA4OTY1MzcgMDAwMDAgbiAK MDAwMDg5Njc3NiAwMDAwMCBuIAowMDAwODk3MDEwIDAwMDAwIG4gCjAwMDA4 OTcyNTYgMDAwMDAgbiAKMDAwMDg5NzQ4MiAwMDAwMCBuIAowMDAwODk3NzUz IDAwMDAwIG4gCjAwMDA4OTc5ODUgMDAwMDAgbiAKMDAwMDg5ODIxOSAwMDAw MCBuIAowMDAwODk4NDYxIDAwMDAwIG4gCjAwMDA4OTg2OTUgMDAwMDAgbiAK MDAwMDg5ODkzOCAwMDAwMCBuIAowMDAwODk5MTY0IDAwMDAwIG4gCjAwMDA4 OTkzOTAgMDAwMDAgbiAKMDAwMDg5OTYzNyAwMDAwMCBuIAowMDAwODk5ODYz IDAwMDAwIG4gCjAwMDA5MDAwOTcgMDAwMDAgbiAKMDAwMDkwMDMzOCAwMDAw MCBuIAowMDAwOTAwNTY0IDAwMDAwIG4gCjAwMDA5MDA4MTIgMDAwMDAgbiAK MDAwMDkwMTA0NCAwMDAwMCBuIAowMDAwOTAxMjcwIDAwMDAwIG4gCjAwMDA5 MDE1NDAgMDAwMDAgbiAKMDAwMDkwMTc3MiAwMDAwMCBuIAowMDAwOTAyMDI1 IDAwMDAwIG4gCjAwMDA5MDIzMzAgMDAwMDAgbiAKdHJhaWxlcgo8PAovU2l6 ZSAyNDMwCi9Sb290IDMgMCBSCi9JbmZvIDIgMCBSCi9JRFs8OTRkMTQ4MTc1 ZTVjZDNlYzFiMGU2YWM2MmZlNTdkZWI+PDk0ZDE0ODE3NWU1Y2QzZWMxYjBl NmFjNjJmZTU3ZGViPl0KPj4Kc3RhcnR4cmVmCjEwNTc2OTgKJSVFT0YK ------=_NextPart_000_0094_01C2A9A6.0F775E36-- From stefanrin@gmail.com Tue Sep 11 11:36:35 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_DKIM_INVALID autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8BGaZDi121554 for ; Tue, 11 Sep 2012 11:36:35 -0500 X-ASG-Debug-ID: 1347381459-04cbb07ce398220001-NocioJ Received: from mail-oa0-f53.google.com (mail-oa0-f53.google.com [209.85.219.53]) by cuda.sgi.com with ESMTP id soC9LdHlgB4FNXC1 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 11 Sep 2012 09:37:39 -0700 (PDT) X-Barracuda-Envelope-From: stefanrin@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.219.53 X-Barracuda-IPDD: Level1 [gmail.com/209.85.219.53] Received: by oagi18 with SMTP id i18so434137oag.26 for ; Tue, 11 Sep 2012 09:37:38 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.219.53] X-Barracuda-IPDD: Level1 [gmail.com/209.85.219.53] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :content-type; bh=mPFiKNcTeksVc52L0nQhFXWTFuYA57xd10lpb/xoGW0=; b=fBhwlw83USElwAAyuX6SKXgOTxHGvhXtq46VqF7m+AjEMjgOagJqgnWBIqc/Y7nj8t 8p2No+C6DHEbNAFXtB6P2/Vdcwf2x7SSBCYDGBfIFxliYEt4TqTgJ4g3t3Z9hmlOTkN8 /DNZJ/Grxvjf3q+YFJNZuT9q8vqZxyduOflJrU6jmGdgldx6m3lW1geISLG2xLVE8+zU zK5vhrjK+xxbnJx/q8q8oBA8Cesbf82AanTyDI77SVzBrYjRODrKA9DCq1fV+8Yzukn3 wi2V/QiJ8epJ8uICd7xLHPMEmN9F5GI/bJiFAR0kWFJTRX4IpE6c3Tyce3zUSXlXVL6f vKLw== MIME-Version: 1.0 Received: by 10.182.45.42 with SMTP id j10mr18749698obm.60.1347381458767; Tue, 11 Sep 2012 09:37:38 -0700 (PDT) Received: by 10.76.114.225 with HTTP; Tue, 11 Sep 2012 09:37:38 -0700 (PDT) In-Reply-To: <20120726083242.GA2877@dastard> References: <20120717052621.GB23387@dastard> <50061CEA.4070609@hardwarefreak.com> <50066115.7070807@hardwarefreak.com> <50068EC5.5020704@hardwarefreak.com> <50077A34.5070304@hardwarefreak.com> <20120726083242.GA2877@dastard> Date: Tue, 11 Sep 2012 18:37:38 +0200 Message-ID: Subject: Re: A little RAID experiment From: Stefan Ring X-ASG-Orig-Subj: Re: A little RAID experiment To: Linux fs XFS Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-oa0-f53.google.com[209.85.219.53] X-Barracuda-Start-Time: 1347381459 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108247 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Thu, Jul 26, 2012, Dave Chinner wrote: >> 10001 >> 20001 >> 30001 >> 40001 >> 10002 >> 20002 >> 30002 >> 40002 >> 10003 >> 20003 >> ... > > That's the problem you should have reported. I did, but then I got bashed for using RAID 5/6 and about the specifics of hardware and everything, which shouldn't even matter, but I let myself get dragged into this discussion. Anyway, in the meantime I had a closer look at the actual block trace, and it looks a bit different than the way I interpreted it at first. It sends runs of 30-50 writes with holes in them, like so: 2, 4-5, 7, 10-12, 14, 16-17 and so on. These holes seem to be caused by the free space fragmentation. Every once in a while -- somewhat frequently, after 30 or so blocks, as mentioned -- it switches to another allocation group. If these blocks were contiguous, then the elevator should be able to merge them, but the tiny holes make this impossible. So I guess there's nothing that can be substantially improved here. The frequent ag switches are a bit difficult for the controller to handle, but different controllers struggle under different work loads, and there's nothing that can be done about that. I noticed just today that the HP SmartArray controllers handle truly random writes better than the MegaRAID variety that I praised so much in my postings. From cmaiolino@redhat.com Tue Sep 11 11:46:08 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8BGk8l8122618 for ; Tue, 11 Sep 2012 11:46:08 -0500 X-ASG-Debug-ID: 1347382032-04cb6c568694860001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Gyjm3i1vHkL0F23C for ; Tue, 11 Sep 2012 09:47:12 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8BGlB6k001471 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 11 Sep 2012 12:47:12 -0400 Received: from andromeda.usersys.redhat.com (ovpn-113-109.phx2.redhat.com [10.3.113.109]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q8BGl72d007466 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO) for ; Tue, 11 Sep 2012 12:47:10 -0400 Date: Tue, 11 Sep 2012 13:47:06 -0300 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: Re: [PATCH v5] Stop xfs_do_force_shutdown / messages fron xfs_log_force if filesystem is already shutdown. Message-ID: <20120911164706.GA15252@andromeda.usersys.redhat.com> X-ASG-Orig-Subj: Re: [PATCH v5] Stop xfs_do_force_shutdown / messages fron xfs_log_force if filesystem is already shutdown. Mail-Followup-To: xfs@oss.sgi.com References: <76577fa31ab2aa750994c1bc6a1b6f44beb03116.1347002369.git.rprabhu@wnohang.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <76577fa31ab2aa750994c1bc6a1b6f44beb03116.1347002369.git.rprabhu@wnohang.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1347382032 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com Hi, particularly, these messages are annoying to me too, and it's great to see this patch, have some comments though. > This is to prevent xfs_log_force from printing error message continuously (due > to xfs_sync and others) till umount if the disk has been forcefully unplugged. > > This is to prevent messages like these from being displayed repeatedly. > > [ 3873.009329] XFS (sdb3): xfs_log_force: error 5 returned. > > Note, that even after xfs_do_force_shutdown has been called, xfs_log_force > doesn't stop till the filesystem has been unmounted (and it keeps printing > "error 5 returned" to kernel log). Also, xfs_do_force_shutdown is called > repeatedly on an already shutdown filesystem through xfs_fs_sync_fs. > > To fix this, added condition over XFS_FORCED_SHUTDOWN to xfs_log_force and > xfs_fs_sync_fs. > > To simulate it, mount an xfs filesystem located on external disk, and then pull > the power to the disk. > > Now, the dmesg looks, > > [ 268.307303] XFS (sdb2): xfs_do_force_shutdown(0x1) called from line 1031 of file fs/xfs/xfs_buf.c. Return address = 0xffffffff8127c13a > [ 268.307318] XFS (sdb2): I/O Error Detected. Shutting down filesystem > [ 268.307323] XFS (sdb2): Please umount the filesystem and rectify the problem(s) > To be honest this commit message looks a little confusing to me, I'd prefer something a little more direct and clear, but this is just my humble opinion. I'd say something like: Prevents xfs_log_force from print continuously error messages after filesystem has been shutdown: [ 3873.009329] XFS (sdb3): xfs_log_force: error 5 returned. > --- > > Version 1: Removed calling xfs_syncd_stop from xfs_sync_worker. > Version 2: Removed calling xfs_fs_writable in xfs_sync_worker and xfs_flush_worker. > Version 3: Removed calling xfs_syncd_stop in xfs_bwrite. > Version 4: Added return statements to xfs_log_force and xfs_fs_sync_fs. > Version 5: As per suggestion, added xfs_warn to xfs_fs_sync_fs and removed EIO > return in xfs_log_force > > Signed-off-by: Raghavendra D Prabhu > Tested-by: Raghavendra D Prabhu > --- > fs/xfs/xfs_log.c | 5 ++++- > fs/xfs/xfs_super.c | 5 +++++ > 2 files changed, 9 insertions(+), 1 deletion(-) > > diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c > index 7f4f937..161c925 100644 > --- a/fs/xfs/xfs_log.c > +++ b/fs/xfs/xfs_log.c > @@ -3002,7 +3002,10 @@ xfs_log_force( > > trace_xfs_log_force(mp, 0); > error = _xfs_log_force(mp, flags, NULL); > - if (error) > + /* > + * Avoid warning when the filesystem has already shutdown. > + */ > + if (error && !XFS_FORCED_SHUTDOWN(mp)) > xfs_warn(mp, "%s: error %d returned.", __func__, error); > } > > diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c > index bdaf4cb..ebafc99 100644 > --- a/fs/xfs/xfs_super.c > +++ b/fs/xfs/xfs_super.c > @@ -943,6 +943,11 @@ xfs_fs_sync_fs( > if (!wait) > return 0; > > + if (XFS_FORCED_SHUTDOWN(mp)) { > + xfs_warn(mp, "Sync called: filesystem already shutdown"); > + return XFS_ERROR(EIO); > + } > + Looks like this will keep printing error messages every time a sync() happens, either via flusher threads or manually by user once xfs_fs_sync_fs() will still be called for it. I would suggest to add some static variable here to check if the filesystem has been already shutted down before print the message again, to also avoid message flooding due xfs_fs_sync_fs() calls although I'm not sure another people will agree with it. Despit my comments, this looks good for me Reviewed-by: Carlos Maiolino -- --Carlos From david@fromorbit.com Tue Sep 11 15:49:30 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_43 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8BKnUEu152434 for ; Tue, 11 Sep 2012 15:49:30 -0500 X-ASG-Debug-ID: 1347396632-04cb6c5688a5d20001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id ZMuo7EXP5xYAGWIM for ; Tue, 11 Sep 2012 13:50:33 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AgwKAPuiT1B5LPyM/2dsb2JhbABFulADgQSBCIIgAQEFJxMcIxAIAw4KLhQlAyETiA+8LxSKfG6EWGADlV6QHoJ4 Received: from ppp121-44-252-140.lns20.syd7.internode.on.net (HELO dastard) ([121.44.252.140]) by ipmail06.adl2.internode.on.net with ESMTP; 12 Sep 2012 06:20:31 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TBXPh-0007dY-Nh; Wed, 12 Sep 2012 06:50:29 +1000 Date: Wed, 12 Sep 2012 06:50:29 +1000 From: Dave Chinner To: Brian Foster Cc: Colin Ian King , xfs@oss.sgi.com Subject: Re: slow xfs writes on loopback mounted xfs with dd + seek Message-ID: <20120911205029.GC11511@dastard> X-ASG-Orig-Subj: Re: slow xfs writes on loopback mounted xfs with dd + seek References: <504F08E8.6020500@canonical.com> <504F5027.9080503@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <504F5027.9080503@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1347396633 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108261 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Sep 11, 2012 at 10:52:23AM -0400, Brian Foster wrote: > On 09/11/2012 05:48 AM, Colin Ian King wrote: > > Hi, > > > > I've seeing really slow I/O writes on xfs when doing a dd with a seek > > offset to a file on an xfs file system which is loop mounted. > > > > Reproduced on Linux 3.6.0-rc5 and 3.4 > > > > How to reproduce: > > > > dd if=/dev/zero of=xfs.img bs=1M count=1024 > > mkfs.xfs -f xfs.img > > sudo mount -o loop -t xfs xfs.img /mnt/test > > > > First create a large file, write performance is excellent: > > > > sudo dd if=/dev/zero of=/mnt/test/big bs=1M count=500 > > 500+0 records in > > 500+0 records out > > 524288000 bytes (524 MB) copied, 1.69451 s, 309 MB/s > > > > ..next seek and write some more blocks, write performance is poor: > > > > sudo dd if=/dev/zero of=/mnt/test/big obs=4K count=8192 seek=131072 > > 8192+0 records in > > 1024+0 records out > > 4194304 bytes (4.2 MB) copied, 47.0644 s, 89.1 kB/s > > > > Hi Colin, > > I reproduced this behavior with a 1GB filesystem on a loop device. I > think the problem you're seeing could be circumstantial to the fact that > you're writing to a point where you are close to filling the fs. > > Taking a look at the tracepoint data when running your second dd alone > vs. in succession to the first, I see a fairly clean > buffered_write->get_blocks pattern vs. a > buffered_write->enospc->log_force->get_blocks pattern. > > In other words, you're triggering an internal space allocation failure > and flush sequence intended to free up space. Somebody else might be > able to chime in and more ably explain why that occurs following a > truncate (perhaps the space isn't freed until the change hits the log), > but regardless this doesn't seem to occur if you increase the size of > the fs. The space is considered "busy" and won't be reused until the truncate transaction hits the log and the space is free on disk. See xfs_busy_extent.c Basically, testing XFS performance on tiny filesystems is going to show false behaviours. XFS is optimised for large filesystems and will typically shows low space artifacts on small filesystems, especially when you are doing things like filling most of the free filesystem space with 1 file. e.g. 1GB free on at 100TB filesystem will throttle behaviours (say speculative preallocation) much more effectively because itis within 1% of ENOSPC. That same 1GB free on a 1GB filesystem won't throttle preallocation at all, and so that one file when it reaches a little over 500MB will try to preallocate half the remaining space in the filesystem because the filesystem is only 50% full.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Sep 11 15:57:53 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8BKvq8S153274 for ; Tue, 11 Sep 2012 15:57:52 -0500 X-ASG-Debug-ID: 1347397135-04cbb07ce5a9cb0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id BoQQNpRyRhfhHJag for ; Tue, 11 Sep 2012 13:58:56 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AgwKALWlT1B5LPyM/2dsb2JhbAArGrpQA4EEgQiCIAEBBAE6HCMFCwgDDgouFCUDIROICgUMKrt8FIp8boRYYAOVXok0hmqCeA Received: from ppp121-44-252-140.lns20.syd7.internode.on.net (HELO dastard) ([121.44.252.140]) by ipmail06.adl2.internode.on.net with ESMTP; 12 Sep 2012 06:28:27 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TBXXP-0007em-2A; Wed, 12 Sep 2012 06:58:27 +1000 Date: Wed, 12 Sep 2012 06:58:27 +1000 From: Dave Chinner To: Jacek Luczak Cc: xfs@oss.sgi.com Subject: Re: Internal error xfs_trans_cancel at line 1467 of file fs/xfs/xfs_trans.c Message-ID: <20120911205827.GD11511@dastard> X-ASG-Orig-Subj: Re: Internal error xfs_trans_cancel at line 1467 of file fs/xfs/xfs_trans.c References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1347397135 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA085 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108261 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 BSF_SC0_SA085 Custom Rule SA085 On Tue, Sep 11, 2012 at 09:47:49AM +0200, Jacek Luczak wrote: > Hi All, > > got this during heavy IO (parallel checkout of few large projects from SVN): > > XFS (dm-8): Corruption detected. Unmount and run xfs_repair > XFS (dm-8): Internal error xfs_trans_cancel at line 1467 of file > fs/xfs/xfs_trans.c. Caller 0xffffffffa03c9974 > > Pid: 11930, comm: svn Not tainted 3.4.10-1 #1 > Call Trace: > [] ? xfs_trans_cancel+0x56/0xd7 [xfs] > [] ? xfs_create+0x467/0x4cf [xfs] > [] ? xfs_vn_mknod+0xcb/0x160 [xfs] > [] ? vfs_create+0x6e/0xc7 > [] ? do_last+0x3a5/0x745 > [] ? path_openat+0xce/0x35f > [] ? do_filp_open+0x2c/0x72 > [] ? xfs_release+0x1ac/0x1cc [xfs] > [] ? alloc_fd+0x69/0xf2 > [] ? do_sys_open+0x107/0x18e > [] ? system_call_fastpath+0x16/0x1b That won't tell us what caused the problem. FWIW: http://xfs.org/index.php/XFS_FAQ#Q:_What_information_should_I_include_when_reporting_a_problem.3F i.e. mount options, filesystem size, geometry, space usage on the filesystem, etc are all relevant. Indeed, this issue is often caused by fragmented free space andnot being able to allocate inodes, though that usually just results in ENOSPC. Use the xfs_db "freespace" command to dump the freespace histogram when the error occurs and you've unmounted the filesystem. > Is it a known issue? I have not - yet - enabled this host in CI thus > can't tell if this can be reproduced. > > I've done repair but did not saved output. Were there any errors that were fixed? Cheers, Dave. -- Dave Chinner david@fromorbit.com From colin.king@canonical.com Tue Sep 11 15:59:52 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_43, TO_NO_BRKTS_PCNT autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8BKxpQw153565 for ; Tue, 11 Sep 2012 15:59:51 -0500 X-ASG-Debug-ID: 1347397255-04bdf0067cb0a30001-NocioJ Received: from youngberry.canonical.com (youngberry.canonical.com [91.189.89.112]) by cuda.sgi.com with ESMTP id mMIEzGglAQMzmTOv for ; Tue, 11 Sep 2012 14:00:55 -0700 (PDT) X-Barracuda-Envelope-From: colin.king@canonical.com X-Barracuda-Apparent-Source-IP: 91.189.89.112 Received: from cpc3-craw6-2-0-cust180.croy.cable.virginmedia.com ([77.100.248.181] helo=[192.168.0.5]) by youngberry.canonical.com with esmtpsa (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1TBXZj-00038U-2H; Tue, 11 Sep 2012 21:00:51 +0000 Message-ID: <504FA682.8010905@canonical.com> Date: Tue, 11 Sep 2012 22:00:50 +0100 From: Colin Ian King User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:15.0) Gecko/20120827 Thunderbird/15.0 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: Re: slow xfs writes on loopback mounted xfs with dd + seek References: <504F08E8.6020500@canonical.com> <504F5027.9080503@redhat.com> <20120911205029.GC11511@dastard> X-ASG-Orig-Subj: Re: slow xfs writes on loopback mounted xfs with dd + seek In-Reply-To: <20120911205029.GC11511@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: youngberry.canonical.com[91.189.89.112] X-Barracuda-Start-Time: 1347397255 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108261 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 11/09/12 21:50, Dave Chinner wrote: > On Tue, Sep 11, 2012 at 10:52:23AM -0400, Brian Foster wrote: >> On 09/11/2012 05:48 AM, Colin Ian King wrote: >>> Hi, >>> >>> I've seeing really slow I/O writes on xfs when doing a dd with a seek >>> offset to a file on an xfs file system which is loop mounted. >>> >>> Reproduced on Linux 3.6.0-rc5 and 3.4 >>> >>> How to reproduce: >>> >>> dd if=/dev/zero of=xfs.img bs=1M count=1024 >>> mkfs.xfs -f xfs.img >>> sudo mount -o loop -t xfs xfs.img /mnt/test >>> >>> First create a large file, write performance is excellent: >>> >>> sudo dd if=/dev/zero of=/mnt/test/big bs=1M count=500 >>> 500+0 records in >>> 500+0 records out >>> 524288000 bytes (524 MB) copied, 1.69451 s, 309 MB/s >>> >>> ..next seek and write some more blocks, write performance is poor: >>> >>> sudo dd if=/dev/zero of=/mnt/test/big obs=4K count=8192 seek=131072 >>> 8192+0 records in >>> 1024+0 records out >>> 4194304 bytes (4.2 MB) copied, 47.0644 s, 89.1 kB/s >>> >> >> Hi Colin, >> >> I reproduced this behavior with a 1GB filesystem on a loop device. I >> think the problem you're seeing could be circumstantial to the fact that >> you're writing to a point where you are close to filling the fs. >> >> Taking a look at the tracepoint data when running your second dd alone >> vs. in succession to the first, I see a fairly clean >> buffered_write->get_blocks pattern vs. a >> buffered_write->enospc->log_force->get_blocks pattern. >> >> In other words, you're triggering an internal space allocation failure >> and flush sequence intended to free up space. Somebody else might be >> able to chime in and more ably explain why that occurs following a >> truncate (perhaps the space isn't freed until the change hits the log), >> but regardless this doesn't seem to occur if you increase the size of >> the fs. > > The space is considered "busy" and won't be reused until the > truncate transaction hits the log and the space is free on disk. See > xfs_busy_extent.c > > Basically, testing XFS performance on tiny filesystems is going to > show false behaviours. XFS is optimised for large filesystems and > will typically shows low space artifacts on small filesystems, > especially when you are doing things like filling most of the free > filesystem space with 1 file. > > e.g. 1GB free on at 100TB filesystem will throttle behaviours (say > speculative preallocation) much more effectively because itis within > 1% of ENOSPC. That same 1GB free on a 1GB filesystem won't throttle > preallocation at all, and so that one file when it reaches a little > over 500MB will try to preallocate half the remaining space in the > filesystem because the filesystem is only 50% full.... > That's a really useful explanation. Thanks! > Cheers, > > Dave. > From david@fromorbit.com Tue Sep 11 16:04:10 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8BL4AQq154043 for ; Tue, 11 Sep 2012 16:04:10 -0500 X-ASG-Debug-ID: 1347397513-04cbb07ce5aa270001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id POH7FmTMvd9EvkZJ for ; Tue, 11 Sep 2012 14:05:14 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AgwKAPOmT1B5LPyM/2dsb2JhbABFulADgQSBCIIgAQEFOhwjEAgDFQMjCxQNGAM0h34DDrJDDYlTFIoZYwkSU4RYYAOUCoFUiTSBYoUIgniBSA Received: from ppp121-44-252-140.lns20.syd7.internode.on.net (HELO dastard) ([121.44.252.140]) by ipmail06.adl2.internode.on.net with ESMTP; 12 Sep 2012 06:35:13 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TBXdw-0007g6-ME; Wed, 12 Sep 2012 07:05:12 +1000 Date: Wed, 12 Sep 2012 07:05:12 +1000 From: Dave Chinner To: raghu.prabhu13@gmail.com Cc: xfs@oss.sgi.com, Raghavendra D Prabhu Subject: Re: [PATCH v5] Stop xfs_do_force_shutdown / messages fron xfs_log_force if filesystem is already shutdown. Message-ID: <20120911210512.GE11511@dastard> X-ASG-Orig-Subj: Re: [PATCH v5] Stop xfs_do_force_shutdown / messages fron xfs_log_force if filesystem is already shutdown. References: <76577fa31ab2aa750994c1bc6a1b6f44beb03116.1347002369.git.rprabhu@wnohang.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <76577fa31ab2aa750994c1bc6a1b6f44beb03116.1347002369.git.rprabhu@wnohang.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1347397513 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108261 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Sat, Sep 08, 2012 at 03:28:11AM +0530, raghu.prabhu13@gmail.com wrote: > From: Raghavendra D Prabhu > > This is to prevent xfs_log_force from printing error message continuously (due > to xfs_sync and others) till umount if the disk has been forcefully unplugged. > > This is to prevent messages like these from being displayed repeatedly. > > [ 3873.009329] XFS (sdb3): xfs_log_force: error 5 returned. > > Note, that even after xfs_do_force_shutdown has been called, xfs_log_force > doesn't stop till the filesystem has been unmounted (and it keeps printing > "error 5 returned" to kernel log). Also, xfs_do_force_shutdown is called > repeatedly on an already shutdown filesystem through xfs_fs_sync_fs. > > To fix this, added condition over XFS_FORCED_SHUTDOWN to xfs_log_force and > xfs_fs_sync_fs. > > To simulate it, mount an xfs filesystem located on external disk, and then pull > the power to the disk. > > Now, the dmesg looks, > > [ 268.307303] XFS (sdb2): xfs_do_force_shutdown(0x1) called from line 1031 of file fs/xfs/xfs_buf.c. Return address = 0xffffffff8127c13a > [ 268.307318] XFS (sdb2): I/O Error Detected. Shutting down filesystem > [ 268.307323] XFS (sdb2): Please umount the filesystem and rectify the problem(s) > > --- > > Version 1: Removed calling xfs_syncd_stop from xfs_sync_worker. > Version 2: Removed calling xfs_fs_writable in xfs_sync_worker and xfs_flush_worker. > Version 3: Removed calling xfs_syncd_stop in xfs_bwrite. > Version 4: Added return statements to xfs_log_force and xfs_fs_sync_fs. > Version 5: As per suggestion, added xfs_warn to xfs_fs_sync_fs and removed EIO > return in xfs_log_force > > Signed-off-by: Raghavendra D Prabhu > Tested-by: Raghavendra D Prabhu Signed-off-by implies you tested it. Tested-by is used to acknowledge third party testers, usually in the case to acknowledge the fix was Tested-by the Reported-by... And the signed-off-by belongs in the commit message (i.e. about the first ---) not in the section after the commit message that is stripped by the git tools. > --- > fs/xfs/xfs_log.c | 5 ++++- > fs/xfs/xfs_super.c | 5 +++++ > 2 files changed, 9 insertions(+), 1 deletion(-) > > diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c > index 7f4f937..161c925 100644 > --- a/fs/xfs/xfs_log.c > +++ b/fs/xfs/xfs_log.c > @@ -3002,7 +3002,10 @@ xfs_log_force( > > trace_xfs_log_force(mp, 0); > error = _xfs_log_force(mp, flags, NULL); > - if (error) > + /* > + * Avoid warning when the filesystem has already shutdown. > + */ > + if (error && !XFS_FORCED_SHUTDOWN(mp)) > xfs_warn(mp, "%s: error %d returned.", __func__, error); > } > > diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c > index bdaf4cb..ebafc99 100644 > --- a/fs/xfs/xfs_super.c > +++ b/fs/xfs/xfs_super.c > @@ -943,6 +943,11 @@ xfs_fs_sync_fs( > if (!wait) > return 0; > > + if (XFS_FORCED_SHUTDOWN(mp)) { > + xfs_warn(mp, "Sync called: filesystem already shutdown"); > + return XFS_ERROR(EIO); > + } Why should we emit a warning here? There's already information in the log to indicate the filesystem is shut down... Cheers, Dave. -- Dave Chinner david@fromorbit.com From tinguely@sgi.com Tue Sep 11 16:24:46 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_72 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8BLOksa156852 for ; Tue, 11 Sep 2012 16:24:46 -0500 Received: from [128.162.232.125] (eagdhcp-232-125.americas.sgi.com [128.162.232.125]) by relay2.corp.sgi.com (Postfix) with ESMTP id D4EE7304062; Tue, 11 Sep 2012 14:25:48 -0700 (PDT) Message-ID: <504FAC55.1000508@sgi.com> Date: Tue, 11 Sep 2012 16:25:41 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 03/13] xfs: rationalise xfs_mount_wq users References: <1346328017-2795-1-git-send-email-david@fromorbit.com> <1346328017-2795-4-git-send-email-david@fromorbit.com> In-Reply-To: <1346328017-2795-4-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 08/30/12 07:00, Dave Chinner wrote: > From: Dave Chinner > > Instead of starting and stopping background work on the xfs_mount_wq > all at the same time, separate them to where they really are needed > to start and stop. > > The xfs_sync_worker, only needs to be started after all the mount > processing has completed successfully, while it needs to be stopped > before the log is unmounted. > > The xfs_reclaim_worker is started on demand, and can be > stopped before the unmount process does it's own inode reclaim pass. > > The xfs_flush_inodes work is run on demand, and so we really only > need to ensure that it has stopped running before we start > processing an unmount, freeze or remount,ro. > > Signed-off-by: Dave Chinner > --- The patch itself looks good. and the "atomic_read(&bp->b_hold)> 0" assert appears specific to my machines, so forgive the noise. Reviewed-by: Mark Tinguely From raghu.prabhu13@gmail.com Tue Sep 11 17:12:50 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_DKIM_INVALID,T_TO_NO_BRKTS_FREEMAIL autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8BMCoA2162592 for ; Tue, 11 Sep 2012 17:12:50 -0500 X-ASG-Debug-ID: 1347401633-04cb6c5687ab730001-NocioJ Received: from mail-pb0-f53.google.com (mail-pb0-f53.google.com [209.85.160.53]) by cuda.sgi.com with ESMTP id iA6iJFaCfVmp90b7 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 11 Sep 2012 15:13:54 -0700 (PDT) X-Barracuda-Envelope-From: raghu.prabhu13@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.160.53 X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.53] Received: by pbbro2 with SMTP id ro2so1775487pbb.26 for ; Tue, 11 Sep 2012 15:13:53 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.53] X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.53] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:x-mailer; bh=9S6Tcc0yqZ8eSEMcyFrk88Q/QGTM9hp1VLu9INEmv4o=; b=H+qUvoQ4FvMMkU9qaY6csLLBOMkjuyzQhSmjYOUw/J0mZXSmQXuYX13hJtKSlAu05p 1b/DStPjm3gqI3874XZYEhOtPKiEK1zp1HXE+A9PPEz1FDr2egyhEtO+q1iVpulEUcAM /DInaFGsq9GhWk7WsjGfcFwJiRTpGy5TNP9953d7MlV1eIEUKM3xH6Yug7vveiHG2XrA Z9y8fOB+vp8qI1RiHggIO9lNRTdgOhE2Ru4u2xIs2rRFhn7Joec671SlsQrBtOgPUuei h57KRAQD41sSjZ4K9wvubpZWjIK0Y5Jj44Au5xRvHPSEFm6mPQdMNBojDnFoKyXizpP2 Tsjg== Received: by 10.68.221.168 with SMTP id qf8mr13046010pbc.37.1347401633547; Tue, 11 Sep 2012 15:13:53 -0700 (PDT) Received: from localhost ([101.63.181.36]) by mx.google.com with ESMTPS id hf1sm10397771pbc.42.2012.09.11.15.13.38 (version=TLSv1/SSLv3 cipher=OTHER); Tue, 11 Sep 2012 15:13:52 -0700 (PDT) From: raghu.prabhu13@gmail.com To: xfs@oss.sgi.com Cc: david@fromorbit.com, Raghavendra D Prabhu Subject: [PATCH V2 0/3] Print when ENOSPC due to lack of inodes in non-inode64 mount. Date: Wed, 12 Sep 2012 03:43:21 +0530 X-ASG-Orig-Subj: [PATCH V2 0/3] Print when ENOSPC due to lack of inodes in non-inode64 mount. Message-Id: X-Mailer: git-send-email 1.7.12 X-Barracuda-Connect: mail-pb0-f53.google.com[209.85.160.53] X-Barracuda-Start-Time: 1347401634 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108265 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature From: Raghavendra D Prabhu Currently, when there are no free inodes left / free space to allocate them (usually without inode64), there is no indication anywhere of this case, making it harder to diagnose this case. Hence, this series prints the causes/reasons to kernel log in a ratelimited manner, when such a situation arises. ----- Version 1: Initially sent with pr_err_once to print the error only once. Version 2: Added ratelimited functions to xfs_message.h instead of printing once with pr_err_once on suggestion of Dave Chinner. Raghavendra D Prabhu (3): Add ratelimited printk for different alert levels XFS: Print error when xfs_ialloc_ag_select fails to find continuous free space. XFS: Print error when unable to allocate inodes or out of free inodes. fs/xfs/xfs_ialloc.c | 24 +++++++++++++++++++----- fs/xfs/xfs_message.h | 28 ++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 5 deletions(-) -- 1.7.12 From raghu.prabhu13@gmail.com Tue Sep 11 17:13:01 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,FREEMAIL_FROM, J_CHICKENPOX_74,T_DKIM_INVALID,T_TO_NO_BRKTS_FREEMAIL autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8BMD1j2162617 for ; Tue, 11 Sep 2012 17:13:01 -0500 X-ASG-Debug-ID: 1347401645-04cb6c5686ab780001-NocioJ Received: from mail-pz0-f53.google.com (mail-pz0-f53.google.com [209.85.210.53]) by cuda.sgi.com with ESMTP id 3R2EYV1SlHgczA4s (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 11 Sep 2012 15:14:06 -0700 (PDT) X-Barracuda-Envelope-From: raghu.prabhu13@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.210.53 X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.53] Received: by dadg9 with SMTP id g9so810705dad.26 for ; Tue, 11 Sep 2012 15:14:05 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.53] X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.53] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:x-mailer:in-reply-to:references :in-reply-to:references; bh=7MOcx5kIBpHa5IAPc1yJ/F1sB33knEETxglltHTk9tU=; b=GAwndDnrvt1vUNk/JIv52nvFPUnBnRni9Ykv49rnuzIxv5hWmsOvUWZ5igU8zHKjvl cOHgzrZt459CEJyD5WWE6CemfttCdrngzuUESpDaqQNeu4S+9do7YXXaxMfPEOK53dSn 9iH4IV+lkzDdBSqPbFycN473QlvjNc37GR1E3+eNfx/4O2KEG0+3IlyrwvUa46aeCpqQ dN7B/9W9ipm4v8uDo/qefmU2MqD6itQmt3AsSGksjk2I2HQhl1Agn9SZ3zbOQpdsTK4J 88KqYXO6758nsWHGPth/yD551a7c2Jxp24mOGcU6KE3pkEpUyQ10kgOa2Qg0OLmwwpLi egdw== Received: by 10.66.74.196 with SMTP id w4mr28445860pav.32.1347401645580; Tue, 11 Sep 2012 15:14:05 -0700 (PDT) Received: from localhost ([101.63.181.36]) by mx.google.com with ESMTPS id rz10sm10401736pbc.32.2012.09.11.15.14.01 (version=TLSv1/SSLv3 cipher=OTHER); Tue, 11 Sep 2012 15:14:04 -0700 (PDT) From: raghu.prabhu13@gmail.com To: xfs@oss.sgi.com Cc: david@fromorbit.com, Raghavendra D Prabhu , Ben Myers (supporter:XFS FILESYSTEM), Alex Elder (supporter:XFS FILESYSTEM), linux-kernel@vger.kernel.org (open list) Subject: [PATCH 1/3] Add ratelimited printk for different alert levels Date: Wed, 12 Sep 2012 03:43:22 +0530 X-ASG-Orig-Subj: [PATCH 1/3] Add ratelimited printk for different alert levels Message-Id: X-Mailer: git-send-email 1.7.12 In-Reply-To: References: In-Reply-To: References: X-Barracuda-Connect: mail-pz0-f53.google.com[209.85.210.53] X-Barracuda-Start-Time: 1347401646 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108265 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature From: Raghavendra D Prabhu Ratelimited printk will be useful in printing xfs messages which are otherwise not required to be printed always due to their high rate (to prevent kernel ring buffer from overflowing), while at the same time required to be printed. Signed-off-by: Raghavendra D Prabhu --- fs/xfs/xfs_message.h | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/fs/xfs/xfs_message.h b/fs/xfs/xfs_message.h index 56dc0c1..87999a5 100644 --- a/fs/xfs/xfs_message.h +++ b/fs/xfs/xfs_message.h @@ -1,6 +1,8 @@ #ifndef __XFS_MESSAGE_H #define __XFS_MESSAGE_H 1 +#include + struct xfs_mount; extern __printf(2, 3) @@ -30,6 +32,32 @@ void xfs_debug(const struct xfs_mount *mp, const char *fmt, ...) } #endif +#define xfs_printk_ratelimited(xfs_printk, dev, fmt, ...) \ +do { \ + static DEFINE_RATELIMIT_STATE(_rs, \ + DEFAULT_RATELIMIT_INTERVAL, \ + DEFAULT_RATELIMIT_BURST); \ + if (__ratelimit(&_rs)) \ + xfs_printk(dev, fmt, ##__VA_ARGS__); \ +} while (0) + +#define xfs_emerg_ratelimited(dev, fmt, ...) \ + xfs_printk_ratelimited(xfs_emerg, dev, fmt, ##__VA_ARGS__) +#define xfs_alert_ratelimited(dev, fmt, ...) \ + xfs_printk_ratelimited(xfs_alert, dev, fmt, ##__VA_ARGS__) +#define xfs_crit_ratelimited(dev, fmt, ...) \ + xfs_printk_ratelimited(xfs_crit, dev, fmt, ##__VA_ARGS__) +#define xfs_err_ratelimited(dev, fmt, ...) \ + xfs_printk_ratelimited(xfs_err, dev, fmt, ##__VA_ARGS__) +#define xfs_warn_ratelimited(dev, fmt, ...) \ + xfs_printk_ratelimited(xfs_warn, dev, fmt, ##__VA_ARGS__) +#define xfs_notice_ratelimited(dev, fmt, ...) \ + xfs_printk_ratelimited(xfs_notice, dev, fmt, ##__VA_ARGS__) +#define xfs_info_ratelimited(dev, fmt, ...) \ + xfs_printk_ratelimited(xfs_info, dev, fmt, ##__VA_ARGS__) +#define xfs_dbg_ratelimited(dev, fmt, ...) \ + xfs_printk_ratelimited(xfs_dbg, dev, fmt, ##__VA_ARGS__) + extern void assfail(char *expr, char *f, int l); extern void xfs_hex_dump(void *p, int length); -- 1.7.12 From raghu.prabhu13@gmail.com Tue Sep 11 17:13:11 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_DKIM_INVALID,T_TO_NO_BRKTS_FREEMAIL autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8BMDB3q162643 for ; Tue, 11 Sep 2012 17:13:11 -0500 X-ASG-Debug-ID: 1347401645-04cb6c5686ab780002-NocioJ Received: from mail-pz0-f53.google.com (mail-pz0-f53.google.com [209.85.210.53]) by cuda.sgi.com with ESMTP id a5ZJ9VYo7KmP5UFA (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 11 Sep 2012 15:14:15 -0700 (PDT) X-Barracuda-Envelope-From: raghu.prabhu13@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.210.53 X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.53] Received: by mail-pz0-f53.google.com with SMTP id g9so810705dad.26 for ; Tue, 11 Sep 2012 15:14:15 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.53] X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.53] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:x-mailer:in-reply-to:references :in-reply-to:references; bh=YVcrsi5eaW/Tp1Jpga3OoQ4NKjI1Bvrk6BUe1IMjEFE=; b=hdzV7EGgCk8hhU+KiW5ElqjOMhbBjl+82oMwbhhBk+3N2qBi0RtgAj2MLcbzYVrD6E mx2v4A20M2OhJABbeUHZgM/++rCTlKXQaXoJk4VrctPkyzclHuVUnohxxUCLY/UAlSCH pFmmSyve2IOVt1KuJ27ZRK0JjBwNp9Xn+4nuc5w+YSQJg7Zrm+9k4E5TwH+hyxTZc5Qg nnFCCPMfNfPcWgpzvblhnYDEZldz+hMlQ8Q66lJ6WYN6tZBWvwlHxMGEVfqs1O5bymJk HXrFX6DfGtqKeDm3FjtzlQeDCP3CMJRqMqGipDZNpJKTqfi1iIgoNQVsQ8L/emlw1+o/ 2GVw== Received: by 10.68.226.100 with SMTP id rr4mr13255212pbc.143.1347401654038; Tue, 11 Sep 2012 15:14:14 -0700 (PDT) Received: from localhost ([101.63.181.36]) by mx.google.com with ESMTPS id vz8sm4227323pbc.63.2012.09.11.15.14.09 (version=TLSv1/SSLv3 cipher=OTHER); Tue, 11 Sep 2012 15:14:13 -0700 (PDT) From: raghu.prabhu13@gmail.com To: xfs@oss.sgi.com Cc: david@fromorbit.com, Raghavendra D Prabhu , Ben Myers (supporter:XFS FILESYSTEM), Alex Elder (supporter:XFS FILESYSTEM), linux-kernel@vger.kernel.org (open list) Subject: [PATCH 2/3] XFS: Print error when xfs_ialloc_ag_select fails to find continuous free space. Date: Wed, 12 Sep 2012 03:43:23 +0530 X-ASG-Orig-Subj: [PATCH 2/3] XFS: Print error when xfs_ialloc_ag_select fails to find continuous free space. Message-Id: X-Mailer: git-send-email 1.7.12 In-Reply-To: References: In-Reply-To: References: X-Barracuda-Connect: mail-pz0-f53.google.com[209.85.210.53] X-Barracuda-Start-Time: 1347401646 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, MARKETING_SUBJECT, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108265 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name 0.60 MARKETING_SUBJECT Subject contains popular marketing words -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature From: Raghavendra D Prabhu When xfs_ialloc_ag_select fails to find any AG with continuous free blocks required for inode allocation, printk the error in ratelimited manner. Signed-off-by: Raghavendra D Prabhu --- fs/xfs/xfs_ialloc.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c index 5aceb3f..e75a39d 100644 --- a/fs/xfs/xfs_ialloc.c +++ b/fs/xfs/xfs_ialloc.c @@ -539,8 +539,11 @@ nextag: if (agno >= agcount) agno = 0; if (agno == pagno) { - if (flags == 0) + if (flags == 0) { + xfs_err_ratelimited(mp, + "Out of continuous free blocks for inode allocation"); return NULLAGNUMBER; + } flags = 0; } } -- 1.7.12 From raghu.prabhu13@gmail.com Tue Sep 11 17:13:19 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_DKIM_INVALID,T_TO_NO_BRKTS_FREEMAIL autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8BMDJtU162664 for ; Tue, 11 Sep 2012 17:13:19 -0500 X-ASG-Debug-ID: 1347401633-04cb6c5687ab730002-NocioJ Received: from mail-pb0-f53.google.com (mail-pb0-f53.google.com [209.85.160.53]) by cuda.sgi.com with ESMTP id qXgut4l0huItlX4r (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 11 Sep 2012 15:14:23 -0700 (PDT) X-Barracuda-Envelope-From: raghu.prabhu13@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.160.53 X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.53] Received: by mail-pb0-f53.google.com with SMTP id ro2so1775487pbb.26 for ; Tue, 11 Sep 2012 15:14:23 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.53] X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.53] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:x-mailer:in-reply-to:references :in-reply-to:references; bh=wqohzvvYe5Jd0elx1ckCs2V+WfXLS6EYjHG8R+4LV5I=; b=Njl2s48F6Yef9xRnQQLs/Z+syMI8Du61LDXTXcIFqR/KvNJe55/mG8cjwU3Gjdlose 8Sj7GniA8bsX2gYp5zHnfZpBgUfVPisd2vAg9ndfZTGYcBkYDWAHpRQAGt5agrkYREva zZfhUWOwgYN5ueRgKv+67r/K1d0W+G+i0uhFIvukFI7V0xkj405NolZuq+G6pXspNC7J N82lo9BA99wVEF1RlHBF7MPgNKIMzx1+qD2tNzyi+FGLQBhC+qmaNKBZe9hjsEm0DnYH fKZhCfrepO2dnI2TncwVNz6h+Em7oDus5LlWayqnLmlosVuXRSy0SXsmL54dY56KR3rI IGwQ== Received: by 10.68.225.196 with SMTP id rm4mr13143391pbc.131.1347401662166; Tue, 11 Sep 2012 15:14:22 -0700 (PDT) Received: from localhost ([101.63.181.36]) by mx.google.com with ESMTPS id hr9sm10401476pbc.36.2012.09.11.15.14.18 (version=TLSv1/SSLv3 cipher=OTHER); Tue, 11 Sep 2012 15:14:21 -0700 (PDT) From: raghu.prabhu13@gmail.com To: xfs@oss.sgi.com Cc: david@fromorbit.com, Raghavendra D Prabhu , Ben Myers (supporter:XFS FILESYSTEM), Alex Elder (supporter:XFS FILESYSTEM), linux-kernel@vger.kernel.org (open list) Subject: [PATCH 3/3] XFS: Print error when unable to allocate inodes or out of free inodes. Date: Wed, 12 Sep 2012 03:43:24 +0530 X-ASG-Orig-Subj: [PATCH 3/3] XFS: Print error when unable to allocate inodes or out of free inodes. Message-Id: <93d9b37ce9ad720e14e2f9311e623a8e3e3139f5.1347396641.git.rprabhu@wnohang.net> X-Mailer: git-send-email 1.7.12 In-Reply-To: References: In-Reply-To: References: X-Barracuda-Connect: mail-pb0-f53.google.com[209.85.160.53] X-Barracuda-Start-Time: 1347401634 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, MARKETING_SUBJECT, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108265 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name 0.60 MARKETING_SUBJECT Subject contains popular marketing words -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature From: Raghavendra D Prabhu When xfs_dialloc is unable to allocate required number of inodes or there are no AGs with free inodes, printk the error in ratelimited manner. Signed-off-by: Raghavendra D Prabhu --- fs/xfs/xfs_ialloc.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c index e75a39d..034131b 100644 --- a/fs/xfs/xfs_ialloc.c +++ b/fs/xfs/xfs_ialloc.c @@ -990,8 +990,11 @@ xfs_dialloc( goto out_error; xfs_perag_put(pag); - *inop = NULLFSINO; - return 0; + + xfs_err_ratelimited(mp, + "Unable to allocate inodes in AG %d: Required %d, Current %llu, Maximum %llu", + agno, XFS_IALLOC_INODES(mp), mp->m_sb.sb_icount, mp->m_maxicount); + goto out_spc; } if (ialloced) { @@ -1016,11 +1019,19 @@ nextag: if (++agno == mp->m_sb.sb_agcount) agno = 0; if (agno == start_agno) { - *inop = NULLFSINO; - return noroom ? ENOSPC : 0; + if (noroom) { + xfs_err_ratelimited(mp, + "Out of AGs with free inodes: Required %d, Current %llu, Maximum %llu", + XFS_IALLOC_INODES(mp), mp->m_sb.sb_icount, mp->m_maxicount); + goto out_spc; + } + return 0; } } +out_spc: + *inop = NULLFSINO; + return ENOSPC; out_alloc: *IO_agbp = NULL; return xfs_dialloc_ag(tp, agbp, parent, inop); -- 1.7.12 From david@fromorbit.com Tue Sep 11 17:42:36 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8BMgaHo166378 for ; Tue, 11 Sep 2012 17:42:36 -0500 X-ASG-Debug-ID: 1347403419-04cb6c5688acca0001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id mE90NOEAzIDk4rJW for ; Tue, 11 Sep 2012 15:43:39 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AgwKAJW9T1B5LPyM/2dsb2JhbABFulADgQSBCIIgAQEEATocIwULCAMVAy4UDRgDFh6HfgMJBbJMDYlTFIoZY26CGYI/YAOUCoFUixaFCIJ4 Received: from ppp121-44-252-140.lns20.syd7.internode.on.net (HELO dastard) ([121.44.252.140]) by ipmail06.adl2.internode.on.net with ESMTP; 12 Sep 2012 08:13:38 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TBZBB-0007th-2g; Wed, 12 Sep 2012 08:43:37 +1000 Date: Wed, 12 Sep 2012 08:43:37 +1000 From: Dave Chinner To: raghu.prabhu13@gmail.com Cc: xfs@oss.sgi.com, Raghavendra D Prabhu , Ben Myers , Alex Elder , open list Subject: Re: [PATCH 1/3] Add ratelimited printk for different alert levels Message-ID: <20120911224337.GF11511@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/3] Add ratelimited printk for different alert levels References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1347403419 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108267 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed, Sep 12, 2012 at 03:43:22AM +0530, raghu.prabhu13@gmail.com wrote: > From: Raghavendra D Prabhu > > Ratelimited printk will be useful in printing xfs messages which are otherwise > not required to be printed always due to their high rate (to prevent kernel ring > buffer from overflowing), while at the same time required to be printed. > > Signed-off-by: Raghavendra D Prabhu > --- > fs/xfs/xfs_message.h | 28 ++++++++++++++++++++++++++++ > 1 file changed, 28 insertions(+) > > diff --git a/fs/xfs/xfs_message.h b/fs/xfs/xfs_message.h > index 56dc0c1..87999a5 100644 > --- a/fs/xfs/xfs_message.h > +++ b/fs/xfs/xfs_message.h > @@ -1,6 +1,8 @@ > #ifndef __XFS_MESSAGE_H > #define __XFS_MESSAGE_H 1 > > +#include > + Include this in xfs_linux.h rather than here. > struct xfs_mount; > > extern __printf(2, 3) > @@ -30,6 +32,32 @@ void xfs_debug(const struct xfs_mount *mp, const char *fmt, ...) > } > #endif > > +#define xfs_printk_ratelimited(xfs_printk, dev, fmt, ...) \ > +do { \ > + static DEFINE_RATELIMIT_STATE(_rs, \ > + DEFAULT_RATELIMIT_INTERVAL, \ > + DEFAULT_RATELIMIT_BURST); \ > + if (__ratelimit(&_rs)) \ > + xfs_printk(dev, fmt, ##__VA_ARGS__); \ > +} while (0) Use "func" not xfs_printk here. xfs_printk looks too much like a real function name (indeed, we already have __xfs_printk) rather than a macro parameter. > +#define xfs_emerg_ratelimited(dev, fmt, ...) \ > + xfs_printk_ratelimited(xfs_emerg, dev, fmt, ##__VA_ARGS__) > +#define xfs_alert_ratelimited(dev, fmt, ...) \ > + xfs_printk_ratelimited(xfs_alert, dev, fmt, ##__VA_ARGS__) > +#define xfs_crit_ratelimited(dev, fmt, ...) \ > + xfs_printk_ratelimited(xfs_crit, dev, fmt, ##__VA_ARGS__) > +#define xfs_err_ratelimited(dev, fmt, ...) \ > + xfs_printk_ratelimited(xfs_err, dev, fmt, ##__VA_ARGS__) > +#define xfs_warn_ratelimited(dev, fmt, ...) \ > + xfs_printk_ratelimited(xfs_warn, dev, fmt, ##__VA_ARGS__) > +#define xfs_notice_ratelimited(dev, fmt, ...) \ > + xfs_printk_ratelimited(xfs_notice, dev, fmt, ##__VA_ARGS__) > +#define xfs_info_ratelimited(dev, fmt, ...) \ > + xfs_printk_ratelimited(xfs_info, dev, fmt, ##__VA_ARGS__) > +#define xfs_dbg_ratelimited(dev, fmt, ...) \ > + xfs_printk_ratelimited(xfs_dbg, dev, fmt, ##__VA_ARGS__) Here's the problem with adding macros that aren't used. xfs_dbg does not exist - the function is xfs_debug(). The compiler won't catch that until the macro is used, so only add the macros which are needed for this patch series. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Sep 11 17:47:03 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8BMl3J0166873 for ; Tue, 11 Sep 2012 17:47:03 -0500 X-ASG-Debug-ID: 1347403686-04cbb07ce3afc60001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id K6rwK6XPE5W9EPSa for ; Tue, 11 Sep 2012 15:48:07 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AgwKAOC+T1B5LPyM/2dsb2JhbABFulADgQSBCIIgAQEFOhwjEAgDFQMuFA0YAzSHfgMODLJCDYlTFIoZYwllghmDHwOUCoFUiTSBYoUIgniBSA Received: from ppp121-44-252-140.lns20.syd7.internode.on.net (HELO dastard) ([121.44.252.140]) by ipmail06.adl2.internode.on.net with ESMTP; 12 Sep 2012 08:18:06 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TBZFV-0007uD-Fn; Wed, 12 Sep 2012 08:48:05 +1000 Date: Wed, 12 Sep 2012 08:48:05 +1000 From: Dave Chinner To: raghu.prabhu13@gmail.com Cc: xfs@oss.sgi.com, Raghavendra D Prabhu , Ben Myers , Alex Elder , open list Subject: Re: [PATCH 2/3] XFS: Print error when xfs_ialloc_ag_select fails to find continuous free space. Message-ID: <20120911224805.GG11511@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/3] XFS: Print error when xfs_ialloc_ag_select fails to find continuous free space. References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1347403686 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108267 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed, Sep 12, 2012 at 03:43:23AM +0530, raghu.prabhu13@gmail.com wrote: > From: Raghavendra D Prabhu > > When xfs_ialloc_ag_select fails to find any AG with continuous free blocks > required for inode allocation, printk the error in ratelimited manner. > > Signed-off-by: Raghavendra D Prabhu > --- > fs/xfs/xfs_ialloc.c | 5 ++++- > 1 file changed, 4 insertions(+), 1 deletion(-) > > diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c > index 5aceb3f..e75a39d 100644 > --- a/fs/xfs/xfs_ialloc.c > +++ b/fs/xfs/xfs_ialloc.c > @@ -539,8 +539,11 @@ nextag: > if (agno >= agcount) > agno = 0; > if (agno == pagno) { > - if (flags == 0) > + if (flags == 0) { > + xfs_err_ratelimited(mp, > + "Out of continuous free blocks for inode allocation"); http://oss.sgi.com/archives/xfs/2012-06/msg00041.html Couple of things for all 3 patches. Firstly - 80 columns. We tend to keep the pformat string on a single line so it is easy to grep for like so: pr_err_once(mp, "Insufficient contiguous free space for inode allocation"); So, you need to change the error message to the one suggested, and follow 80-character width limits like the rest of the code. Also, I think the error message is better at the caller site, not in the function itself. i.e. if we get a NULLAGNUMBER returned, the caller decided whether to emit an error message or not. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Sep 11 18:21:01 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8BNL1ff169689 for ; Tue, 11 Sep 2012 18:21:01 -0500 X-ASG-Debug-ID: 1347405724-04cb6c5688adf60001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id 4zfwq964Tx51ITjv for ; Tue, 11 Sep 2012 16:22:04 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AgwKAATHT1B5LPyM/2dsb2JhbABFulADgQSBCIIgAQEFJxMcIxAIAxUDLhQNGAM0h34DDrJXDYlTFIoZYwtjghmDHwOUCoFUixaFCIJ4gUk Received: from ppp121-44-252-140.lns20.syd7.internode.on.net (HELO dastard) ([121.44.252.140]) by ipmail06.adl2.internode.on.net with ESMTP; 12 Sep 2012 08:51:45 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TBZm4-0007xk-9m; Wed, 12 Sep 2012 09:21:44 +1000 Date: Wed, 12 Sep 2012 09:21:44 +1000 From: Dave Chinner To: raghu.prabhu13@gmail.com Cc: xfs@oss.sgi.com, Raghavendra D Prabhu , Ben Myers , Alex Elder , open list Subject: Re: [PATCH 3/3] XFS: Print error when unable to allocate inodes or out of free inodes. Message-ID: <20120911232144.GH11511@dastard> X-ASG-Orig-Subj: Re: [PATCH 3/3] XFS: Print error when unable to allocate inodes or out of free inodes. References: <93d9b37ce9ad720e14e2f9311e623a8e3e3139f5.1347396641.git.rprabhu@wnohang.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <93d9b37ce9ad720e14e2f9311e623a8e3e3139f5.1347396641.git.rprabhu@wnohang.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1347405724 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108271 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed, Sep 12, 2012 at 03:43:24AM +0530, raghu.prabhu13@gmail.com wrote: > From: Raghavendra D Prabhu > > When xfs_dialloc is unable to allocate required number of inodes or there are no > AGs with free inodes, printk the error in ratelimited manner. > > Signed-off-by: Raghavendra D Prabhu > --- > fs/xfs/xfs_ialloc.c | 19 +++++++++++++++---- > 1 file changed, 15 insertions(+), 4 deletions(-) > > diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c > index e75a39d..034131b 100644 > --- a/fs/xfs/xfs_ialloc.c > +++ b/fs/xfs/xfs_ialloc.c > @@ -990,8 +990,11 @@ xfs_dialloc( > goto out_error; > > xfs_perag_put(pag); > - *inop = NULLFSINO; > - return 0; > + > + xfs_err_ratelimited(mp, > + "Unable to allocate inodes in AG %d: Required %d, Current %llu, Maximum %llu", > + agno, XFS_IALLOC_INODES(mp), mp->m_sb.sb_icount, mp->m_maxicount); > + goto out_spc; This changes the error to be returned from 0 to ENOSPC. Adding error messages shouldn't change the logic of the code. Also, you might want tolook at how ENOSPC is returned from xfs_ialloc_ag_alloc(). it only occurs when: if (mp->m_maxicount && mp->m_sb.sb_icount + newlen > mp->m_maxicount) { i.e. it is exactly the same error case as the "noroom" error below. It has nothing to do with being unable to allocate inodes in the specific AG - the global inode count is too high. IOWs, the error message is not correct. Also, 80 columns. > } > > if (ialloced) { > @@ -1016,11 +1019,19 @@ nextag: > if (++agno == mp->m_sb.sb_agcount) > agno = 0; > if (agno == start_agno) { > - *inop = NULLFSINO; > - return noroom ? ENOSPC : 0; > + if (noroom) { > + xfs_err_ratelimited(mp, > + "Out of AGs with free inodes: Required %d, Current %llu, Maximum %llu", > + XFS_IALLOC_INODES(mp), mp->m_sb.sb_icount, mp->m_maxicount); The error message here is misleading - the error is that we've exceeded the maximum inode count for the filesystem (same as the above error message case), so no further allocations are allowed. What about the !noroom case? Isn't that a real ENOSPC condition? i.e. we've tried to allocate inodes in every AG and yet we've failed in all of them because there is no aligned, contiguous free space in any of the AGs. Shouldn't that emit an appropriate warning? > + goto out_spc; > + } > + return 0; > } > } > > +out_spc: > + *inop = NULLFSINO; > + return ENOSPC; > out_alloc: > *IO_agbp = NULL; > return xfs_dialloc_ag(tp, agbp, parent, inop); Default behaviour on a loop break is to allocate inodes, not return ENOSPC. BTW, there's no need to cc LKML for XFS specific patches. LKML is noisy enough as it is without unnecessary cross-posts.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From joe@perches.com Tue Sep 11 22:21:36 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8C3LaMU190896 for ; Tue, 11 Sep 2012 22:21:36 -0500 X-ASG-Debug-ID: 1347420160-04cbb07ce4b8e10001-NocioJ Received: from labridge.com (perches-mx.perches.com [206.117.179.246]) by cuda.sgi.com with ESMTP id FmyfP9w7iN57E0Sz (version=SSLv3 cipher=DES-CBC3-SHA bits=168 verify=NO) for ; Tue, 11 Sep 2012 20:22:40 -0700 (PDT) X-Barracuda-Envelope-From: joe@perches.com X-Barracuda-Apparent-Source-IP: 206.117.179.246 Received: from [173.51.221.202] (account joe@perches.com HELO [192.168.1.154]) by labridge.com (CommuniGate Pro SMTP 5.0.14) with ESMTPA id 19600807; Tue, 11 Sep 2012 20:22:39 -0700 Message-ID: <1347420159.2456.15.camel@joe2Laptop> Subject: Re: [PATCH 1/3] Add ratelimited printk for different alert levels From: Joe Perches X-ASG-Orig-Subj: Re: [PATCH 1/3] Add ratelimited printk for different alert levels To: raghu.prabhu13@gmail.com Cc: xfs@oss.sgi.com, david@fromorbit.com, Raghavendra D Prabhu , Ben Myers , Alex Elder , open list Date: Tue, 11 Sep 2012 20:22:39 -0700 In-Reply-To: References: Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.2.2- Content-Transfer-Encoding: 7bit Mime-Version: 1.0 X-Barracuda-Connect: perches-mx.perches.com[206.117.179.246] X-Barracuda-Start-Time: 1347420160 X-Barracuda-Encrypted: DES-CBC3-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108287 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed, 2012-09-12 at 03:43 +0530, raghu.prabhu13@gmail.com wrote: > Ratelimited printk will be useful in printing xfs messages which are otherwise > not required to be printed always due to their high rate (to prevent kernel ring > buffer from overflowing), while at the same time required to be printed. [] > diff --git a/fs/xfs/xfs_message.h b/fs/xfs/xfs_message.h [] > @@ -30,6 +32,32 @@ void xfs_debug(const struct xfs_mount *mp, const char *fmt, ...) > } > #endif > > +#define xfs_printk_ratelimited(xfs_printk, dev, fmt, ...) \ > +do { \ > + static DEFINE_RATELIMIT_STATE(_rs, \ > + DEFAULT_RATELIMIT_INTERVAL, \ > + DEFAULT_RATELIMIT_BURST); \ > + if (__ratelimit(&_rs)) \ > + xfs_printk(dev, fmt, ##__VA_ARGS__); \ > +} while (0) It might be better to use an xfs singleton RATELIMIT_STATE DEFINE_RATELIMIT_STATE(xfs_rs); ... #define xfs_printk_ratelimited(xfs_printk, dev, fmt, ...) \ do { \ if (__ratelimit(&xfs_rs)) \ xfs_printk(dev, fmt, ##__VA_ARGS__); \ } while (0) From xfs-owner@oss.sgi.com Wed Sep 12 01:36:31 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.7 required=5.0 tests=BAYES_60,URIBL_DBL_SPAM autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8C6aVPj215661 for ; Wed, 12 Sep 2012 01:36:31 -0500 X-ASG-Debug-ID: 1347431854-04cbb07ce5bf3b0001-w1Z2WR Received: from server1.yotiseando.com (digitalserver.alestiva.net [173.236.58.198]) by cuda.sgi.com with ESMTP id lo0uwziFF25v8TqI (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 11 Sep 2012 23:37:34 -0700 (PDT) X-Barracuda-Envelope-From: noresponder@yotiseando.com X-Barracuda-Apparent-Source-IP: 173.236.58.198 Received: from yotiseando.com (localhost.localdomain [127.0.0.1]) by server1.yotiseando.com (8.13.8/8.13.8) with ESMTP id q8C6bYUw001498 for ; Wed, 12 Sep 2012 10:37:34 +0400 Date: Wed, 12 Sep 2012 02:37:34 -0400 To: linux-xfs@oss.sgi.com From: Claudia Rodriguez Subject: Evento de Hacking y Seguridad Informatica Message-ID: <7ec518a18113d825d72a07eaff3687ab@yotiseando.com> X-ASG-Orig-Subj: Evento de Hacking y Seguridad Informatica X-Priority: 3 X-Mailer: PHPMailer [version 1.73] MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset="iso-8859-1" X-Barracuda-Connect: digitalserver.alestiva.net[173.236.58.198] X-Barracuda-Start-Time: 1347431854 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108299 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- ---------------------------------------------- AUDIHACK www.audihack.com Evento Internacional de Hacking Etico y Seguridad Informatica Consultas a: ------------------------ E-mails: info@audihack.com, capacitacion@cosimti.com Telefonos: (3)3201395 - (3)3507385 ---------------------------------------------- Organizado por la empresa Cosim TI Santa Cruz - Bolivia ---------------------------------------------- TEMATICA ---------------------------------------------- - Exploiting Web Services - Hacking and Cheating Online Games - Herramientas Post-Hacking - Atacando Dispositivos Android con Metasploit - Auditoria Tecnica OSSTMM (Data Networks Security Testing) - Seguridad en Redes NGN (Next Generation Networks) - OSSTMM vs ISO 27001 - Advanced Antiforensics Techniques and Prevention Countermeasures - OSSTMM 101 - Mini-auditoria OSSTMM (Practico) - Desarrollo seguro - Test de Penetracion y Analisis de Vulnerabilidades OWASP para PCI Compliance ---------------------------------------------- LUGAR Y FECHA DEL EVENTO ---------------------------------------------- Fecha: 25 Y 26 de Octubre 2012 Lugar: Auditorio de la Universidad Domingo Savio Av. Beni y 3er anillo externo (Santa Cruz / Bolivia) Horario: 8.30 am - 18.00 pm ---------------------------------------------- INSCRIPCIONES ---------------------------------------------- Oficinas de Cosim TI Av. Roca y Coronado calle siriono nro. 250 (frente fexpocruz) Email: info@audihack.com, capacitacion@cosimti.com, black_fire_dark@hotmail.com Telefonos: (3)3201395 - (3)3507385 ---------------------------------------------- INVERSION ---------------------------------------------- Estudiantes: 350 Bs. Profesionales: 450 Bs. ---------------------------------------------- MAS DETALLES ---------------------------------------------- www.audihack.com - www.cosimti.com Si desea remover su correo de nuestras listas, ingresar a http://www.yotiseando.com/admin/remover_correo.php?email=linux-xfs@oss.sgi.com From difrost.kernel@gmail.com Wed Sep 12 02:08:08 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,FREEMAIL_FROM, J_CHICKENPOX_22,T_DKIM_INVALID autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8C788np218890 for ; Wed, 12 Sep 2012 02:08:08 -0500 X-ASG-Debug-ID: 1347433750-04cb6c5685beb20001-NocioJ Received: from mail-ee0-f53.google.com (mail-ee0-f53.google.com [74.125.83.53]) by cuda.sgi.com with ESMTP id 3XK4AVCf4CPXnU34 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Wed, 12 Sep 2012 00:09:11 -0700 (PDT) X-Barracuda-Envelope-From: difrost.kernel@gmail.com X-Barracuda-Apparent-Source-IP: 74.125.83.53 Received: by eekb47 with SMTP id b47so1093009eek.26 for ; Wed, 12 Sep 2012 00:09:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=YNdYRJTElcSc6IiZQ35LxrEIsxix+FJHw276LVm5bMw=; b=SJgzh4PwxtoZpCtTq7z0JkaOTG9YtBUOqq1eJuymJttyxJltn5CzFFWpXyIqDsYTlq cxV26Tj+OF4gjyPjk8uUfAKG4yGiCzd4p7B4VbmQyS2as/io/RfAMjO9OW63/mmGu+1a ov5Ya2plK6rV1U18VWv9W1GeWEAHEi0vIwLj6pjUNGSC/Fja2Gmcag+D17plmypkYOxf 6E8b0WjoYnJ++6ywJdHMdogGSZYkKEz/up2SyvlwqiIuxQ8QpMFDt7dHzwttXb1tEPIE aZARzJge97svzNp6sk3vMD16zelntCt5QChZ0t0lvE3frUYASk5vCB+z0yMF6TWUEIb8 A6mg== MIME-Version: 1.0 Received: by 10.14.203.69 with SMTP id e45mr29155660eeo.23.1347433750521; Wed, 12 Sep 2012 00:09:10 -0700 (PDT) Received: by 10.14.127.12 with HTTP; Wed, 12 Sep 2012 00:09:10 -0700 (PDT) In-Reply-To: <20120911205827.GD11511@dastard> References: <20120911205827.GD11511@dastard> Date: Wed, 12 Sep 2012 09:09:10 +0200 Message-ID: Subject: Re: Internal error xfs_trans_cancel at line 1467 of file fs/xfs/xfs_trans.c From: Jacek Luczak X-ASG-Orig-Subj: Re: Internal error xfs_trans_cancel at line 1467 of file fs/xfs/xfs_trans.c To: Dave Chinner Cc: xfs@oss.sgi.com Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: mail-ee0-f53.google.com[74.125.83.53] X-Barracuda-Start-Time: 1347433751 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA085, DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108301 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.10 BSF_SC0_SA085 Custom Rule SA085 2012/9/11 Dave Chinner : > On Tue, Sep 11, 2012 at 09:47:49AM +0200, Jacek Luczak wrote: >> Hi All, >> >> got this during heavy IO (parallel checkout of few large projects from SVN): >> >> XFS (dm-8): Corruption detected. Unmount and run xfs_repair >> XFS (dm-8): Internal error xfs_trans_cancel at line 1467 of file >> fs/xfs/xfs_trans.c. Caller 0xffffffffa03c9974 >> >> Pid: 11930, comm: svn Not tainted 3.4.10-1 #1 >> Call Trace: >> [] ? xfs_trans_cancel+0x56/0xd7 [xfs] >> [] ? xfs_create+0x467/0x4cf [xfs] >> [] ? xfs_vn_mknod+0xcb/0x160 [xfs] >> [] ? vfs_create+0x6e/0xc7 >> [] ? do_last+0x3a5/0x745 >> [] ? path_openat+0xce/0x35f >> [] ? do_filp_open+0x2c/0x72 >> [] ? xfs_release+0x1ac/0x1cc [xfs] >> [] ? alloc_fd+0x69/0xf2 >> [] ? do_sys_open+0x107/0x18e >> [] ? system_call_fastpath+0x16/0x1b > > That won't tell us what caused the problem. FWIW: > > http://xfs.org/index.php/XFS_FAQ#Q:_What_information_should_I_include_when_reporting_a_problem.3F Dave, thanks for your answer. I will put more info at the bottom. CI will be enabled today thus we can expect that issue will hit again. BTW: This issue was triggered on a clean FS create a minute before. > > Indeed, this issue is often caused by fragmented free space andnot > being able to allocate inodes, though that usually just results in > ENOSPC. Use the xfs_db "freespace" command to dump the freespace > histogram when the error occurs and you've unmounted the filesystem. That's what I've found already - Google found your mail regarding similar case quite long time ago. There were nice instruction on what to do - I will then follow those. > Were there any errors that were fixed? Yes. -Jacek ---------------------------ENV DATA START HERE-------------------------- 1) Kernel: vanilla 3.4.10 2) xfsprogs 3.1.8 3) HW:HP ProLiant BL460c G7 4) #CPU: 24 cores (12 physical, SMT enabled). 5) Smart Array P410i, 512MB BBWC 6) 2x 600GB SAS HDDs in HW RAID 0 7) LVM with one group and 9 volumes 8) xfs_info: meta-data=/dev/mapper/vg00-lvol9 isize=256 agcount=4, agsize=39321600 blks = sectsz=512 attr=2 data = bsize=4096 blocks=157286400, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 log =internal bsize=4096 blocks=76800, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 From desmondcoded@yahoo.es Wed Sep 12 08:03:36 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: *** X-Spam-Status: No, score=3.1 required=5.0 tests=BAYES_80,FREEMAIL_FROM, J_CHICKENPOX_53,T_TO_NO_BRKTS_FREEMAIL autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8CD3aX7250065 for ; Wed, 12 Sep 2012 08:03:36 -0500 X-ASG-Debug-ID: 1347455077-04cb6c5686cf5e0001-NocioJ Received: from yoda.qwws.net (yoda.qwws.net [78.46.162.137]) by cuda.sgi.com with ESMTP id xCAdKiQsxwO5VwBy for ; Wed, 12 Sep 2012 06:04:38 -0700 (PDT) X-Barracuda-Envelope-From: desmondcoded@yahoo.es X-Barracuda-Apparent-Source-IP: 78.46.162.137 Received: from localhost (localhost [127.0.0.1]) by yoda.qwws.net (Postfix) with ESMTP id 19D607C775; Wed, 12 Sep 2012 14:46:36 +0200 (CEST) Received: from yoda.qwws.net ([127.0.0.1]) by localhost (yoda.qwws.net [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id rJpAJ9PexRFb; Wed, 12 Sep 2012 14:46:35 +0200 (CEST) Received: from www.qwws.net (localhost [127.0.0.1]) by yoda.qwws.net (Postfix) with ESMTP id D73947C772; Wed, 12 Sep 2012 14:46:34 +0200 (CEST) Received: from 41.58.35.221 (SquirrelMail authenticated user infod@nwtphr.com) by www.qwws.net with HTTP; Wed, 12 Sep 2012 14:46:35 +0200 (CEST) Message-ID: <53431.41.58.35.221.1347453995.squirrel@www.qwws.net> Date: Wed, 12 Sep 2012 14:46:35 +0200 (CEST) Subject: I want to place an order From: "Desmond Cole" X-ASG-Orig-Subj: I want to place an order Reply-To: desmondcoded@yahoo.es User-Agent: SquirrelMail/1.4.13 MIME-Version: 1.0 Content-Type: text/plain;charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-Priority: 3 (Normal) Importance: Normal To: undisclosed-recipients:; X-Barracuda-Connect: yoda.qwws.net[78.46.162.137] X-Barracuda-Start-Time: 1347455077 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108325 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hello , I want to place an order in your store,and I will like to know if you ship to Lifou Island and my method of payment will be credit card.So please let me know if you can assist me with the order. And please do not forget to include your web page in your replying back to my mail.I will await your prompt response as soon as you receive this mail. Regards, Desmond From bpm@sgi.com Wed Sep 12 13:32:45 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8CIWjJr033237 for ; Wed, 12 Sep 2012 13:32:45 -0500 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay1.corp.sgi.com (Postfix) with ESMTP id E90268F8059; Wed, 12 Sep 2012 11:33:47 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 9F9A94266DC; Wed, 12 Sep 2012 13:33:47 -0500 (CDT) Date: Wed, 12 Sep 2012 13:33:47 -0500 From: Ben Myers To: Christoph Hellwig Cc: Mark Tinguely , xfs@oss.sgi.com Subject: xfs: stop the sync worker before xfs_unmountfs Message-ID: <20120912183347.GO3274@sgi.com> References: <20120829134624.316257238@sgi.com> <20120829134628.835024558@sgi.com> <20120830002335.GB15292@dastard> <20120830172549.GG3274@sgi.com> <20120830223504.GE15292@dastard> <5040FF25.1010501@sgi.com> <20120901230824.GB6896@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20120901230824.GB6896@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) See what you think of this. Not heavily tested yet, and not pretty... but it is fairly minimal. Pull startup and shutdown of the sync worker out of xfs_syncd_init and xfs_syncd_stop into their callers. In the case of unmount, move shutdown of the xfs_sync_worker before teardown of the log in xfs_unmountfs. This prevents occasional crashes on unmount like so: PID: 21602 TASK: ee9df060 CPU: 0 COMMAND: "kworker/0:3" #0 [c5377d28] crash_kexec at c0292c94 #1 [c5377d80] oops_end at c07090c2 #2 [c5377d98] no_context at c06f614e #3 [c5377dbc] __bad_area_nosemaphore at c06f6281 #4 [c5377df4] bad_area_nosemaphore at c06f629b #5 [c5377e00] do_page_fault at c070b0cb #6 [c5377e7c] error_code (via page_fault) at c070892c EAX: f300c6a8 EBX: f300c6a8 ECX: 000000c0 EDX: 000000c0 EBP: c5377ed0 DS: 007b ESI: 00000000 ES: 007b EDI: 00000001 GS: ffffad20 CS: 0060 EIP: c0481ad0 ERR: ffffffff EFLAGS: 00010246 #7 [c5377eb0] atomic64_read_cx8 at c0481ad0 #8 [c5377ebc] xlog_assign_tail_lsn_locked at f7cc7c6e [xfs] #9 [c5377ed4] xfs_trans_ail_delete_bulk at f7ccd520 [xfs] #10 [c5377f0c] xfs_buf_iodone at f7ccb602 [xfs] #11 [c5377f24] xfs_buf_do_callbacks at f7cca524 [xfs] #12 [c5377f30] xfs_buf_iodone_callbacks at f7cca5da [xfs] #13 [c5377f4c] xfs_buf_iodone_work at f7c718d0 [xfs] #14 [c5377f58] process_one_work at c024ee4c #15 [c5377f98] worker_thread at c024f43d #16 [c5377fbc] kthread at c025326b #17 [c5377fe8] kernel_thread_helper at c070e834 PID: 26653 TASK: e79143b0 CPU: 3 COMMAND: "umount" #0 [cde0fda0] __schedule at c0706595 #1 [cde0fe28] schedule at c0706b89 #2 [cde0fe30] schedule_timeout at c0705600 #3 [cde0fe94] __down_common at c0706098 #4 [cde0fec8] __down at c0706122 #5 [cde0fed0] down at c025936f #6 [cde0fee0] xfs_buf_lock at f7c7131d [xfs] #7 [cde0ff00] xfs_freesb at f7cc2236 [xfs] #8 [cde0ff10] xfs_fs_put_super at f7c80f21 [xfs] #9 [cde0ff1c] generic_shutdown_super at c0333d7a #10 [cde0ff38] kill_block_super at c0333e0f #11 [cde0ff48] deactivate_locked_super at c0334218 #12 [cde0ff58] deactivate_super at c033495d #13 [cde0ff68] mntput_no_expire at c034bc13 #14 [cde0ff7c] sys_umount at c034cc69 #15 [cde0ffa0] sys_oldumount at c034ccd4 #16 [cde0ffb0] system_call at c0707e66 Signed-off-by: Ben Myers Index: xfs/fs/xfs/xfs_super.c =================================================================== --- xfs.orig/fs/xfs/xfs_super.c +++ xfs/fs/xfs/xfs_super.c @@ -919,6 +919,7 @@ xfs_fs_put_super( struct xfs_mount *mp = XFS_M(sb); xfs_filestream_unmount(mp); + cancel_delayed_work_sync(&mp->m_sync_work); xfs_unmountfs(mp); xfs_syncd_stop(mp); xfs_freesb(mp); @@ -1210,6 +1211,9 @@ xfs_finish_flags( return 0; } +extern void xfs_sync_worker(struct work_struct *); +extern void xfs_syncd_queue_sync(struct xfs_mount *); + STATIC int xfs_fs_fill_super( struct super_block *sb, @@ -1291,6 +1295,8 @@ xfs_fs_fill_super( set_posix_acl_flag(sb); error = xfs_syncd_init(mp); + INIT_DELAYED_WORK(&mp->m_sync_work, xfs_sync_worker); + xfs_syncd_queue_sync(mp); if (error) goto out_filestream_unmount; @@ -1315,6 +1321,7 @@ xfs_fs_fill_super( return 0; out_syncd_stop: + cancel_delayed_work_sync(&mp->m_sync_work); xfs_syncd_stop(mp); out_filestream_unmount: xfs_filestream_unmount(mp); @@ -1335,6 +1342,7 @@ out_destroy_workqueues: out_unmount: xfs_filestream_unmount(mp); xfs_unmountfs(mp); + cancel_delayed_work_sync(&mp->m_sync_work); xfs_syncd_stop(mp); goto out_free_sb; } Index: xfs/fs/xfs/xfs_sync.c =================================================================== --- xfs.orig/fs/xfs/xfs_sync.c +++ xfs/fs/xfs/xfs_sync.c @@ -370,7 +370,7 @@ xfs_quiesce_attr( xfs_buf_unlock(mp->m_sb_bp); } -static void +void xfs_syncd_queue_sync( struct xfs_mount *mp) { @@ -383,7 +383,7 @@ xfs_syncd_queue_sync( * disk quotas. We might need to cover the log to indicate that the * filesystem is idle and not frozen. */ -STATIC void +void xfs_sync_worker( struct work_struct *work) { @@ -494,11 +494,8 @@ xfs_syncd_init( struct xfs_mount *mp) { INIT_WORK(&mp->m_flush_work, xfs_flush_worker); - INIT_DELAYED_WORK(&mp->m_sync_work, xfs_sync_worker); INIT_DELAYED_WORK(&mp->m_reclaim_work, xfs_reclaim_worker); - xfs_syncd_queue_sync(mp); - return 0; } @@ -506,7 +503,6 @@ void xfs_syncd_stop( struct xfs_mount *mp) { - cancel_delayed_work_sync(&mp->m_sync_work); cancel_delayed_work_sync(&mp->m_reclaim_work); cancel_work_sync(&mp->m_flush_work); } From sandeen@redhat.com Wed Sep 12 18:00:00 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8CMxxhv053957 for ; Wed, 12 Sep 2012 18:00:00 -0500 X-ASG-Debug-ID: 1347490865-04cbb07ce4f1990001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id XlAlDSgd9kET3cT6 for ; Wed, 12 Sep 2012 16:01:05 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8CN12DK010059 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 12 Sep 2012 19:01:03 -0400 Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id q8CN11Kc023597 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Wed, 12 Sep 2012 19:01:02 -0400 Message-ID: <5051142D.1050603@redhat.com> Date: Wed, 12 Sep 2012 18:01:01 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20120824 Thunderbird/15.0 MIME-Version: 1.0 To: Brad Figg CC: linux-ext4@vger.kernel.org, xfs-oss Subject: Re: Ubuntu Ext4 regression testing References: <50511241.2090603@canonical.com> X-ASG-Orig-Subj: Re: Ubuntu Ext4 regression testing In-Reply-To: <50511241.2090603@canonical.com> X-Enigmail-Version: 1.4.4 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1347490865 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com Hi Brad - (cc: xfs list too) On 9/12/12 5:52 PM, Brad Figg wrote: > > The Ubuntu kernel team has been putting some automated testing > infrastructure in place. We are very interested in engaging with > the appropriate upstream developers. We have been running the > xfstests that come as part of the autotest testing framework. > Some of these tests fail or never complete when run against an > Ext4 file-system. Which ones? Feel free to file bugs or send mail. Tests should pass. Sometimes it's a test bug, though, of course ;) > Our initial questions are: > > 1. Is this an appropriate set of tests to be run as regression > tests? Yes, that's what it's for! > 2. Is there a list of the xfstests that are appropriate for > Ext4? Any test which says _supported_fs generic or _supported_fs ext4 can run on ext4, and should in theory pass. I think there are about 100 of them by now. There is a "dangerous" group (see groups file) which contains test nrs that might stop testing via a hang or panic. But don't skip those by default; newer kernels with those bugs fixed _should_ pass them too. > 3. Are there additional regression tests that would be beneficial > to the Linux community for us to be running? We've been encouraging new tests to be written for xfstests lately, and it's gotten a good amount of traction. There certainly may be other things out there, though. -Eric > Test results can be found at: > http://kernel.ubuntu.com/testing/index.html > > > Thanks > Brad > From david@fromorbit.com Wed Sep 12 18:13:05 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8CND5A8055477 for ; Wed, 12 Sep 2012 18:13:05 -0500 X-ASG-Debug-ID: 1347491648-04bdf0067c108080001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id ANpx2aHYeWPVb5Ok for ; Wed, 12 Sep 2012 16:14:09 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AgwKAC0WUVB5LPyM/2dsb2JhbABFumIDgQCBCIIgAQEFJxMcHAcQCAMOCi4UJQMhE4gMvB4Uinx6hUgDlV6JNIZsgniBSAQ Received: from ppp121-44-252-140.lns20.syd7.internode.on.net (HELO dastard) ([121.44.252.140]) by ipmail06.adl6.internode.on.net with ESMTP; 13 Sep 2012 08:44:08 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TBw8E-0002MJ-Cf; Thu, 13 Sep 2012 09:14:06 +1000 Date: Thu, 13 Sep 2012 09:14:06 +1000 From: Dave Chinner To: Ben Myers Cc: Christoph Hellwig , Mark Tinguely , xfs@oss.sgi.com Subject: Re: xfs: stop the sync worker before xfs_unmountfs Message-ID: <20120912231406.GJ11511@dastard> X-ASG-Orig-Subj: Re: xfs: stop the sync worker before xfs_unmountfs References: <20120829134624.316257238@sgi.com> <20120829134628.835024558@sgi.com> <20120830002335.GB15292@dastard> <20120830172549.GG3274@sgi.com> <20120830223504.GE15292@dastard> <5040FF25.1010501@sgi.com> <20120901230824.GB6896@infradead.org> <20120912183347.GO3274@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20120912183347.GO3274@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1347491649 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108365 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Sep 12, 2012 at 01:33:47PM -0500, Ben Myers wrote: > See what you think of this. Not heavily tested yet, and not pretty... but it > is fairly minimal. .... > Signed-off-by: Ben Myers > > Index: xfs/fs/xfs/xfs_super.c > =================================================================== > --- xfs.orig/fs/xfs/xfs_super.c > +++ xfs/fs/xfs/xfs_super.c > @@ -919,6 +919,7 @@ xfs_fs_put_super( > struct xfs_mount *mp = XFS_M(sb); > > xfs_filestream_unmount(mp); > + cancel_delayed_work_sync(&mp->m_sync_work); > xfs_unmountfs(mp); > xfs_syncd_stop(mp); > xfs_freesb(mp); This is the only hunk in the patch needed to fix the problem. The rest of the patch does not change the order in which the sync worker is started and stopped - it just open codes it next to the xfs_syncd_start/stop calls. Essentially, all it does is obfuscate the real fix that is being made here and makes it harder to understand what the relationship between xfs_sync_worker() and xfs_syncd_start/stop is supposed to be. So a minimal patch, IMO, is just the above hunk.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From brad.figg@canonical.com Wed Sep 12 18:14:11 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8CNEB18055650 for ; Wed, 12 Sep 2012 18:14:11 -0500 X-ASG-Debug-ID: 1347491716-04cbb07ce3f2500001-NocioJ Received: from youngberry.canonical.com (youngberry.canonical.com [91.189.89.112]) by cuda.sgi.com with ESMTP id igH7HAERYlrtZqeY for ; Wed, 12 Sep 2012 16:15:16 -0700 (PDT) X-Barracuda-Envelope-From: brad.figg@canonical.com X-Barracuda-Apparent-Source-IP: 91.189.89.112 Received: from static-50-53-107-235.bvtn.or.frontiernet.net ([50.53.107.235] helo=[192.168.1.4]) by youngberry.canonical.com with esmtpsa (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1TBw9I-0007YR-Kn; Wed, 12 Sep 2012 23:15:12 +0000 Message-ID: <5051177E.6000903@canonical.com> Date: Wed, 12 Sep 2012 16:15:10 -0700 From: Brad Figg User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:14.0) Gecko/20120714 Thunderbird/14.0 MIME-Version: 1.0 To: Eric Sandeen CC: linux-ext4@vger.kernel.org, xfs-oss Subject: Re: Ubuntu Ext4 regression testing References: <50511241.2090603@canonical.com> <5051142D.1050603@redhat.com> X-ASG-Orig-Subj: Re: Ubuntu Ext4 regression testing In-Reply-To: <5051142D.1050603@redhat.com> X-Enigmail-Version: 1.4.4 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: youngberry.canonical.com[91.189.89.112] X-Barracuda-Start-Time: 1347491716 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108365 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 09/12/2012 04:01 PM, Eric Sandeen wrote: > Hi Brad - > > (cc: xfs list too) > > On 9/12/12 5:52 PM, Brad Figg wrote: >> >> The Ubuntu kernel team has been putting some automated testing >> infrastructure in place. We are very interested in engaging with >> the appropriate upstream developers. We have been running the >> xfstests that come as part of the autotest testing framework. >> Some of these tests fail or never complete when run against an >> Ext4 file-system. > > Which ones? Feel free to file bugs or send mail. Tests should pass. > Sometimes it's a test bug, though, of course ;) > >> Our initial questions are: >> >> 1. Is this an appropriate set of tests to be run as regression >> tests? > > Yes, that's what it's for! > >> 2. Is there a list of the xfstests that are appropriate for >> Ext4? > > Any test which says > > _supported_fs generic > or > _supported_fs ext4 > > can run on ext4, and should in theory pass. I think there are > about 100 of them by now. > > There is a "dangerous" group (see groups file) which contains test nrs that > might stop testing via a hang or panic. But don't skip those by > default; newer kernels with those bugs fixed _should_ pass them too. > >> 3. Are there additional regression tests that would be beneficial >> to the Linux community for us to be running? > > We've been encouraging new tests to be written for xfstests lately, > and it's gotten a good amount of traction. There certainly may be > other things out there, though. > > -Eric > > >> Test results can be found at: >> http://kernel.ubuntu.com/testing/index.html >> >> >> Thanks >> Brad >> > > -- > To unsubscribe from this list: send the line "unsubscribe linux-ext4" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > I'm going to be doing some new runs so anything I find will be reported. Thanks, Brad -- Brad Figg brad.figg@canonical.com http://www.canonical.com From sandeen@redhat.com Wed Sep 12 19:19:39 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8D0JdvW070157 for ; Wed, 12 Sep 2012 19:19:39 -0500 X-ASG-Debug-ID: 1347495644-04cb6c5686f62c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id CUb0LJFC7mlxw2KG for ; Wed, 12 Sep 2012 17:20:44 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8D0KbxJ026589 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 12 Sep 2012 20:20:38 -0400 Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id q8D0KaND011665 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Wed, 12 Sep 2012 20:20:37 -0400 Message-ID: <505126D4.5030106@redhat.com> Date: Wed, 12 Sep 2012 19:20:36 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20120824 Thunderbird/15.0 MIME-Version: 1.0 To: Brad Figg CC: linux-ext4@vger.kernel.org, xfs-oss Subject: Re: Ubuntu Ext4 regression testing References: <50511241.2090603@canonical.com> <5051142D.1050603@redhat.com> <5051177E.6000903@canonical.com> X-ASG-Orig-Subj: Re: Ubuntu Ext4 regression testing In-Reply-To: <5051177E.6000903@canonical.com> X-Enigmail-Version: 1.4.4 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1347495644 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com On 9/12/12 6:15 PM, Brad Figg wrote: > I'm going to be doing some new runs so anything I find will be reported. Dave Chinner also pointed out that i.e. http://kernel.ubuntu.com/beta/testing/test-results/statler.2012-09-11_22-42-47/xfstests/default/control seems to redefine, re-group, exclude etc various tests, and is taking "intelligence" out of the test suite itself. I'd be wary of that; xfstests is dynamic - things get fixed, tests get added, groups changed, etc. If you hard code for example "this test is for xfs" somewhere else, you might miss updates which add coverage. Another example : #'197' : ['xfs'],# This test is only valid on 32 bit machines but the test handles that gracefully: bitsperlong=`src/feature -w` if [ "$bitsperlong" -ne 32 ]; then _notrun "This test is only valid on 32 bit machines" fi In general any test should be runnable; it may then issue 'not run' for some reason or other, but there's no harm in it - not as much harm as skipping regression tests because some config file got out of date... and: #'275' : ['generic'] # ext4 fails but I just fixed that one up, and it should pass now. Who will update the 3rd party config? Failing tests absolutely should be run as well. That information is as valuable as passing tests. The goal is getting a complete picture, not just a series of "pass" results. :) -Eric From brad.figg@canonical.com Wed Sep 12 19:40:23 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8D0eNVe072699 for ; Wed, 12 Sep 2012 19:40:23 -0500 X-ASG-Debug-ID: 1347496887-04cb6c5688f7180001-NocioJ Received: from youngberry.canonical.com (youngberry.canonical.com [91.189.89.112]) by cuda.sgi.com with ESMTP id 7yQmbAvsauuoNd9u for ; Wed, 12 Sep 2012 17:41:28 -0700 (PDT) X-Barracuda-Envelope-From: brad.figg@canonical.com X-Barracuda-Apparent-Source-IP: 91.189.89.112 Received: from static-50-53-107-235.bvtn.or.frontiernet.net ([50.53.107.235] helo=[192.168.1.4]) by youngberry.canonical.com with esmtpsa (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1TBxUi-0001MX-53; Thu, 13 Sep 2012 00:41:24 +0000 Message-ID: <50512BB1.5010605@canonical.com> Date: Wed, 12 Sep 2012 17:41:21 -0700 From: Brad Figg User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:14.0) Gecko/20120714 Thunderbird/14.0 MIME-Version: 1.0 To: Eric Sandeen CC: linux-ext4@vger.kernel.org, xfs-oss Subject: Re: Ubuntu Ext4 regression testing References: <50511241.2090603@canonical.com> <5051142D.1050603@redhat.com> <5051177E.6000903@canonical.com> <505126D4.5030106@redhat.com> X-ASG-Orig-Subj: Re: Ubuntu Ext4 regression testing In-Reply-To: <505126D4.5030106@redhat.com> X-Enigmail-Version: 1.4.4 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: youngberry.canonical.com[91.189.89.112] X-Barracuda-Start-Time: 1347496888 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 1.00 X-Barracuda-Spam-Status: No, SCORE=1.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_TG232 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108371 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.00 BSF_SC0_TG232 BODY: Custom Rule TG232 On 09/12/2012 05:20 PM, Eric Sandeen wrote: > On 9/12/12 6:15 PM, Brad Figg wrote: >> I'm going to be doing some new runs so anything I find will be reported. > > Dave Chinner also pointed out that i.e. > > http://kernel.ubuntu.com/beta/testing/test-results/statler.2012-09-11_22-42-47/xfstests/default/control > > seems to redefine, re-group, exclude etc various tests, and is taking "intelligence" out of the test suite itself. > > I'd be wary of that; xfstests is dynamic - things get fixed, tests get added, groups changed, etc. > > If you hard code for example "this test is for xfs" somewhere else, you might miss updates which add coverage. > > Another example : > > #'197' : ['xfs'],# This test is only valid on 32 bit machines > > but the test handles that gracefully: > > bitsperlong=`src/feature -w` > if [ "$bitsperlong" -ne 32 ]; then > _notrun "This test is only valid on 32 bit machines" > fi > > In general any test should be runnable; it may then issue 'not run' for some reason or other, but there's no harm in it - not as much harm as skipping regression tests because some config file got out of date... > > and: > > #'275' : ['generic'] # ext4 fails > > but I just fixed that one up, and it should pass now. Who will update the 3rd party config? > > Failing tests absolutely should be run as well. That information is as valuable as passing tests. The goal is getting a complete picture, not just a series of "pass" results. :) > > -Eric > Eric, Thanks for taking the time to point this out. We will adjust our testing accordingly. We initially tried to run xfstest against ext2, ext3, ext4, xfs and btrfs. We are also trying to get these tests to run on several different kernel versions as you can see from our test results. We were running into issues on different kernels and various file-systems while getting our act together, we did this as a band-aid. I accept that we have some things to learn w.r.t. running this test suite. We will work to run the xfstests "as is" without any outside "intelligence". We do recognise that is a dynamic set of tests that people are adding to regularly. I am not attempting to get just a series of "pass" results. If that were my goal I could accomplish it much easier and would not have engaged with the community on the mailing list. We want to help where we can and will accept constructive criticism. Brad -- Brad Figg brad.figg@canonical.com http://www.canonical.com From david@fromorbit.com Wed Sep 12 19:50:15 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8D0oFgf075647 for ; Wed, 12 Sep 2012 19:50:15 -0500 X-ASG-Debug-ID: 1347497479-04bdf06cd0152b0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id xTDvKyqVGJfcCusV for ; Wed, 12 Sep 2012 17:51:20 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AgwKACgtUVB5LPyM/2dsb2JhbABFumcDf4EIgiABAQU6HCMQCAMYLhQNGAMWCxOHfgMLskANiVMUihljeoVIA5QKgVSLFoUKgng Received: from ppp121-44-252-140.lns20.syd7.internode.on.net (HELO dastard) ([121.44.252.140]) by ipmail06.adl6.internode.on.net with ESMTP; 13 Sep 2012 10:21:19 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TBxeC-0002hy-59; Thu, 13 Sep 2012 10:51:12 +1000 Date: Thu, 13 Sep 2012 10:51:12 +1000 From: Dave Chinner To: Joe Perches Cc: raghu.prabhu13@gmail.com, xfs@oss.sgi.com, Raghavendra D Prabhu , Ben Myers , Alex Elder , open list Subject: Re: [PATCH 1/3] Add ratelimited printk for different alert levels Message-ID: <20120913005112.GK11511@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/3] Add ratelimited printk for different alert levels References: <1347420159.2456.15.camel@joe2Laptop> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1347420159.2456.15.camel@joe2Laptop> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1347497479 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_SA210e X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108373 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC5_SA210e Custom Rule SA210e On Tue, Sep 11, 2012 at 08:22:39PM -0700, Joe Perches wrote: > On Wed, 2012-09-12 at 03:43 +0530, raghu.prabhu13@gmail.com wrote: > > Ratelimited printk will be useful in printing xfs messages which are otherwise > > not required to be printed always due to their high rate (to prevent kernel ring > > buffer from overflowing), while at the same time required to be printed. > [] > > diff --git a/fs/xfs/xfs_message.h b/fs/xfs/xfs_message.h > [] > > @@ -30,6 +32,32 @@ void xfs_debug(const struct xfs_mount *mp, const char *fmt, ...) > > } > > #endif > > > > +#define xfs_printk_ratelimited(xfs_printk, dev, fmt, ...) \ > > +do { \ > > + static DEFINE_RATELIMIT_STATE(_rs, \ > > + DEFAULT_RATELIMIT_INTERVAL, \ > > + DEFAULT_RATELIMIT_BURST); \ > > + if (__ratelimit(&_rs)) \ > > + xfs_printk(dev, fmt, ##__VA_ARGS__); \ > > +} while (0) > > It might be better to use an xfs singleton RATELIMIT_STATE > > DEFINE_RATELIMIT_STATE(xfs_rs); > ... > #define xfs_printk_ratelimited(xfs_printk, dev, fmt, ...) \ > do { \ > if (__ratelimit(&xfs_rs)) \ > xfs_printk(dev, fmt, ##__VA_ARGS__); \ > } while (0) Which would then result in ratelimiting dropping potentially important, unique messages. I think it's much better to guarantee ratelimited messages get emitted at least once, especially as there is the potential for multiple filesystems to emit messages simultaneously. I think per-location rate limiting is fine for the current usage - ratelimiting is not widespread so there isn't a massive increase in size as a result of this. If we do start to use ratelimiting in lots of places in XFS, then we might have to revisit this, but it's OK for now. Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@redhat.com Wed Sep 12 20:50:21 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8D1oLYJ090891 for ; Wed, 12 Sep 2012 20:50:21 -0500 X-ASG-Debug-ID: 1347501086-04cb6c5688fa4f0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Reei4iSlWRUmENfr for ; Wed, 12 Sep 2012 18:51:26 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8D1pOUV020090 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 12 Sep 2012 21:51:24 -0400 Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q8D1pMJj011421 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Wed, 12 Sep 2012 21:51:23 -0400 Message-ID: <50513C1A.9020504@redhat.com> Date: Wed, 12 Sep 2012 20:51:22 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20120824 Thunderbird/15.0 MIME-Version: 1.0 To: Brad Figg CC: linux-ext4@vger.kernel.org, xfs-oss Subject: Re: Ubuntu Ext4 regression testing References: <50511241.2090603@canonical.com> <5051142D.1050603@redhat.com> <5051177E.6000903@canonical.com> <505126D4.5030106@redhat.com> <50512BB1.5010605@canonical.com> X-ASG-Orig-Subj: Re: Ubuntu Ext4 regression testing In-Reply-To: <50512BB1.5010605@canonical.com> X-Enigmail-Version: 1.4.4 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1347501086 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com On 9/12/12 7:41 PM, Brad Figg wrote: > Eric, > > Thanks for taking the time to point this out. We will adjust our testing accordingly. > We initially tried to run xfstest against ext2, ext3, ext4, xfs and btrfs. We are also > trying to get these tests to run on several different kernel versions as you can > see from our test results. We were running into issues on different kernels and various > file-systems while getting our act together, we did this as a band-aid. I see. > I accept that we have some things to learn w.r.t. running this test suite. We will work > to run the xfstests "as is" without any outside "intelligence". We do recognise that > is a dynamic set of tests that people are adding to regularly. > > I am not attempting to get just a series of "pass" results. If that were my goal > I could accomplish it much easier and would not have engaged with the community > on the mailing list. We want to help where we can and will accept constructive > criticism. Sorry, it sounds like I came across too strong there - it was just a little worrying to see failing or problematic tests disabled or otherwise artificially restricted. I'm actually very excited to see you setting up ongoing, public testing using xfstests, I think it'll be a great benefit, especially if there's a way to see a particular test's results across several kernel versions and/or filesystems and/or architectures, so that patterns of failure can emerge. If you find that xfstests is missing some feature or behavior which would facilitate testing in the automated environment, please do let us know what you need - or send patches. :) Thanks, -Eric > Brad > From brad.figg@canonical.com Wed Sep 12 21:03:22 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8D23LRZ091750 for ; Wed, 12 Sep 2012 21:03:21 -0500 X-ASG-Debug-ID: 1347501865-04bdf0067c1109e0001-NocioJ Received: from youngberry.canonical.com (youngberry.canonical.com [91.189.89.112]) by cuda.sgi.com with ESMTP id vOf15RvDbG6AFGgN for ; Wed, 12 Sep 2012 19:04:26 -0700 (PDT) X-Barracuda-Envelope-From: brad.figg@canonical.com X-Barracuda-Apparent-Source-IP: 91.189.89.112 Received: from static-50-53-107-235.bvtn.or.frontiernet.net ([50.53.107.235] helo=[192.168.1.4]) by youngberry.canonical.com with esmtpsa (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1TBymz-0003Qd-0F; Thu, 13 Sep 2012 02:04:21 +0000 Message-ID: <50513F22.3040201@canonical.com> Date: Wed, 12 Sep 2012 19:04:18 -0700 From: Brad Figg User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:14.0) Gecko/20120714 Thunderbird/14.0 MIME-Version: 1.0 To: Eric Sandeen CC: linux-ext4@vger.kernel.org, xfs-oss Subject: Re: Ubuntu Ext4 regression testing References: <50511241.2090603@canonical.com> <5051142D.1050603@redhat.com> <5051177E.6000903@canonical.com> <505126D4.5030106@redhat.com> <50512BB1.5010605@canonical.com> <50513C1A.9020504@redhat.com> X-ASG-Orig-Subj: Re: Ubuntu Ext4 regression testing In-Reply-To: <50513C1A.9020504@redhat.com> X-Enigmail-Version: 1.4.4 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: youngberry.canonical.com[91.189.89.112] X-Barracuda-Start-Time: 1347501866 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108377 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 09/12/2012 06:51 PM, Eric Sandeen wrote: > On 9/12/12 7:41 PM, Brad Figg wrote: > >> Eric, >> >> Thanks for taking the time to point this out. We will adjust our testing accordingly. >> We initially tried to run xfstest against ext2, ext3, ext4, xfs and btrfs. We are also >> trying to get these tests to run on several different kernel versions as you can >> see from our test results. We were running into issues on different kernels and various >> file-systems while getting our act together, we did this as a band-aid. > > I see. > >> I accept that we have some things to learn w.r.t. running this test suite. We will work >> to run the xfstests "as is" without any outside "intelligence". We do recognise that >> is a dynamic set of tests that people are adding to regularly. >> >> I am not attempting to get just a series of "pass" results. If that were my goal >> I could accomplish it much easier and would not have engaged with the community >> on the mailing list. We want to help where we can and will accept constructive >> criticism. > > Sorry, it sounds like I came across too strong there - it was just a little worrying to see failing or problematic tests disabled or otherwise artificially restricted. > > I'm actually very excited to see you setting up ongoing, public testing using xfstests, I think it'll be a great benefit, especially if there's a way to see a particular test's results across several kernel versions and/or filesystems and/or architectures, so that patterns of failure can emerge. > > If you find that xfstests is missing some feature or behavior which would facilitate testing in the automated environment, please do let us know what you need - or send patches. :) > > Thanks, > -Eric > >> Brad >> > No harm, no foul. We really don't mind constructive criticism. We are also eager to get this setup and running. We will try to contribute more than just running tests. I do want to point out that we are using the xfstests which is a snapshot in autotest. We do also look at the latest xfstests in the official xfstests repo and add it in when we see a delta. We will also work with the autotest maintainers to stay more up-to-date with xfstests. Thanks, Brad -- Brad Figg brad.figg@canonical.com http://www.canonical.com From sandeen@redhat.com Wed Sep 12 21:08:36 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8D28ZrA092111 for ; Wed, 12 Sep 2012 21:08:36 -0500 X-ASG-Debug-ID: 1347502180-04cbb07ce2fafa0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id cF46XNvkbnNPjfzF for ; Wed, 12 Sep 2012 19:09:41 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8D29c9k003688 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 12 Sep 2012 22:09:38 -0400 Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id q8D29b5J016115 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Wed, 12 Sep 2012 22:09:38 -0400 Message-ID: <50514061.2050801@redhat.com> Date: Wed, 12 Sep 2012 21:09:37 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20120824 Thunderbird/15.0 MIME-Version: 1.0 To: Brad Figg CC: linux-ext4@vger.kernel.org, xfs-oss Subject: Re: Ubuntu Ext4 regression testing References: <50511241.2090603@canonical.com> <5051142D.1050603@redhat.com> <5051177E.6000903@canonical.com> <505126D4.5030106@redhat.com> <50512BB1.5010605@canonical.com> <50513C1A.9020504@redhat.com> <50513F22.3040201@canonical.com> X-ASG-Orig-Subj: Re: Ubuntu Ext4 regression testing In-Reply-To: <50513F22.3040201@canonical.com> X-Enigmail-Version: 1.4.4 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1347502181 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com On 9/12/12 9:04 PM, Brad Figg wrote: > On 09/12/2012 06:51 PM, Eric Sandeen wrote: >> On 9/12/12 7:41 PM, Brad Figg wrote: >> >>> Eric, >>> >>> Thanks for taking the time to point this out. We will adjust our testing accordingly. >>> We initially tried to run xfstest against ext2, ext3, ext4, xfs and btrfs. We are also >>> trying to get these tests to run on several different kernel versions as you can >>> see from our test results. We were running into issues on different kernels and various >>> file-systems while getting our act together, we did this as a band-aid. >> >> I see. >> >>> I accept that we have some things to learn w.r.t. running this test suite. We will work >>> to run the xfstests "as is" without any outside "intelligence". We do recognise that >>> is a dynamic set of tests that people are adding to regularly. >>> >>> I am not attempting to get just a series of "pass" results. If that were my goal >>> I could accomplish it much easier and would not have engaged with the community >>> on the mailing list. We want to help where we can and will accept constructive >>> criticism. >> >> Sorry, it sounds like I came across too strong there - it was just a little worrying to see failing or problematic tests disabled or otherwise artificially restricted. >> >> I'm actually very excited to see you setting up ongoing, public testing using xfstests, I think it'll be a great benefit, especially if there's a way to see a particular test's results across several kernel versions and/or filesystems and/or architectures, so that patterns of failure can emerge. >> >> If you find that xfstests is missing some feature or behavior which would facilitate testing in the automated environment, please do let us know what you need - or send patches. :) >> >> Thanks, >> -Eric >> >>> Brad >>> >> > > No harm, no foul. We really don't mind constructive criticism. We are also > eager to get this setup and running. We will try to contribute more than > just running tests. Just running them and publishing results is definitely useful. > I do want to point out that we are using the xfstests which is a snapshot > in autotest. We do also look at the latest xfstests in the official xfstests > repo and add it in when we see a delta. We will also work with the autotest > maintainers to stay more up-to-date with xfstests. Ah, I didn't know that autotest had a snapshot. I wonder if there's a way to tease that back out, and pull down xfstests from git daily. FWIW, it's a little confusing - we have 2 repos: git://oss.sgi.com/xfs/cmds/xfstests.git git://git.kernel.org/pub/scm/fs/xfs/xfstests-dev.git the one on kernel.org is where most rapid development seems to happen, and changes get pulled over to sgi. Sometimes, it goes the other way. Did autotest make any changes to what's upstream? -Eric > Thanks, > Brad > From brad.figg@canonical.com Wed Sep 12 21:16:50 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_33 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8D2Goe8092612 for ; Wed, 12 Sep 2012 21:16:50 -0500 X-ASG-Debug-ID: 1347502675-04cbb07ce2fb680001-NocioJ Received: from youngberry.canonical.com (youngberry.canonical.com [91.189.89.112]) by cuda.sgi.com with ESMTP id MHKwlF7OUTIqUbIZ for ; Wed, 12 Sep 2012 19:17:55 -0700 (PDT) X-Barracuda-Envelope-From: brad.figg@canonical.com X-Barracuda-Apparent-Source-IP: 91.189.89.112 Received: from static-50-53-107-235.bvtn.or.frontiernet.net ([50.53.107.235] helo=[192.168.1.4]) by youngberry.canonical.com with esmtpsa (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1TBz04-0003na-GF; Thu, 13 Sep 2012 02:17:52 +0000 Message-ID: <5051424E.8090502@canonical.com> Date: Wed, 12 Sep 2012 19:17:50 -0700 From: Brad Figg User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:14.0) Gecko/20120714 Thunderbird/14.0 MIME-Version: 1.0 To: Eric Sandeen CC: linux-ext4@vger.kernel.org, xfs-oss Subject: Re: Ubuntu Ext4 regression testing References: <50511241.2090603@canonical.com> <5051142D.1050603@redhat.com> <5051177E.6000903@canonical.com> <505126D4.5030106@redhat.com> <50512BB1.5010605@canonical.com> <50513C1A.9020504@redhat.com> <50513F22.3040201@canonical.com> <50514061.2050801@redhat.com> X-ASG-Orig-Subj: Re: Ubuntu Ext4 regression testing In-Reply-To: <50514061.2050801@redhat.com> X-Enigmail-Version: 1.4.4 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: youngberry.canonical.com[91.189.89.112] X-Barracuda-Start-Time: 1347502675 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108377 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 09/12/2012 07:09 PM, Eric Sandeen wrote: > On 9/12/12 9:04 PM, Brad Figg wrote: >> On 09/12/2012 06:51 PM, Eric Sandeen wrote: >>> On 9/12/12 7:41 PM, Brad Figg wrote: >>> >>>> Eric, >>>> >>>> Thanks for taking the time to point this out. We will adjust our testing accordingly. >>>> We initially tried to run xfstest against ext2, ext3, ext4, xfs and btrfs. We are also >>>> trying to get these tests to run on several different kernel versions as you can >>>> see from our test results. We were running into issues on different kernels and various >>>> file-systems while getting our act together, we did this as a band-aid. >>> >>> I see. >>> >>>> I accept that we have some things to learn w.r.t. running this test suite. We will work >>>> to run the xfstests "as is" without any outside "intelligence". We do recognise that >>>> is a dynamic set of tests that people are adding to regularly. >>>> >>>> I am not attempting to get just a series of "pass" results. If that were my goal >>>> I could accomplish it much easier and would not have engaged with the community >>>> on the mailing list. We want to help where we can and will accept constructive >>>> criticism. >>> >>> Sorry, it sounds like I came across too strong there - it was just a little worrying to see failing or problematic tests disabled or otherwise artificially restricted. >>> >>> I'm actually very excited to see you setting up ongoing, public testing using xfstests, I think it'll be a great benefit, especially if there's a way to see a particular test's results across several kernel versions and/or filesystems and/or architectures, so that patterns of failure can emerge. >>> >>> If you find that xfstests is missing some feature or behavior which would facilitate testing in the automated environment, please do let us know what you need - or send patches. :) >>> >>> Thanks, >>> -Eric >>> >>>> Brad >>>> >>> >> >> No harm, no foul. We really don't mind constructive criticism. We are also >> eager to get this setup and running. We will try to contribute more than >> just running tests. > > Just running them and publishing results is definitely useful. > >> I do want to point out that we are using the xfstests which is a snapshot >> in autotest. We do also look at the latest xfstests in the official xfstests >> repo and add it in when we see a delta. We will also work with the autotest >> maintainers to stay more up-to-date with xfstests. > > Ah, I didn't know that autotest had a snapshot. I wonder if there's a way to > tease that back out, and pull down xfstests from git daily. > > FWIW, it's a little confusing - we have 2 repos: > > git://oss.sgi.com/xfs/cmds/xfstests.git > git://git.kernel.org/pub/scm/fs/xfs/xfstests-dev.git > > the one on kernel.org is where most rapid development seems to happen, and changes get pulled over to sgi. Sometimes, it goes the other way. > > Did autotest make any changes to what's upstream? > > -Eric > >> Thanks, >> Brad >> > No, it seems to be an unmodified snapshot. As long as it's kept up-to-date, which is something we have a vested interest in seeing is done, I'm fine with this. We then take this (autotest) and also roll it into our QA team for even more testing. They will also be making their testing results public. I grabbed from the oss.sgi repository. If one is more "authoritative" or one you'd rather see us use, just let me/us know. Brad -- Brad Figg brad.figg@canonical.com http://www.canonical.com From tytso@thunk.org Wed Sep 12 21:23:42 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8D2NgVw093058 for ; Wed, 12 Sep 2012 21:23:42 -0500 X-ASG-Debug-ID: 1347503086-04bdf0067e111c40001-NocioJ Received: from imap.thunk.org (li9-11.members.linode.com [67.18.176.11]) by cuda.sgi.com with ESMTP id ka6LlmidcJ4sq6K8 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Wed, 12 Sep 2012 19:24:47 -0700 (PDT) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 67.18.176.11 Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.72) (envelope-from ) id 1TBz6d-00016Y-8K; Thu, 13 Sep 2012 02:24:39 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 8DBA82412CC; Wed, 12 Sep 2012 22:24:42 -0400 (EDT) Date: Wed, 12 Sep 2012 22:24:42 -0400 From: "Theodore Ts'o" To: Eric Sandeen Cc: Brad Figg , linux-ext4@vger.kernel.org, xfs-oss Subject: Re: Ubuntu Ext4 regression testing Message-ID: <20120913022442.GB27544@thunk.org> X-ASG-Orig-Subj: Re: Ubuntu Ext4 regression testing References: <50511241.2090603@canonical.com> <5051142D.1050603@redhat.com> <5051177E.6000903@canonical.com> <505126D4.5030106@redhat.com> <50512BB1.5010605@canonical.com> <50513C1A.9020504@redhat.com> <50513F22.3040201@canonical.com> <50514061.2050801@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50514061.2050801@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: li9-11.members.linode.com[67.18.176.11] X-Barracuda-Start-Time: 1347503087 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108379 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Sep 12, 2012 at 09:09:37PM -0500, Eric Sandeen wrote: > > Ah, I didn't know that autotest had a snapshot. I wonder if there's > a way to tease that back out, and pull down xfstests from git daily. > > FWIW, it's a little confusing - we have 2 repos: > > git://oss.sgi.com/xfs/cmds/xfstests.git > git://git.kernel.org/pub/scm/fs/xfs/xfstests-dev.git This may be helpful; I have a xfstests build environment here: git://git.kernel.org/pub/scm/fs/ext2/xfstests-bld.git It will automatically pull down the xfstests and xfsprogs from git.kernel.org, and builds xfstests in a hermetic environment (i.e., it doesn't depend on version of xfsprogs, libacl, libaio, etc. installed on the build system). I set this up back when I was doing most of my work using Ubuntu LTS 10.04, and the positively ancient versions of libacl, libaio, xfsprogs-dev, etc., weren't compatible with the bleeding edge of xfstests. So I used this build environment so I wasn't dependent on the vagrancies of whatever happened to be in Ubunutu LTS 10.04. The makefiles in xfstests-bld will also generate a tar file containing the necessary xfstests and xfsprogs binaries which I could then drop into a debootstrap environment (I'm currently using a x86-32 Debian unstable chroot) which I then use in my KVM image. So it allows me to get and build the very latest version of xfstests from git.kernel.org in a highly automated fashion. Regards, - Ted From BATV+716a7932f4ba27a9545c+3308+infradead.org+hch@bombadil.srs.infradead.org Thu Sep 13 02:49:24 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8D7nNld113613 for ; Thu, 13 Sep 2012 02:49:24 -0500 X-ASG-Debug-ID: 1347522627-04cbb07ce310d120001-NocioJ Received: from bombadil.infradead.org (173-166-109-252-newengland.hfc.comcastbusiness.net [173.166.109.252]) by cuda.sgi.com with ESMTP id Xjo5lwnnQjiGNF2K (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 13 Sep 2012 00:50:27 -0700 (PDT) X-Barracuda-Envelope-From: BATV+716a7932f4ba27a9545c+3308+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 173.166.109.252 Received: from hch by bombadil.infradead.org with local (Exim 4.76 #1 (Red Hat Linux)) id 1TC4Bv-0008D7-0r for xfs@oss.sgi.com; Thu, 13 Sep 2012 07:50:27 +0000 Date: Thu, 13 Sep 2012 03:50:26 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: userspace trees Message-ID: <20120913075026.GA27256@infradead.org> X-ASG-Orig-Subj: userspace trees MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: 173-166-109-252-newengland.hfc.comcastbusiness.net[173.166.109.252] X-Barracuda-Start-Time: 1347522627 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 2.60 X-Barracuda-Spam-Status: No, SCORE=2.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA606_DYN_OB, BSF_SC5_MJ1963, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108401 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 2.00 BSF_SC0_SA606_DYN_OB Custom Outbreak Rule SA606_DYN_OB It seems with the kernel.org account purge last year and me being way to busy it seems like the -dev trees of the XFS userspace get very little attention. What do people think about retiring them and using the oss trees exclusively again for now? Right now the trees are getting a bit out of sync which isn't a good thing. From BATV+716a7932f4ba27a9545c+3308+infradead.org+hch@bombadil.srs.infradead.org Thu Sep 13 02:55:10 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8D7tA9v113965 for ; Thu, 13 Sep 2012 02:55:10 -0500 X-ASG-Debug-ID: 1347522976-04cbb07ce310d540001-NocioJ Received: from bombadil.infradead.org (173-166-109-252-newengland.hfc.comcastbusiness.net [173.166.109.252]) by cuda.sgi.com with ESMTP id 17J3tXHCZKBw089J (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 13 Sep 2012 00:56:16 -0700 (PDT) X-Barracuda-Envelope-From: BATV+716a7932f4ba27a9545c+3308+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 173.166.109.252 Received: from hch by bombadil.infradead.org with local (Exim 4.76 #1 (Red Hat Linux)) id 1TC4HV-00010H-MZ; Thu, 13 Sep 2012 07:56:13 +0000 Date: Thu, 13 Sep 2012 03:56:13 -0400 From: Christoph Hellwig To: Chandra Seetharaman Cc: Dave Chinner , xfs@oss.sgi.com Subject: Re: [RFC v6 PATCH 1/5] xfs: Remove incore use of XFS_OQUOTA_ENFD and XFS_OQUOTA_CHKD Message-ID: <20120913075613.GA32120@infradead.org> X-ASG-Orig-Subj: Re: [RFC v6 PATCH 1/5] xfs: Remove incore use of XFS_OQUOTA_ENFD and XFS_OQUOTA_CHKD References: <20120720230202.20477.69766.sendpatchset@chandra-lucid.austin.ibm.com> <20120720230208.20477.49663.sendpatchset@chandra-lucid.austin.ibm.com> <20120814224645.GQ2877@dastard> <1345676002.2260.0.camel@chandra-lucid.austin.ibm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1345676002.2260.0.camel@chandra-lucid.austin.ibm.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: 173-166-109-252-newengland.hfc.comcastbusiness.net[173.166.109.252] X-Barracuda-Start-Time: 1347522976 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108401 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS On Wed, Aug 22, 2012 at 05:53:22PM -0500, Chandra Seetharaman wrote: > will fix them as suggested. > > Thanks for the review. Any updates on reposting the series? From BATV+716a7932f4ba27a9545c+3308+infradead.org+hch@bombadil.srs.infradead.org Thu Sep 13 03:03:15 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8D83FjC114553 for ; Thu, 13 Sep 2012 03:03:15 -0500 X-ASG-Debug-ID: 1347523460-04cb6c568610d6c0001-NocioJ Received: from bombadil.infradead.org (173-166-109-252-newengland.hfc.comcastbusiness.net [173.166.109.252]) by cuda.sgi.com with ESMTP id dnSBOjRMnsD7O14L (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 13 Sep 2012 01:04:21 -0700 (PDT) X-Barracuda-Envelope-From: BATV+716a7932f4ba27a9545c+3308+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 173.166.109.252 Received: from hch by bombadil.infradead.org with local (Exim 4.76 #1 (Red Hat Linux)) id 1TC4PM-0002YJ-FU; Thu, 13 Sep 2012 08:04:20 +0000 Date: Thu, 13 Sep 2012 04:04:20 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org Subject: XFS status update for August 2012 Message-ID: <20120913080420.GA9775@infradead.org> X-ASG-Orig-Subj: XFS status update for August 2012 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: 173-166-109-252-newengland.hfc.comcastbusiness.net[173.166.109.252] X-Barracuda-Start-Time: 1347523460 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_MJ1963, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108401 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 After the release of Linux 3.5 in July, August saw the big XFS merge for the Linux 3.6 merge window. In the meantime the XFS tree has seen low activity, with refined support for SEEK_HOLE/SEEK_DATA that takes unwritten extents into account as the main feature. A couple of fixes also went in and mostly got back ported to mainline for Linux 3.5 as well. The mailing list had a lot of traffic about interesting updates that didn't make it into the tree yet, with the most interesting being: remount support for the inode64 option, a patch series allowing to trim back large preallocations when the filesystem is out of space, and a large rewrite of the XFS-internal sync code. On the user land side xfs_db saw a fix for a very long standing bug go into the tree and xfstests saw a few fixes. The mailing list list saw various other interesting updates including a German translation for the xfsdump messages, 32-bit project ID support in xfsdump, a lot of xfstests updates including a patch to use the upstream util-linux version of fstrim in xfstests, support for tmpfs in xfstests, various ext3 and btrfs updates, but none of them made it into the git tree. There also was a lot of discussion of older patch to reorganize the xfstests source tree. From BATV+716a7932f4ba27a9545c+3308+infradead.org+hch@bombadil.srs.infradead.org Thu Sep 13 03:16:39 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8D8Gd8d115752 for ; Thu, 13 Sep 2012 03:16:39 -0500 X-ASG-Debug-ID: 1347524263-04bdf06cd02c3c0001-NocioJ Received: from bombadil.infradead.org (173-166-109-252-newengland.hfc.comcastbusiness.net [173.166.109.252]) by cuda.sgi.com with ESMTP id aFB6whySxdzcQupt (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO); Thu, 13 Sep 2012 01:17:44 -0700 (PDT) X-Barracuda-Envelope-From: BATV+716a7932f4ba27a9545c+3308+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 173.166.109.252 Received: from hch by bombadil.infradead.org with local (Exim 4.76 #1 (Red Hat Linux)) id 1TC4cI-0006EP-PH; Thu, 13 Sep 2012 08:17:42 +0000 Date: Thu, 13 Sep 2012 04:17:42 -0400 From: Christoph Hellwig To: Ben Myers Cc: Christoph Hellwig , Mark Tinguely , xfs@oss.sgi.com Subject: Re: xfs: stop the sync worker before xfs_unmountfs Message-ID: <20120913081742.GA23181@infradead.org> X-ASG-Orig-Subj: Re: xfs: stop the sync worker before xfs_unmountfs References: <20120829134624.316257238@sgi.com> <20120829134628.835024558@sgi.com> <20120830002335.GB15292@dastard> <20120830172549.GG3274@sgi.com> <20120830223504.GE15292@dastard> <5040FF25.1010501@sgi.com> <20120901230824.GB6896@infradead.org> <20120912183347.GO3274@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20120912183347.GO3274@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: 173-166-109-252-newengland.hfc.comcastbusiness.net[173.166.109.252] X-Barracuda-Start-Time: 1347524263 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108401 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS On Wed, Sep 12, 2012 at 01:33:47PM -0500, Ben Myers wrote: > See what you think of this. Not heavily tested yet, and not pretty... but it > is fairly minimal. > > Pull startup and shutdown of the sync worker out of xfs_syncd_init and > xfs_syncd_stop into their callers. In the case of unmount, move shutdown of > the xfs_sync_worker before teardown of the log in xfs_unmountfs. This prevents > occasional crashes on unmount like so: > > PID: 21602 TASK: ee9df060 CPU: 0 COMMAND: "kworker/0:3" > #0 [c5377d28] crash_kexec at c0292c94 Can you remove the trailing whitespaces in these lines? They make reading the changelog on a normal 80 character wide terminal pretty hard. The changes look fine to me, Reviewed-by: Christoph Hellwig From jcameli@spsu.edu Thu Sep 13 06:20:41 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.0 required=5.0 tests=BAYES_99 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8DBKfgr147181 for ; Thu, 13 Sep 2012 06:20:41 -0500 X-ASG-Debug-ID: 1347535304-04cbb07ce311bc60001-NocioJ Received: from smtp1.spsu.edu (smtp1.spsu.edu [168.28.176.203]) by cuda.sgi.com with ESMTP id 3V0qYpYW0jkQZOTF; Thu, 13 Sep 2012 04:21:44 -0700 (PDT) X-Barracuda-Envelope-From: jcameli@spsu.edu X-Barracuda-Apparent-Source-IP: 168.28.176.203 Received: from zstore1.spsu.edu (zstore1.spsu.edu [168.28.176.205]) by smtp1.spsu.edu (Postfix) with ESMTP id 7CAA54938CD; Thu, 13 Sep 2012 07:14:54 -0400 (EDT) Date: Thu, 13 Sep 2012 07:17:43 -0400 (EDT) From: Google+ Team Reply-To: gpanniversary@sucmail.com Message-ID: <284478801.4827029.1347535063506.JavaMail.root@zstore1.spsu.edu> In-Reply-To: <1479404002.4826569.1347534862403.JavaMail.root@zstore1.spsu.edu> Subject: Powered By Google+ MIME-Version: 1.0 X-ASG-Orig-Subj: Powered By Google+ Content-Type: multipart/mixed; boundary="----=_Part_4827027_60015941.1347535063502" X-Originating-IP: [217.174.252.49] X-Mailer: Zimbra 7.1.4_GA_2568 (ZimbraWebClient - FF3.0 (Win)/7.1.4_GA_2555) To: undisclosed-recipients:; X-Barracuda-Connect: smtp1.spsu.edu[168.28.176.203] X-Barracuda-Start-Time: 1347535304 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108414 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- ------=_Part_4827027_60015941.1347535063502 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Dear Google User. Attached to this email is your anniversary notification for being an active user of Google. Sincerely. Mr. Matt Brittin CEO of Google UK. ------=_Part_4827027_60015941.1347535063502 Content-Type: application/pdf; name="Google Anniversary.pdf" Content-Disposition: attachment; filename="Google Anniversary.pdf" Content-Transfer-Encoding: base64 JVBERi0xLjQKJeLjz9MKNiAwIG9iago8PCAKICAgL1R5cGUgL1hPYmplY3QKICAgL1N1YnR5cGUg L0ltYWdlCiAgIC9CaXRzUGVyQ29tcG9uZW50IDgKICAgL1dpZHRoIDM4NgogICAvSGVpZ2h0IDE3 MAogICAvQ29sb3JTcGFjZSAvRGV2aWNlUkdCCiAgIC9GaWx0ZXIgL0RDVERlY29kZQogICAvTGVu Z3RoIDQ1NTIKPj4Kc3RyZWFtCv/Y/+4ADkFkb2JlAGQAAAAAAf/bAEMABwUGBgYFBwYGBggIBwkL EgwLCgoLFxARDRIbFxwcGhcaGR0hKiQdHyggGRolMiUoLC0vMC8dIzQ4NC43Ki4vLv/bAEMBCAgI CwoLFgwMFi4eGh4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLv/AABEIAKoBggMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/ xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKC CQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaH iImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp 6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAME BwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYn KCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeY mZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/ 2gAMAwEAAhEDEQA/APpGiiigAopCQBkmqk05J2qfwFVGLZLlYtsyr1YCozPEP4s1WigkkO58gelW RbxD+AGm1FBdsT7RF6mnCaM/xUGCL/nmKrzWuBmL8qEosPeLYZT0YGlrLDMp2vkH3qVZWXkMcelU 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 +IfGoRFQdAMU6iisiwooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigBjxRv8AfRT+FQGygPQMPoat UU1JrZisioLKL1f86kW0gX+HP1NT0U+eXcLIRVCjCgAe1LRRUjCiiigAooooAKKKKACiiigAoooo AKKKKACiiigD/9kKZW5kc3RyZWFtCmVuZG9iago3IDAgb2JqCjw8IAogICAvVHlwZSAvWE9iamVj dAogICAvU3VidHlwZSAvSW1hZ2UKICAgL0JpdHNQZXJDb21wb25lbnQgOAogICAvV2lkdGggMjc2 CiAgIC9IZWlnaHQgMTEwCiAgIC9Db2xvclNwYWNlIFsvSW5kZXhlZCAvRGV2aWNlUkdCIDI1NSA4 IDAgUiBdCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggNzE2Mwo+PgpzdHJlYW0K eF7tXItbE2e6f+LqSkFsd9uKEAhm2zqItpmEBDR4upNJQEJMbaJJCEPCBhFQExCReu9VLtpqK1tA sQWxWusNWmut0q0Uwcvabru97tbutnvO2bZn3XO2/8J5329mQi4TsMLTdsUfbZ+n8ibzfb/vvb/f KJPdwi3cwi3cwi3cwi3cwi38wJj0M8DkyVOm/BwwdTTpG0LcbfEJ0xIB0xLib5s+mvSPjkmTb588 efLtd/zil3feedfdM0YT//6YnpA0MzlFnpqampaWlpoqT0lWpCfOUo72sR8Nv7rn3vvuuB3VBDm5 6+7Zs2dTGaN96PvgtmnpyXOAikwRQMocQEryzLnzxvdR44VJ999/zz333P+zyVPuA0oeUNFqWjOO K43PUqSkyLWZOl12zvwFC+bnZGszM9Pk8hTEnBR97sLRvuFHwuz/uGfKlHsfBEp+zTAG1mgaL07i 0/XJKXk6XU7+ogJzYWGhZbHB+tCi/BwtKguSAuqyZNZo3/IjgNIYH77/3nt/8cu7gBOb3WoZL06W Zin0ycBI/jLWUWiwqpxOp8vlcjpVzqL8bC2aELIil8+cN9o3/eCgaDc7+d77UE0e+HUxp2JpzWgf uR5MTyxR6PN0nvwCh9kKbHiD4DjOVpQPuiJHxyJPzdSWjqO1jguAk4cn30FM54Hf+DiVQzkeC1ya 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 Uol+jjxTl29mnRznNUwcb0K6zgcCOeLEaXiowk9V5i97zoK9N8la6OYFZTSruEoynkRS+MuI2KzH lrVRzbicdtUEo4QfV9krqlbMz87mZxfgXfLyFpQuIy1rJ44sRpla3YTgSfEXldVXVdbV1ZWWLnpr mdVgMTMM37K2GCdOyAkC/CyZF1bjeK/YxpFmNf8fFYMX2iZEoRMByojzQi+Hoyqf74oPp5o2nJHh PG0CKgkBjozcFjAWl321zWZDHVHxA7XrGuPdpCCTNLXFYhZgYVl8v3EiWk0oKI2SjHVoGv+ylODU auLqiQAcMU503biFGCBvno3xrxecoLjF2i1I4pZN/VD4f5Py4ScKZW5kc3RyZWFtCmVuZG9iagoz IDAgb2JqCjw8IAogICAvVHlwZSAvUGFnZQogICAvUGFyZW50IDIgMCBSCiAgIC9SZXNvdXJjZXMg PDwgCiAgIC9Qcm9jU2V0IFsvUERGIC9UZXh0IF0KICAgL1hPYmplY3QgPDwgCiAgIC9JbWcxIDYg MCBSCiAgIC9JbWcyIDcgMCBSCj4+CiAgIC9Gb250IDw8IAogICAvRjEgOSAwIFIKICAgL0YyIDEy IDAgUgogICAvRjMgMTUgMCBSCj4+Cj4+CiAgIC9NZWRpYUJveCBbMCAwIDYxMiA3OTJdCiAgIC9D b250ZW50cyA0IDAgUgo+PgplbmRvYmoKNCAwIG9iago8PCAKICAgL0ZpbHRlciAvRmxhdGVEZWNv ZGUKICAgL0xlbmd0aCAyOTk1Cj4+CnN0cmVhbQp4Xs1abZPUxhH+vr9iP2oSn1YzI40kf0mwDQcJ WeB8jisV54PgOKAMZziEMUnl1+SPZrpnutUj7d7dzlalAsWyq5eefvr1mZY+rD74v3pd+b963Vel qde2akrTrV+8W9V9XboaTxrdlr3Br/7E5tG7V3r93S+rZ/7vh9U356vNA73WZn1+uarwoutXq6rs +24SvW5bV9br83ervxdr9Y/1+Z9W98+n242/vezdjRIaV2oXJeAfdaK7+JX+3OnQXS66yzURR6Jn 3ejSdYmutyuQYY+mNrBCapN9KBL5rrJlV68bUzZu3cHt3rmNWV+/XP34u9XVHdcnKXOf7AK4hHdr tNiu7Lq90XLz7U3XlP78XhEy4teuqcvWQFSbqoXb8EylIQdEuJtZuFt/TVl1qERpnHPr9L+5TqZH 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 dWJ0eXBlIC9JbWFnZQogICAvQml0c1BlckNvbXBvbmVudCA4CiAgIC9XaWR0aCAzODYKICAgL0hl aWdodCAxNzAKICAgL0NvbG9yU3BhY2UgL0RldmljZVJHQgogICAvRmlsdGVyIC9EQ1REZWNvZGUK ICAgL0xlbmd0aCA0NTUyCj4+CnN0cmVhbQr/2P/uAA5BZG9iZQBkAAAAAAH/2wBDAAcFBgYGBQcG BgYICAcJCxIMCwoKCxcQEQ0SGxccHBoXGhkdISokHR8oIBkaJTIlKCwtLzAvHSM0ODQuNyouLy7/ 2wBDAQgICAsKCxYMDBYuHhoeLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi7/wAARCACqAYIDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQF BgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS 0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4 eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi 4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREA AgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl 8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImK kpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP0 9fb3+Pn6/9oADAMBAAIRAxEAPwD6RooooAKKQkAZJqpNOSdqn8BVRi2S5WLbMq9WAqMzxD+LNVoo JJDufIHpVkW8Q/gBptRQXbE+0ReppwmjP8VBgi/55iq81rgZi/KhKLD3i2GU9GBpaywzKdr5B96l WVl5DHHpVOn2Fz9y/RUcUqSjgjPcVJWbViwooopAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFF 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 QihQScdz3pkSg47i0UUUEBRRRQBFPAkwAbII6EVny2ssWW4ZfUVq0VcajiJxTMQSYODViK7dBjgj 0Iq9LbxS8uuT9ahNjD2LD8a19pB7ojla2Gi+GOY/1pTfL/cP50osYfVj+NPW0gU52n86i9MdpEBv XfiNOfeo2trmY7m2j3JrRVFX7oxTqXtLfCh8vcoRacFYM8hJBzgCr9FFTKTluNKwUUUVIyrNYwys W+ZWPcGqzaa2fllB+orTopWNI1px2ZmjTn/ilH4CporCJGDEliPWrlFFhutN9QooopmQUUUUAFQt ApOVODU1FTKKluNNrYhEbjowpdj92FS0Vn7CHYfMxixqpz1NPoorVRSVkS3cKKKZI4Qe9MG7DmYK Mk4FV3u0U4Ck1XaR5pdi9T61ZitkTk5Letacqj8RF29iM3EzfciGPc1UeKVBuZcAe9a4GKCAQQeh oVS2yG43MdWzVy1uOkb/AIGobm28n50OU9+1Vya2aU0Z6xZtVDPbxTkGRSSOODS20hlhDHr0NS1y tdGa6NFP+zrX+63/AH1R/Z1t/db/AL6q5RSshcqGRRrEgRBhRT6KKZQ2SNZEKOMqaoSaYM/u5cD0 YZrRoosXGpKOzMn+zZv+eiVImm/89JM+wFaVFKxbrz7jIokiUKgwKfRRTMW77hRRRQAUUUUAFFFF ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABVK4lyCR+FX GOFJ9BWXIcrWlNXZEy3ZRL5YlPLHP4VaqGzP+jp/nvU1TN3kylsFFFFSMa6K6lWGQaypk8t2QnOK 16zb/AmJ9hWtF62InsTaccxOPRquVU05cQbv7zE1bqZ/EylsFFFFQMKKKKACiiigAooooAKKKKAC iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK KKACsiQFHZD2OK16qXsBdQ6DLDrjuK0pys7MmSuRWk3ltsP3SevpWhWIGwcHrVqC5ZOCcr6ZrSpT vqiYytozRoqEXMRGS2DQ1zCAfnyax5X2LuiYkAZPSspw11cELxn9KkllluG2Rg7fQVct4VhQAD5u 59ate4r9SfiHxqERUHQDFOoorIsKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAY8Ub/AH0U/hUB soD0DD6GrVFNSa2YrIqCyi9X/OpFtIF/hz9TU9FPnl3CyEVQowoAHtS0UVIwooooAKKKKACiiigA ooooAKKKKACiiigAooooA//ZCmVuZHN0cmVhbQplbmRvYmoKMSAwIG9iago8PCAKICAgL1R5cGUg L0NhdGFsb2cKICAgL1BhZ2VzIDIgMCBSCiAgIC9QYWdlTGF5b3V0IC9PbmVDb2x1bW4KICAgL1Bh Z2VNb2RlIC9Vc2VOb25lCj4+CmVuZG9iagoyIDAgb2JqCjw8IAogICAvVHlwZSAvUGFnZXMKICAg L0tpZHMgWzMgMCBSIDE4IDAgUiBdCiAgIC9Db3VudCAyCj4+CmVuZG9iagoxOCAwIG9iago8PCAK ICAgL1R5cGUgL1BhZ2UKICAgL1BhcmVudCAyIDAgUgogICAvUmVzb3VyY2VzIDw8IAogICAvUHJv Y1NldCBbL1BERiAvVGV4dCBdCiAgIC9YT2JqZWN0IDw8IAogICAvSW1nMyAyMCAwIFIKPj4KICAg L0ZvbnQgPDwgCiAgIC9GMSA5IDAgUgogICAvRjIgMTIgMCBSCiAgIC9GMyAxNSAwIFIKPj4KPj4K ICAgL01lZGlhQm94IFswIDAgNjEyIDc5Ml0KICAgL0NvbnRlbnRzIDE5IDAgUgo+PgplbmRvYmoK MTkgMCBvYmoKPDwgCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCiAgIC9MZW5ndGggMTM1MAo+Pgpz dHJlYW0KeF6lWM1y2zYQvvMpeOoQHQshQBIkj02aZtKfaTNVp4dOD0xsy55Gii3T7aRv1LcsdoFd ACIly4w0IikQ2N9vPyx5n93br8pL+1V5X0pd51XZSN3lH7ZZ3dfS1HhTq1b2Gi/tjRdvt5sq//ZT 9s5+77OX6+zFdypXOl9fZyVO2m+yUvZ9F0TnbWtkna+32R9FLv7M199nr9dhubbLZW9OSmiMVMZL wI9Yqc5f0uesoXMmnTPH+5HYWTdKmi6x9WkDFsSjqTVoSGNyzItEvikr2dV5o2Vj8g6W2+Q2Ot9f Zb9/ne3O1E9SDnMy5+DUvSfRUnWy646i5fTypmukvX9aRJWrUpbdacjWwbu1dUkXN6IvroSyAnXx 5pNYNQUeNkJ3xUexCjd/sb+9/eHtLdzGq/FWqNpd7qwomPmNqIp/7HmA6ZeixkGnDYQNW9HgEKge hK6LB7FqcQQmozwc+SBaJ/hvsXJLQSCcSejgxFRV8WhlbewoWQu2wBjoeu/HYXVOHlyLoBIHYDbM TJwGE3BguIUjSEuMfYyiNwpdOVHwDwKAa8CSnZ8GFtB6E25fk6P7BVltmkrqJLFgJcveYKieLxbA UtUskwOBdqIP5DdYvydvYRDUXgJAOFSUNxdKDBTO5sSGoAxutcvvCBDBmTGU7uwZsTV6lTrKyvA+ TujIUkALS/IJ4hRYAO1IUwiaTo0Z0HpURFk27i8CmUMQC5hXfQfB4bmn4IriJfkGhfUww9CNRmaL 88XV4UJPEQId6MZ4UAjLAKIV7KGoMKQKFV2QzRyBOcyYQ9BEXDCC5Z8BINPimilLzMYYs1mA6zj6 eJogMGEsCjkmEtcRPSRcgUbEKgjXbs3TZU+ZNPPkqzoi33qWew2RryfpUEjz/DsLlRZ6oThzUWmZ c2h6GVTKPlGIGiCNFIKE0i99PmBCwNTUU6IeDgvZe7XASq1SMwew4t6TvOMbhtFDAu8BqwnJgvF1 cl8xRxD87A0QBIcaieBkih9hOIU/TzXFS6axZJcOpPgRrGBYk15PIpYvA4uMXJaRAc8PvwWJ6VuO PviOEYUL3jsmBJvWZ0jGwR4BQpj7hrktoJ/uAMxhkJ3hL6HLmR0CDp5plN/xGBzRvq59urhtuvEQ Tijr3GYEqpFxQ8llDCa750mqOvCeJF0cIY6yTlKECg/aGQx+KNmlQLD9Lm8sNvIe/bs4ZsN4no/z LtLNtP9MpM21Z3oS8Vn0a9f/nJPK2wURqoyGx9g4SgdmmZN9UIrZA3rgbuNX0UWNzmemk0efhYHC DX9uotjCOSYmT5cjMzUVEHKMn/X8KABO2goeTQNdI1EG+EVUaYJqYpTcp5NzS4Mhpx562gX3zhdW GosYTsfIJG6GQzCYmnAjx4wwmTP3EwJxMsKKSsFRWwD7o9frHsl4eJo58pUCgfN5jznuIfjv7Lbz /yU8ywW5qzt8JRPnbykEjPpiEXXPIl6JOsUo+DuMYe84eN5NuH7SiiQVB/U0DjAPfrzwK2Hw/JNP xuwjQC7mtjqSTK2jPUxaRwYhVzm2XeM05zMNQ9SfB54/0jq8YsYDD9wzKDUyvn2LA7cENY3tWluT 5GtpyqtW1sff3Z0lQjcsAlLLgaaqoioLdX2xQJOqtKy7RNtSg1XFIgBswzgukaSUll0iDAHBfDaG p5LdEvFVL3UifomR4G6ppA5F/do+2Kji59lieiO0H8HD9N3Xb8Ku/WGBHcogVCNbFnrTdD1J+M96 UmjAUwkHBQfNW+3Jd3hvxapjjPK2d8eV68juywtV61JWOjY6dvtd9j+hRgV8CmVuZHN0cmVhbQpl bmRvYmoKNSAwIG9iago8PCAKICAgL1RpdGxlIDxGRUZGMDA0RDAwNjkwMDYzMDA3MjAwNkYwMDcz MDA2RjAwNjYwMDc0MDAyMDAwNTcwMDZGMDA3MjAwNjQwMDIwMDAyRDAwMjAwMDQ3MDA2RjAwNkYw MDY3MDA2QzAwNjUwMDIwMDA0MTAwNkUwMDZFMDA2OTAwNzYwMDY1MDA3MjAwNzMwMDYxMDA3MjAw NzkwMDJFMDA2NDAwNkYwMDYzPgogICAvQXV0aG9yIDxGRUZGMDA1NTAwNTMwMDQ1MDA1Mj4KICAg L0NyZWF0b3IgPEZFRkYwMDREMDA2OTAwNjMwMDcyMDA2RjAwNzMwMDZGMDA2NjAwNzQwMDIwMDA1 NzAwNkYwMDcyMDA2NDAwMjAwMDJEMDAyMDAwNDcwMDZGMDA2RjAwNjcwMDZDMDA2NTAwMjAwMDQx MDA2RTAwNkUwMDY5MDA3NjAwNjUwMDcyMDA3MzAwNjEwMDcyMDA3OTAwMkUwMDY0MDA2RjAwNjM+ CiAgIC9Qcm9kdWNlciA8RkVGRjAwNjQwMDZGMDA1MDAwNDQwMDQ2MDAyMDAwNTYwMDY1MDA3MjAw MjAwMDM3MDAyRTAwMzEwMDIwMDA0MjAwNzUwMDY5MDA2QzAwNjQwMDIwMDAzMzAwMzIwMDM2MDAy MDAwMjgwMDU3MDA2OTAwNkUwMDY0MDA2RjAwNzcwMDczMDAyMDAwNTgwMDUwMDAyMDAwNTAwMDcy MDA2RjAwNjYwMDY1MDA3MzAwNzMwMDY5MDA2RjAwNkUwMDYxMDA2QzAwMjAwMDQ1MDA2NDAwNjkw MDc0MDA2OTAwNkYwMDZFMDAyMDAwMjAwMDI4MDA1MzAwNjUwMDcyMDA3NjAwNjkwMDYzMDA2NTAw MjAwMDUwMDA2MTAwNjMwMDZCMDAyMDAwMzMwMDI5MDAyMDAwMkQwMDIwMDA1NjAwNjUwMDcyMDA3 MzAwNjkwMDZGMDA2RTAwM0EwMDIwMDAzNTAwMkUwMDMxMDAyRTAwMzIwMDM2MDAzMDAwMzAwMDIw MDAyODAwNTAwMDZDMDA2MTAwNzQwMDY2MDA2RjAwNzIwMDZEMDAzQTAwMjAwMDc4MDAzODAwMzYw MDI5MDAyOT4KICAgL0NyZWF0aW9uRGF0ZSAoRDoyMDEyMDkxMzA2MzU1OCswMScwMCcpCj4+CmVu ZG9iago4IDAgb2JqCjw8IAogICAvTGVuZ3RoIDc2OAo+PgpzdHJlYW0KAAAA////veO9e9uEa9Nz WstaWqpj5+vv9/v/5+v/xtf/vc/vrcf3pb7v9/f/Y9NjQsNKIaopEJYYAH0IAGUAQo5C1tvdhKr3 WYHWMWXWIVnWGE3GGEm1EEW1Sn3nY5bvztPn7+/v7/fvnNOlObpCMbY5//f/9/f3//v/GFHOCDyl pbbW1tvnjMuMCFEIxsPG7+vv5+Pn9/Pvc6LvGEWtEDyUKUmUO1mTSmGUUm2tOXHelK7e5+fv9+v3 GKIhKV0xzsvOzs/O3tve5+fn9/P3KVG1Y3mklJ61xsfO1tPW3tvW1tfW2dfLxsfGtba9c47O59ve tba1vba92uX/tbrG3t/exr69vb69paat3t/nra6ttbK1WorvEDSEvbq9hJK1WnVaraatnJqcOWG1 CCRjc3mMraqlhIaUjJKUSVVzhH1ztbKtpaalnJ6cpaKlraqtWml8KUFrtcPee4at5+TelJKM//Pv 99fO97qt95aE94Zz96ac/8vG/+vn///v//ve//O1//eE999a9+fWa2lr92lS50kx3jAY1iQI5zwh 71lC1mVa78cp77oA/88A3suM7+vn7/L3hJrW3u/e7+fnxhgArRQAtSQQvSwY1q4Axp4AvZYAvZ4Q 3rpC/3VjxpKMxnVrzq6lzsfG3svG1ra1tY4ArY4QtaJjzsOltUUxtVlKzjwpjCAQ3uPnztXWnGVa 3tfW/+8xtaaMzq4plEExtaqlrZaM/+8IrYYAqpIxy87Wpa69zuvOnIZCaywhpYIAhHU5jBAAhGkA e01CawwApYZ7Y1EAe2VSlHkA7+OUpaqt//f3rbK1///399cp9/fv1tfe+fn58fHxycnJxcTBe5Z7 wsLDF0CaGHkhjK6M/f39qKenGTl/GC5h9PT04eHhuLWwCi13Kj5t19TRkpSaoqCgsrGyubi5mpuf 0tLSwL+/tLOylJOVm5mX2dnZ6urqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAACmVuZHN0cmVhbQplbmRvYmoKOSAwIG9iago8PCAKICAgL1R5cGUgL0ZvbnQK ICAgL1N1YnR5cGUgL1RydWVUeXBlCiAgIC9Gb250RGVzY3JpcHRvciAxMCAwIFIKICAgL0Jhc2VG b250IC9UaW1lc05ld1JvbWFuUFNNVAogICAvRmlyc3RDaGFyIDAKICAgL0xhc3RDaGFyIDI1NQog ICAvV2lkdGhzIDExIDAgUgogICAvRW5jb2RpbmcgL1dpbkFuc2lFbmNvZGluZwo+PgplbmRvYmoK MTAgMCBvYmoKPDwgCiAgIC9UeXBlIC9Gb250RGVzY3JpcHRvcgogICAvRm9udE5hbWUgL1RpbWVz TmV3Um9tYW5QU01UCiAgIC9Bc2NlbnQgNjkzCiAgIC9DYXBIZWlnaHQgNjkzCiAgIC9EZXNjZW50 IC0yMTYKICAgL0ZsYWdzIDMyCiAgIC9Gb250QkJveCBbLTU2OCAtMzA3IDIwMDAgMTAwN10KICAg L0l0YWxpY0FuZ2xlIDAKICAgL1N0ZW1WIDg3CiAgIC9YSGVpZ2h0IDQ1Nwo+PgplbmRvYmoKMTEg MCBvYmoKWzc3OCA3NzggNzc4IDc3OCA3NzggNzc4IDc3OCA3NzggNzc4IDc3OCA3NzggNzc4IDc3 OCA3NzggNzc4IDc3OCA3NzggNzc4IDc3OCA3NzggNzc4IDc3OCA3NzggNzc4IDc3OCA3NzggNzc4 IDc3OCA3NzggNzc4IDc3OCA3NzggMjUwIDMzMyA0MDggNTAwIDUwMCA4MzMgNzc4IDE4MCAzMzMg MzMzIDUwMCA1NjQgMjUwIDMzMyAyNTAgMjc4IDUwMCA1MDAgNTAwIDUwMCA1MDAgNTAwIDUwMCA1 MDAgNTAwIDUwMCAyNzggMjc4IDU2NCA1NjQgNTY0IDQ0NCA5MjEgNzIyIDY2NyA2NjcgNzIyIDYx MSA1NTYgNzIyIDcyMiAzMzMgMzg5IDcyMiA2MTEgODg5IDcyMiA3MjIgNTU2IDcyMiA2NjcgNTU2 IDYxMSA3MjIgNzIyIDk0NCA3MjIgNzIyIDYxMSAzMzMgMjc4IDMzMyA0NjkgNTAwIDMzMyA0NDQg NTAwIDQ0NCA1MDAgNDQ0IDMzMyA1MDAgNTAwIDI3OCAyNzggNTAwIDI3OCA3NzggNTAwIDUwMCA1 MDAgNTAwIDMzMyAzODkgMjc4IDUwMCA1MDAgNzIyIDUwMCA1MDAgNDQ0IDQ4MCAyMDAgNDgwIDU0 MSAzNTAgNTAwIDM1MCAzMzMgNTAwIDQ0NCAxMDAwIDUwMCA1MDAgMzMzIDEwMDAgNTU2IDMzMyA4 ODkgMzUwIDYxMSAzNTAgMzUwIDMzMyAzMzMgNDQ0IDQ0NCAzNTAgNTAwIDEwMDAgMzMzIDk4MCAz ODkgMzMzIDcyMiAzNTAgNDQ0IDcyMiAyNTAgMzMzIDUwMCA1MDAgNTAwIDUwMCAyMDAgNTAwIDMz MyA3NjAgMjc2IDUwMCA1NjQgMzMzIDc2MCA1MDAgNDAwIDU0OSAzMDAgMzAwIDMzMyA1MzYgNDUz IDI1MCAzMzMgMzAwIDMxMCA1MDAgNzUwIDc1MCA3NTAgNDQ0IDcyMiA3MjIgNzIyIDcyMiA3MjIg NzIyIDg4OSA2NjcgNjExIDYxMSA2MTEgNjExIDMzMyAzMzMgMzMzIDMzMyA3MjIgNzIyIDcyMiA3 MjIgNzIyIDcyMiA3MjIgNTY0IDcyMiA3MjIgNzIyIDcyMiA3MjIgNzIyIDU1NiA1MDAgNDQ0IDQ0 NCA0NDQgNDQ0IDQ0NCA0NDQgNjY3IDQ0NCA0NDQgNDQ0IDQ0NCA0NDQgMjc4IDI3OCAyNzggMjc4 IDUwMCA1MDAgNTAwIDUwMCA1MDAgNTAwIDUwMCA1NDkgNTAwIDUwMCA1MDAgNTAwIDUwMCA1MDAg NTAwIDUwMCBdCmVuZG9iagoxMiAwIG9iago8PCAKICAgL1R5cGUgL0ZvbnQKICAgL1N1YnR5cGUg L1RydWVUeXBlCiAgIC9Gb250RGVzY3JpcHRvciAxMyAwIFIKICAgL0Jhc2VGb250IC9BcmlhbFVu aWNvZGVNUyxCb2xkCiAgIC9GaXJzdENoYXIgMAogICAvTGFzdENoYXIgMjU1CiAgIC9XaWR0aHMg MTQgMCBSCiAgIC9FbmNvZGluZyAvV2luQW5zaUVuY29kaW5nCj4+CmVuZG9iagoxMyAwIG9iago8 PCAKICAgL1R5cGUgL0ZvbnREZXNjcmlwdG9yCiAgIC9Gb250TmFtZSAvQXJpYWxVbmljb2RlTVMs Qm9sZAogICAvQXNjZW50IDcyOAogICAvQ2FwSGVpZ2h0IDcyOAogICAvRGVzY2VudCAtMjEwCiAg IC9GbGFncyAyNjIxNzYKICAgL0ZvbnRCQm94IFstMTAxMSAtMzMwIDIyNjAgMTA3OF0KICAgL0l0 YWxpY0FuZ2xlIDAKICAgL1N0ZW1WIDE2NQogICAvWEhlaWdodCA0ODAKPj4KZW5kb2JqCjE0IDAg b2JqClsxMDAwIDEwMDAgMTAwMCAxMDAwIDEwMDAgMTAwMCAxMDAwIDEwMDAgMTAwMCAxMDAwIDEw MDAgMTAwMCAxMDAwIDEwMDAgMTAwMCAxMDAwIDEwMDAgMTAwMCAxMDAwIDEwMDAgMTAwMCAxMDAw IDEwMDAgMTAwMCAxMDAwIDEwMDAgMTAwMCAxMDAwIDEwMDAgMTAwMCAxMDAwIDEwMDAgMjc4IDI3 OCAzNTUgNTU2IDU1NiA4ODkgNjY3IDE5MSAzMzMgMzMzIDM4OSA1ODQgMjc4IDMzMyAyNzggMjc4 IDU1NiA1NTYgNTU2IDU1NiA1NTYgNTU2IDU1NiA1NTYgNTU2IDU1NiAyNzggMjc4IDU4NCA1ODQg NTg0IDU1NiAxMDE1IDY2NyA2NjcgNzIyIDcyMiA2NjcgNjExIDc3OCA3MjIgMjc4IDUwMCA2Njcg NTU2IDgzMyA3MjIgNzc4IDY2NyA3NzggNzIyIDY2NyA2MTEgNzIyIDY2NyA5NDQgNjY3IDY2NyA2 MTEgMjc4IDI3OCAyNzggNDY5IDUwMCAzMzMgNTU2IDU1NiA1MDAgNTU2IDU1NiAyNzggNTU2IDU1 NiAyMjIgMjIyIDUwMCAyMjIgODMzIDU1NiA1NTYgNTU2IDU1NiAzMzMgNTAwIDI3OCA1NTYgNTAw IDcyMiA1MDAgNTAwIDUwMCAzMzQgMjYwIDMzNCA1ODQgMzUwIDU1NiAzNTAgMjIyIDI3OCAzMzMg MTAwMCA1NTYgNTU2IDMzMyAxMDAwIDY2NyAzMzMgMTAwMCAzNTAgNjExIDM1MCAzNTAgMjIyIDIy MiAzMzMgMzMzIDM1MCA1MDAgMTAwMCAzMzMgMTAwMCA1MDAgMzMzIDk0NCAzNTAgNTAwIDY2NyAy NzggMzMzIDU1NiA1NTYgNTU2IDU1NiAyNjAgNTU2IDMzMyA3MzcgMzcwIDU1NiA1ODQgMzMzIDcz NyA1MDAgNDAwIDU4NCAzMzMgMzMzIDMzMyA1NTMgNTM3IDI3OCAzMzMgMzMzIDM2NSA1NTYgODM0 IDgzNCA4MzQgNjExIDY2NyA2NjcgNjY3IDY2NyA2NjcgNjY3IDEwMDAgNzIyIDY2NyA2NjcgNjY3 IDY2NyAyNzggMjc4IDI3OCAyNzggNzIyIDcyMiA3NzggNzc4IDc3OCA3NzggNzc4IDU4NCA3Nzgg NzIyIDcyMiA3MjIgNzIyIDY2NyA2NjcgNjExIDU1NiA1NTYgNTU2IDU1NiA1NTYgNTU2IDg4OSA1 MDAgNTU2IDU1NiA1NTYgNTU2IDI3OCAyNzggMjc4IDI3OCA1NTYgNTU2IDU1NiA1NTYgNTU2IDU1 NiA1NTYgNTg0IDYxMSA1NTYgNTU2IDU1NiA1NTYgNTAwIDU1NiA1MDAgXQplbmRvYmoKMTUgMCBv YmoKPDwgCiAgIC9UeXBlIC9Gb250CiAgIC9TdWJ0eXBlIC9UcnVlVHlwZQogICAvRm9udERlc2Ny aXB0b3IgMTYgMCBSCiAgIC9CYXNlRm9udCAvVGFob21hCiAgIC9GaXJzdENoYXIgMAogICAvTGFz dENoYXIgMjU1CiAgIC9XaWR0aHMgMTcgMCBSCiAgIC9FbmNvZGluZyAvV2luQW5zaUVuY29kaW5n Cj4+CmVuZG9iagoxNiAwIG9iago8PCAKICAgL1R5cGUgL0ZvbnREZXNjcmlwdG9yCiAgIC9Gb250 TmFtZSAvVGFob21hCiAgIC9Bc2NlbnQgNzY1CiAgIC9DYXBIZWlnaHQgNzY1CiAgIC9EZXNjZW50 IC0yMDcKICAgL0ZsYWdzIDMyCiAgIC9Gb250QkJveCBbLTYwMCAtMjA3IDEzMzggMTAzNF0KICAg L0l0YWxpY0FuZ2xlIDAKICAgL1N0ZW1WIDg3CiAgIC9YSGVpZ2h0IDUwNAo+PgplbmRvYmoKMTcg MCBvYmoKWzEwMDAgMTAwMCAxMDAwIDEwMDAgMTAwMCAxMDAwIDEwMDAgMTAwMCAxMDAwIDEwMDAg MTAwMCAxMDAwIDEwMDAgMTAwMCAxMDAwIDEwMDAgMTAwMCAxMDAwIDEwMDAgMTAwMCAxMDAwIDEw MDAgMTAwMCAxMDAwIDEwMDAgMTAwMCAxMDAwIDEwMDAgMTAwMCAxMDAwIDEwMDAgMTAwMCAzMTMg MzMyIDQwMSA3MjggNTQ2IDk3NyA2NzQgMjExIDM4MyAzODMgNTQ2IDcyOCAzMDMgMzYzIDMwMyAz ODIgNTQ2IDU0NiA1NDYgNTQ2IDU0NiA1NDYgNTQ2IDU0NiA1NDYgNTQ2IDM1NCAzNTQgNzI4IDcy OCA3MjggNDc0IDkwOSA2MDAgNTg5IDYwMSA2NzggNTYxIDUyMSA2NjcgNjc1IDM3MyA0MTcgNTg4 IDQ5OCA3NzEgNjY3IDcwOCA1NTEgNzA4IDYyMSA1NTcgNTg0IDY1NiA1OTcgOTAyIDU4MSA1NzYg NTU5IDM4MyAzODIgMzgzIDcyOCA1NDYgNTQ2IDUyNSA1NTMgNDYxIDU1MyA1MjYgMzE4IDU1MyA1 NTggMjI5IDI4MiA0OTggMjI5IDg0MCA1NTggNTQzIDU1MyA1NTMgMzYwIDQ0NiAzMzQgNTU4IDQ5 OCA3NDIgNDk1IDQ5OCA0NDQgNDgwIDM4MiA0ODAgNzI4IDQ1NSA1NDYgNDU1IDIxMSA1NDYgMzk3 IDgxNyA1NDYgNTQ2IDU0NiAxMzkxIDU1NyAzODMgOTc3IDQ1NSA1NTkgNDU1IDQ1NSAyMTEgMjEx IDQwMSA0MDEgNDU1IDU0NiA5MDkgNTQ2IDg3NiA0NDYgMzgzIDkwOSA0NTUgNDQ0IDU3NiAzMTMg MzMyIDU0NiA1NDYgNTQ2IDU0NiAzODIgNTQ2IDU0NiA5MjkgNDkzIDU3MyA3MjggMzYzIDkyOSA1 NDYgNDcxIDcyOCA0OTMgNDkzIDU0NiA1NjggNTQ2IDM1NCA1NDYgNDkzIDQ5MyA1NzMgMTAwMCAx MDAwIDEwMDAgNDc0IDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDkxMyA2MDEgNTYxIDU2MSA1NjEg NTYxIDM3MyAzNzMgMzczIDM3MyA2OTggNjY3IDcwOCA3MDggNzA4IDcwOCA3MDggNzI4IDcwOCA2 NTYgNjU2IDY1NiA2NTYgNTc2IDU2NSA1NDggNTI1IDUyNSA1MjUgNTI1IDUyNSA1MjUgODgwIDQ2 MSA1MjYgNTI2IDUyNiA1MjYgMjI5IDIyOSAyMjkgMjI5IDU0NiA1NTggNTQzIDU0MyA1NDMgNTQz IDU0MyA3MjggNTQzIDU1OCA1NTggNTU4IDU1OCA0OTggNTUzIDQ5OCBdCmVuZG9iagp4cmVmCjAg MjEgCjAwMDAwMDAwMDAgNjU1MzUgZiAKMDAwMDAyMDIxNCAwMDAwMCBuIAowMDAwMDIwMzE4IDAw MDAwIG4gCjAwMDAwMTIxNDAgMDAwMDAgbiAKMDAwMDAxMjM5MyAwMDAwMCBuIAowMDAwMDIyMDY1 IDAwMDAwIG4gCjAwMDAwMDAwMTUgMDAwMDAgbiAKMDAwMDAwNDc2MCAwMDAwMCBuIAowMDAwMDIy OTc2IDAwMDAwIG4gCjAwMDAwMjM3OTkgMDAwMDAgbiAKMDAwMDAyMzk5NyAwMDAwMCBuIAowMDAw MDI0MjIyIDAwMDAwIG4gCjAwMDAwMjUyNjggMDAwMDAgbiAKMDAwMDAyNTQ2OSAwMDAwMCBuIAow MDAwMDI1NzAyIDAwMDAwIG4gCjAwMDAwMjY3ODQgMDAwMDAgbiAKMDAwMDAyNjk3MiAwMDAwMCBu IAowMDAwMDI3MTg2IDAwMDAwIG4gCjAwMDAwMjAzOTMgMDAwMDAgbiAKMDAwMDAyMDYzNCAwMDAw MCBuIAowMDAwMDE1NDY4IDAwMDAwIG4gCnRyYWlsZXIKPDwgCiAgIC9Sb290IDEgMCBSCiAgIC9J bmZvIDUgMCBSCiAgIC9TaXplIDIxCj4+CnN0YXJ0eHJlZgoyODI2NQolJUVPRgo= ------=_Part_4827027_60015941.1347535063502-- From cmaiolino@redhat.com Thu Sep 13 09:21:27 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8DELQcp168655 for ; Thu, 13 Sep 2012 09:21:27 -0500 X-ASG-Debug-ID: 1347546153-04bdf0067c13ddd0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id hGoVBkbR5IVVeM5w for ; Thu, 13 Sep 2012 07:22:33 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8DEMWFW015567 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 13 Sep 2012 10:22:33 -0400 Received: from andromeda.usersys.redhat.com (ovpn-113-109.phx2.redhat.com [10.3.113.109]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id q8DEMTdQ024866 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO) for ; Thu, 13 Sep 2012 10:22:32 -0400 Date: Thu, 13 Sep 2012 11:22:29 -0300 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: Re: userspace trees Message-ID: <20120913142229.GA4382@andromeda.usersys.redhat.com> X-ASG-Orig-Subj: Re: userspace trees Mail-Followup-To: xfs@oss.sgi.com References: <20120913075026.GA27256@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20120913075026.GA27256@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1347546153 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com On Thu, Sep 13, 2012 at 03:50:26AM -0400, Christoph Hellwig wrote: > It seems with the kernel.org account purge last year and me being way to > busy it seems like the -dev trees of the XFS userspace get very little > attention. What do people think about retiring them and using the oss > trees exclusively again for now? Right now the trees are getting a bit > out of sync which isn't a good thing. > Maintaining oss only looks easier to me and less error prone (in regards on keep trees synchronized) than still keep the kernel.org xfs tree. To be honest I've never used the kernel.org xfs trees, so, at least for me this makes sense. -- --Carlos From tinguely@sgi.com Thu Sep 13 10:29:14 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8DFTEiR175451 for ; Thu, 13 Sep 2012 10:29:14 -0500 Received: from [128.162.232.125] (eagdhcp-232-125.americas.sgi.com [128.162.232.125]) by relay1.corp.sgi.com (Postfix) with ESMTP id F32208F8049; Thu, 13 Sep 2012 08:30:17 -0700 (PDT) Message-ID: <5051FBFF.5080507@sgi.com> Date: Thu, 13 Sep 2012 10:30:07 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Mike Frysinger CC: xfs@oss.sgi.com Subject: Re: [PATCH] libxcmd: link against readline References: <1345936050-15139-1-git-send-email-vapier@gentoo.org> In-Reply-To: <1345936050-15139-1-git-send-email-vapier@gentoo.org> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 08/25/12 18:07, Mike Frysinger wrote: > This library uses readline funcs (the input.c file), so we need to link > this shared library against it. > > URL: https://bugs.gentoo.org/432644 > Reported-by: David Badia > Signed-off-by: Mike Frysinger > --- > libxcmd/Makefile | 2 ++ > 1 file changed, 2 insertions(+) > > diff --git a/libxcmd/Makefile b/libxcmd/Makefile > index b3544f4..ce082a5 100644 > --- a/libxcmd/Makefile > +++ b/libxcmd/Makefile > @@ -22,10 +22,12 @@ endif > > ifeq ($(ENABLE_READLINE),yes) > LCFLAGS += -DENABLE_READLINE > +LTLIBS += $(LIBREADLINE) $(LIBTERMCAP) > endif > > ifeq ($(ENABLE_EDITLINE),yes) > LCFLAGS += -DENABLE_EDITLINE > +LTLIBS += $(LIBEDITLINE) $(LIBTERMCAP) > endif > > default: ltdepend $(LTLIBRARY) Looks good. Reviewed-by: Mark Tinguely From bpm@sgi.com Thu Sep 13 11:42:41 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8DGgfoB184063 for ; Thu, 13 Sep 2012 11:42:41 -0500 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay3.corp.sgi.com (Postfix) with ESMTP id 970F5AC00C; Thu, 13 Sep 2012 09:43:44 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 3F1C54266DC; Thu, 13 Sep 2012 11:43:44 -0500 (CDT) Date: Thu, 13 Sep 2012 11:43:44 -0500 From: Ben Myers To: Dave Chinner Cc: Christoph Hellwig , Mark Tinguely , xfs@oss.sgi.com Subject: Re: xfs: stop the sync worker before xfs_unmountfs Message-ID: <20120913164344.GV25175@sgi.com> References: <20120829134624.316257238@sgi.com> <20120829134628.835024558@sgi.com> <20120830002335.GB15292@dastard> <20120830172549.GG3274@sgi.com> <20120830223504.GE15292@dastard> <5040FF25.1010501@sgi.com> <20120901230824.GB6896@infradead.org> <20120912183347.GO3274@sgi.com> <20120912231406.GJ11511@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20120912231406.GJ11511@dastard> User-Agent: Mutt/1.5.20 (2009-06-14) Hi Dave, On Thu, Sep 13, 2012 at 09:14:06AM +1000, Dave Chinner wrote: > On Wed, Sep 12, 2012 at 01:33:47PM -0500, Ben Myers wrote: > > See what you think of this. Not heavily tested yet, and not pretty... but it > > is fairly minimal. > .... > > Signed-off-by: Ben Myers > > > > Index: xfs/fs/xfs/xfs_super.c > > =================================================================== > > --- xfs.orig/fs/xfs/xfs_super.c > > +++ xfs/fs/xfs/xfs_super.c > > @@ -919,6 +919,7 @@ xfs_fs_put_super( > > struct xfs_mount *mp = XFS_M(sb); > > > > xfs_filestream_unmount(mp); > > + cancel_delayed_work_sync(&mp->m_sync_work); > > xfs_unmountfs(mp); > > xfs_syncd_stop(mp); > > xfs_freesb(mp); > > This is the only hunk in the patch needed to fix the problem. > > The rest of the patch does not change the order in which the sync > worker is started and stopped - it just open codes it next to the > xfs_syncd_start/stop calls. Essentially, all it does is obfuscate > the real fix that is being made here and makes it harder to > understand what the relationship between xfs_sync_worker() and > xfs_syncd_start/stop is supposed to be. > > So a minimal patch, IMO, is just the above hunk.... Ah, you're right. I was working on the assumption that it is best not to cancel the work twice. There really is no harm in cancel_delayed_work_sync both in xfs_fs_put_super and in xfs_syncd_stop. However, we don't want them spread around willy nilly. That can become obfuscatory too. I suggest we should remove the cancel_delayed_work_sync(&mp->m_sync_work) in xfs_log_unmount, leftover from commit 11159a05. It seems like that one hasn't been effective. Maybe we don't want to do that in this patch... I'll just add a comment and repost. Thanks, Ben From sandeen@sandeen.net Thu Sep 13 12:12:10 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8DHCAsP187948 for ; Thu, 13 Sep 2012 12:12:10 -0500 X-ASG-Debug-ID: 1347556396-04bdf0067d150e20001-NocioJ Received: from mail.sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 0qmDwb0w6GerQLHb for ; Thu, 13 Sep 2012 10:13:16 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) (Authenticated sender: sandeen) by mail.sandeen.net (Postfix) with ESMTP id 2BAF54964602; Thu, 13 Sep 2012 12:13:16 -0500 (CDT) Message-ID: <5052142B.3010601@sandeen.net> Date: Thu, 13 Sep 2012 12:13:15 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20120824 Thunderbird/15.0 MIME-Version: 1.0 To: Christoph Hellwig CC: xfs@oss.sgi.com Subject: Re: userspace trees References: <20120913075026.GA27256@infradead.org> X-ASG-Orig-Subj: Re: userspace trees In-Reply-To: <20120913075026.GA27256@infradead.org> X-Enigmail-Version: 1.4.4 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1347556396 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108437 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 9/13/12 2:50 AM, Christoph Hellwig wrote: > It seems with the kernel.org account purge last year and me being way to > busy it seems like the -dev trees of the XFS userspace get very little > attention. What do people think about retiring them and using the oss > trees exclusively again for now? Right now the trees are getting a bit > out of sync which isn't a good thing. ISTR it was done in response to a .... fear of SGI being less responsive after a different type of account purge. ;) If SGI wants to be responsible for merging all userspace patches as they come in on the list, I'm fine with going back to one tree on oss. -Eric From bpm@sgi.com Thu Sep 13 12:52:14 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8DHqEB3193374 for ; Thu, 13 Sep 2012 12:52:14 -0500 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay3.corp.sgi.com (Postfix) with ESMTP id 4FF9AAC00C; Thu, 13 Sep 2012 10:53:17 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id F1C264266DC; Thu, 13 Sep 2012 12:53:16 -0500 (CDT) Date: Thu, 13 Sep 2012 12:53:16 -0500 From: Ben Myers To: Eric Sandeen Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: userspace trees Message-ID: <20120913175316.GR3274@sgi.com> References: <20120913075026.GA27256@infradead.org> <5052142B.3010601@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5052142B.3010601@sandeen.net> User-Agent: Mutt/1.5.20 (2009-06-14) Hi Eric, On Thu, Sep 13, 2012 at 12:13:15PM -0500, Eric Sandeen wrote: > On 9/13/12 2:50 AM, Christoph Hellwig wrote: > > It seems with the kernel.org account purge last year and me being way to > > busy it seems like the -dev trees of the XFS userspace get very little > > attention. What do people think about retiring them and using the oss > > trees exclusively again for now? Right now the trees are getting a bit > > out of sync which isn't a good thing. > > ISTR it was done in response to a .... fear of SGI being less responsive after > a different type of account purge. ;) > > If SGI wants to be responsible for merging all userspace patches as they > come in on the list, I'm fine with going back to one tree on oss. I discussed this with management. SGI is willing to take on the responsibility of merging all userspace patches. I think retiring the -dev trees will resolve the out-of-sync issues we've been having, and be less confusing for all involved. Regards, Ben From sandeen@sandeen.net Thu Sep 13 12:53:17 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8DHrGbP193553 for ; Thu, 13 Sep 2012 12:53:17 -0500 X-ASG-Debug-ID: 1347558862-04cb6c5686140750001-NocioJ Received: from mail.sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id yDvYT9lJfV2kH54A for ; Thu, 13 Sep 2012 10:54:22 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) (Authenticated sender: sandeen) by mail.sandeen.net (Postfix) with ESMTP id CB8DF4964601; Thu, 13 Sep 2012 12:54:22 -0500 (CDT) Message-ID: <50521DCE.7020203@sandeen.net> Date: Thu, 13 Sep 2012 12:54:22 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20120824 Thunderbird/15.0 MIME-Version: 1.0 To: Ben Myers CC: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: userspace trees References: <20120913075026.GA27256@infradead.org> <5052142B.3010601@sandeen.net> <20120913175316.GR3274@sgi.com> X-ASG-Orig-Subj: Re: userspace trees In-Reply-To: <20120913175316.GR3274@sgi.com> X-Enigmail-Version: 1.4.4 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1347558862 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108441 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 9/13/12 12:53 PM, Ben Myers wrote: > Hi Eric, > > On Thu, Sep 13, 2012 at 12:13:15PM -0500, Eric Sandeen wrote: >> On 9/13/12 2:50 AM, Christoph Hellwig wrote: >>> It seems with the kernel.org account purge last year and me being way to >>> busy it seems like the -dev trees of the XFS userspace get very little >>> attention. What do people think about retiring them and using the oss >>> trees exclusively again for now? Right now the trees are getting a bit >>> out of sync which isn't a good thing. >> >> ISTR it was done in response to a .... fear of SGI being less responsive after >> a different type of account purge. ;) >> >> If SGI wants to be responsible for merging all userspace patches as they >> come in on the list, I'm fine with going back to one tree on oss. > > I discussed this with management. SGI is willing to take on the responsibility > of merging all userspace patches. > > I think retiring the -dev trees will resolve the out-of-sync issues we've been > having, and be less confusing for all involved. Sounds like a plan. Will you make sure everything gets re-synced from kernel.org so nothing is lost? hch, you want to remove or somehow deprecate the kernel.org trees? Thanks, -Eric > Regards, > Ben > From tinguely@sgi.com Thu Sep 13 13:31:54 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8DIVs2Y199335 for ; Thu, 13 Sep 2012 13:31:54 -0500 Received: from [128.162.232.125] (eagdhcp-232-125.americas.sgi.com [128.162.232.125]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5ECF730404E; Thu, 13 Sep 2012 11:32:58 -0700 (PDT) Message-ID: <505226CF.2030608@sgi.com> Date: Thu, 13 Sep 2012 13:32:47 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [RFC, PATCH 0/102]: xfs: 3.0.x stable kernel update References: <1345698180-13612-1-git-send-email-david@fromorbit.com> In-Reply-To: <1345698180-13612-1-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 08/23/12 00:01, Dave Chinner wrote: > For all the XFS developers that have copious amounts of free time > available, I'd appreciate an eye run over the patch list to see if > there's any potential bug fixes that I missed or have made glaring > errors in backporting. Some of the fixes are dependent on cleanups I > haven't included, so some of the patches are a bit different to what > is in mainline (e.g. anything that touches setattr). Most important > to look at is probably the inode i_size changes and the logging of > all metadata changes. I think Brian Foster's log hang patch would be a good candidate: xfs: check for stale inode before acquiring iflock on push http://oss.sgi.com/archives/xfs/2012-06/msg00134.html This hang can happen in Linux 2.6.x version of XFS. Thanks for the work. --Mark. From bpm@sgi.com Thu Sep 13 15:09:27 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8DK9QU0211672 for ; Thu, 13 Sep 2012 15:09:27 -0500 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay3.corp.sgi.com (Postfix) with ESMTP id 0957DAC008; Thu, 13 Sep 2012 13:10:29 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id A6CDB4266DC; Thu, 13 Sep 2012 15:10:29 -0500 (CDT) Date: Thu, 13 Sep 2012 15:10:29 -0500 From: Ben Myers To: Eric Sandeen Cc: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: userspace trees Message-ID: <20120913201029.GZ25175@sgi.com> References: <20120913075026.GA27256@infradead.org> <5052142B.3010601@sandeen.net> <20120913175316.GR3274@sgi.com> <50521DCE.7020203@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50521DCE.7020203@sandeen.net> User-Agent: Mutt/1.5.20 (2009-06-14) Hey Eric & Christoph, On Thu, Sep 13, 2012 at 12:54:22PM -0500, Eric Sandeen wrote: > On 9/13/12 12:53 PM, Ben Myers wrote: > > Hi Eric, > > > > On Thu, Sep 13, 2012 at 12:13:15PM -0500, Eric Sandeen wrote: > >> On 9/13/12 2:50 AM, Christoph Hellwig wrote: > >>> It seems with the kernel.org account purge last year and me being way to > >>> busy it seems like the -dev trees of the XFS userspace get very little > >>> attention. What do people think about retiring them and using the oss > >>> trees exclusively again for now? Right now the trees are getting a bit > >>> out of sync which isn't a good thing. > >> > >> ISTR it was done in response to a .... fear of SGI being less responsive after > >> a different type of account purge. ;) > >> > >> If SGI wants to be responsible for merging all userspace patches as they > >> come in on the list, I'm fine with going back to one tree on oss. > > > > I discussed this with management. SGI is willing to take on the responsibility > > of merging all userspace patches. > > > > I think retiring the -dev trees will resolve the out-of-sync issues we've been > > having, and be less confusing for all involved. > > Sounds like a plan. Will you make sure everything gets re-synced from kernel.org > so nothing is lost? ~/dmapi$ git pull korg master >From git://git.kernel.org/pub/scm/fs/xfs/dmapi-dev * branch master -> FETCH_HEAD Already up-to-date. ~/xfsdump$ git pull korg master >From git://git.kernel.org/pub/scm/fs/xfs/xfsdump-dev * branch master -> FETCH_HEAD Already up-to-date. ~/xfsprogs$ git pull kernel.org master >From git://git.kernel.org/pub/scm/fs/xfs/xfsprogs-dev * branch master -> FETCH_HEAD Updating a8decaf..7db1e7b Fast-forward db/bmap.c | 4 ++-- db/btblock.c | 11 ----------- mkfs/xfs_mkfs.c | 15 +++++++++------ repair/bmap.c | 28 ++++++++++++++++++++++++---- repair/dir2.c | 6 +++++- 5 files changed, 40 insertions(+), 24 deletions(-) I've brought xfsprogs master branch uptodate here git://oss.sgi.com/xfs/cmds/xfsprogs.git ~/xfstests # git pull korg master >From git://git.kernel.org/pub/scm/fs/xfs/xfstests-dev * branch master -> FETCH_HEAD Auto-merging group CONFLICT (content): Merge conflict in group Auto-merging 285.out CONFLICT (add/add): Merge conflict in 285.out Auto-merging 285 CONFLICT (add/add): Merge conflict in 285 Automatic merge failed; fix conflicts and then commit the result. I've merged and brought xfstests master branch uptodate here git://oss.sgi.com/xfs/cmds/xfstests.git Did I miss anything? Any other branches to copy over? Thanks, Ben From tinguely@sgi.com Thu Sep 13 15:11:24 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8DKBOZT211901 for ; Thu, 13 Sep 2012 15:11:24 -0500 Received: from [128.162.232.125] (eagdhcp-232-125.americas.sgi.com [128.162.232.125]) by relay2.corp.sgi.com (Postfix) with ESMTP id 0D26A304039; Thu, 13 Sep 2012 13:12:28 -0700 (PDT) Message-ID: <50523E20.5000508@sgi.com> Date: Thu, 13 Sep 2012 15:12:16 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Mel Gorman CC: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: [PATCH 020/102] xfs: warn if direct reclaim tries to writeback pages References: <1345698180-13612-1-git-send-email-david@fromorbit.com> <1345698180-13612-21-git-send-email-david@fromorbit.com> <20120827181742.GA13970@infradead.org> <20120905113242.GL11266@suse.de> In-Reply-To: <20120905113242.GL11266@suse.de> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/05/12 06:32, Mel Gorman wrote: > On Mon, Aug 27, 2012 at 02:17:42PM -0400, Christoph Hellwig wrote: >> On Thu, Aug 23, 2012 at 03:01:38PM +1000, Dave Chinner wrote: >>> From: Mel Gorman >>> >>> Upstream commit: 94054fa3fca1fd78db02cb3d68d5627120f0a1d4 >>> >>> Direct reclaim should never writeback pages. For now, handle the >>> situation and warn about it. Ultimately, this will be a BUG_ON. >> >> Is this actually the case on 3.0-stable? >> > > No, it is not. AFAIK, 3.0-stable does not contain [ee72886d: mm: vmscan: > do not writeback filesystem pages in direct reclaim] which is the absolute > minimum required for commit [94054fa3: xfs: warn if direct reclaim tries > to writeback pages] to make sense. > I hit this warning testing on a linux-30.42 with a x86_64. WARNING: at fs/xfs/linux-2.6/xfs_aops.c:961 xfs_vm_writepage+0x63c/0x6a0() Hardware name: S2721-533 Thunder i7501 Pro Modules linked in: ext4 jbd2 crc16 Pid: 12122, comm: cp Not tainted 3.0.42 #2 Call Trace: [] ? printk+0x18/0x1a [] warn_slowpath_common+0x6d/0xa0 [] ? xfs_vm_writepage+0x63c/0x6a0 [] ? xfs_vm_writepage+0x63c/0x6a0 [] warn_slowpath_null+0x1d/0x20 [] xfs_vm_writepage+0x63c/0x6a0 [] ? call_rcu_sched+0xd/0x10 [] ? radix_tree_delete+0x1cc/0x280 [] ? free_buffer_head+0x23/0x30 [] ? try_to_free_buffers+0x5a/0x90 [] shrink_page_list+0x542/0x750 [] ? __mod_zone_page_state+0x54/0x60 [] shrink_inactive_list+0x190/0x360 [] shrink_zone+0x410/0x580 [] do_try_to_free_pages+0x100/0x360 [] try_to_free_pages+0x89/0x120 [] __alloc_pages_nodemask+0x3eb/0x650 [] new_slab+0x4c/0x1a0 [] __slab_alloc.constprop.65+0xed/0x1d5 [] ? getname_flags+0x26/0x150 [] kmem_cache_alloc+0x11b/0x130 [] ? tick_dev_program_event+0x3f/0x160 [] ? getname_flags+0x26/0x150 [] getname_flags+0x26/0x150 [] ? tick_program_event+0x1c/0x30 [] user_path_at_empty+0x1f/0x80 [] ? rcu_irq_exit+0x8/0x10 [] ? irq_exit+0x37/0x90 [] ? smp_apic_timer_interrupt+0x54/0x90 [] user_path_at+0x1a/0x20 [] vfs_fstatat+0x4e/0x80 [] vfs_lstat+0x1b/0x20 [] sys_lstat64+0x11/0x30 [] ? filp_close+0x4f/0x70 [] ? sys_close+0x57/0xa0 [] syscall_call+0x7/0xb From sandeen@sandeen.net Thu Sep 13 15:11:59 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8DKBxoF212017 for ; Thu, 13 Sep 2012 15:11:59 -0500 X-ASG-Debug-ID: 1347567185-04cb6c568614b0d0001-NocioJ Received: from mail.sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id jRmefg6m2dVMcC9n for ; Thu, 13 Sep 2012 13:13:05 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) (Authenticated sender: sandeen) by mail.sandeen.net (Postfix) with ESMTP id E12AC4964602; Thu, 13 Sep 2012 15:13:04 -0500 (CDT) Message-ID: <50523E50.6020105@sandeen.net> Date: Thu, 13 Sep 2012 15:13:04 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20120824 Thunderbird/15.0 MIME-Version: 1.0 To: Ben Myers CC: Christoph Hellwig , xfs@oss.sgi.com Subject: Re: userspace trees References: <20120913075026.GA27256@infradead.org> <5052142B.3010601@sandeen.net> <20120913175316.GR3274@sgi.com> <50521DCE.7020203@sandeen.net> <20120913201029.GZ25175@sgi.com> X-ASG-Orig-Subj: Re: userspace trees In-Reply-To: <20120913201029.GZ25175@sgi.com> X-Enigmail-Version: 1.4.4 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1347567185 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108449 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 9/13/12 3:10 PM, Ben Myers wrote: > Hey Eric & Christoph, > > On Thu, Sep 13, 2012 at 12:54:22PM -0500, Eric Sandeen wrote: >> On 9/13/12 12:53 PM, Ben Myers wrote: >>> Hi Eric, >>> >>> On Thu, Sep 13, 2012 at 12:13:15PM -0500, Eric Sandeen wrote: >>>> On 9/13/12 2:50 AM, Christoph Hellwig wrote: >>>>> It seems with the kernel.org account purge last year and me being way to >>>>> busy it seems like the -dev trees of the XFS userspace get very little >>>>> attention. What do people think about retiring them and using the oss >>>>> trees exclusively again for now? Right now the trees are getting a bit >>>>> out of sync which isn't a good thing. >>>> >>>> ISTR it was done in response to a .... fear of SGI being less responsive after >>>> a different type of account purge. ;) >>>> >>>> If SGI wants to be responsible for merging all userspace patches as they >>>> come in on the list, I'm fine with going back to one tree on oss. >>> >>> I discussed this with management. SGI is willing to take on the responsibility >>> of merging all userspace patches. >>> >>> I think retiring the -dev trees will resolve the out-of-sync issues we've been >>> having, and be less confusing for all involved. >> >> Sounds like a plan. Will you make sure everything gets re-synced from kernel.org >> so nothing is lost? > > ~/dmapi$ git pull korg master > From git://git.kernel.org/pub/scm/fs/xfs/dmapi-dev > * branch master -> FETCH_HEAD > Already up-to-date. > > ~/xfsdump$ git pull korg master > From git://git.kernel.org/pub/scm/fs/xfs/xfsdump-dev > * branch master -> FETCH_HEAD > Already up-to-date. > > ~/xfsprogs$ git pull kernel.org master > From git://git.kernel.org/pub/scm/fs/xfs/xfsprogs-dev > * branch master -> FETCH_HEAD > Updating a8decaf..7db1e7b > Fast-forward > db/bmap.c | 4 ++-- > db/btblock.c | 11 ----------- > mkfs/xfs_mkfs.c | 15 +++++++++------ > repair/bmap.c | 28 ++++++++++++++++++++++++---- > repair/dir2.c | 6 +++++- > 5 files changed, 40 insertions(+), 24 deletions(-) > > I've brought xfsprogs master branch uptodate here > git://oss.sgi.com/xfs/cmds/xfsprogs.git > > ~/xfstests # git pull korg master > From git://git.kernel.org/pub/scm/fs/xfs/xfstests-dev > * branch master -> FETCH_HEAD > Auto-merging group > CONFLICT (content): Merge conflict in group > Auto-merging 285.out > CONFLICT (add/add): Merge conflict in 285.out > Auto-merging 285 > CONFLICT (add/add): Merge conflict in 285 > Automatic merge failed; fix conflicts and then commit the result. > > I've merged and brought xfstests master branch uptodate here > git://oss.sgi.com/xfs/cmds/xfstests.git > > Did I miss anything? Any other branches to copy over? I've not done anything except with the master branch. -Eric > Thanks, > Ben > From sekharan@us.ibm.com Thu Sep 13 15:36:37 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8DKabYi215122 for ; Thu, 13 Sep 2012 15:36:37 -0500 X-ASG-Debug-ID: 1347568662-04bdf0067d15fca0001-NocioJ Received: from e7.ny.us.ibm.com (e7.ny.us.ibm.com [32.97.182.137]) by cuda.sgi.com with ESMTP id N6oQipncSXFjqfa3 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 13 Sep 2012 13:37:43 -0700 (PDT) X-Barracuda-Envelope-From: sekharan@us.ibm.com X-Barracuda-Apparent-Source-IP: 32.97.182.137 X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.137] Received: from /spool/local by e7.ny.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Thu, 13 Sep 2012 16:37:41 -0400 X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.137] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.137] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.137] X-Barracuda-IPDD: Level2 [us.ibm.com/32.97.182.137] Received: from d01relay04.pok.ibm.com (9.56.227.236) by e7.ny.us.ibm.com (192.168.1.107) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Thu, 13 Sep 2012 16:37:38 -0400 Received: from d01av02.pok.ibm.com (d01av02.pok.ibm.com [9.56.224.216]) by d01relay04.pok.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id q8DKbYxm122910 for ; Thu, 13 Sep 2012 16:37:35 -0400 Received: from d01av02.pok.ibm.com (loopback [127.0.0.1]) by d01av02.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id q8DKbX3V012311 for ; Thu, 13 Sep 2012 17:37:34 -0300 Received: from [9.41.105.103] (chandra-lucid.austin.ibm.com [9.41.105.103]) by d01av02.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id q8DKbWom012252; Thu, 13 Sep 2012 17:37:32 -0300 Subject: Re: [RFC v6 PATCH 1/5] xfs: Remove incore use of XFS_OQUOTA_ENFD and XFS_OQUOTA_CHKD From: Chandra Seetharaman X-ASG-Orig-Subj: Re: [RFC v6 PATCH 1/5] xfs: Remove incore use of XFS_OQUOTA_ENFD and XFS_OQUOTA_CHKD Reply-To: sekharan@us.ibm.com To: Christoph Hellwig Cc: xfs@oss.sgi.com In-Reply-To: <20120913075613.GA32120@infradead.org> References: <20120720230202.20477.69766.sendpatchset@chandra-lucid.austin.ibm.com> <20120720230208.20477.49663.sendpatchset@chandra-lucid.austin.ibm.com> <20120814224645.GQ2877@dastard> <1345676002.2260.0.camel@chandra-lucid.austin.ibm.com> <20120913075613.GA32120@infradead.org> Content-Type: text/plain; charset="UTF-8" Organization: IBM Date: Thu, 13 Sep 2012 15:37:31 -0500 Message-ID: <1347568651.2191.4720.camel@chandra-lucid.austin.ibm.com> Mime-Version: 1.0 X-Mailer: Evolution 2.28.3 Content-Transfer-Encoding: 7bit x-cbid: 12091320-5806-0000-0000-000019967BE3 X-Barracuda-Connect: e7.ny.us.ibm.com[32.97.182.137] X-Barracuda-Start-Time: 1347568663 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com On Thu, 2012-09-13 at 03:56 -0400, Christoph Hellwig wrote: > On Wed, Aug 22, 2012 at 05:53:22PM -0500, Chandra Seetharaman wrote: > > will fix them as suggested. > > > > Thanks for the review. > > Any updates on reposting the series? Sorry, got busy with other things. Will get back to this next week. Chandra > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From bpm@sgi.com Thu Sep 13 16:17:43 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8DLHhIS222780 for ; Thu, 13 Sep 2012 16:17:43 -0500 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay2.corp.sgi.com (Postfix) with ESMTP id BFF9D30404E; Thu, 13 Sep 2012 14:18:47 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id A36554266DC; Thu, 13 Sep 2012 16:18:47 -0500 (CDT) Date: Thu, 13 Sep 2012 16:18:47 -0500 From: Ben Myers To: Dave Chinner Cc: Christoph Hellwig , Mark Tinguely , xfs@oss.sgi.com Subject: [PATCH] xfs: stop the sync worker before xfs_unmountfs Message-ID: <20120913211847.GS3274@sgi.com> References: <20120829134624.316257238@sgi.com> <20120829134628.835024558@sgi.com> <20120830002335.GB15292@dastard> <20120830172549.GG3274@sgi.com> <20120830223504.GE15292@dastard> <5040FF25.1010501@sgi.com> <20120901230824.GB6896@infradead.org> <20120912183347.GO3274@sgi.com> <20120912231406.GJ11511@dastard> <20120913164344.GV25175@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20120913164344.GV25175@sgi.com> User-Agent: Mutt/1.5.20 (2009-06-14) Cancel work of the xfs_sync_worker before teardown of the log in xfs_unmountfs. This prevents occasional crashes on unmount like so: PID: 21602 TASK: ee9df060 CPU: 0 COMMAND: "kworker/0:3" #0 [c5377d28] crash_kexec at c0292c94 #1 [c5377d80] oops_end at c07090c2 #2 [c5377d98] no_context at c06f614e #3 [c5377dbc] __bad_area_nosemaphore at c06f6281 #4 [c5377df4] bad_area_nosemaphore at c06f629b #5 [c5377e00] do_page_fault at c070b0cb #6 [c5377e7c] error_code (via page_fault) at c070892c EAX: f300c6a8 EBX: f300c6a8 ECX: 000000c0 EDX: 000000c0 EBP: c5377ed0 DS: 007b ESI: 00000000 ES: 007b EDI: 00000001 GS: ffffad20 CS: 0060 EIP: c0481ad0 ERR: ffffffff EFLAGS: 00010246 #7 [c5377eb0] atomic64_read_cx8 at c0481ad0 #8 [c5377ebc] xlog_assign_tail_lsn_locked at f7cc7c6e [xfs] #9 [c5377ed4] xfs_trans_ail_delete_bulk at f7ccd520 [xfs] #10 [c5377f0c] xfs_buf_iodone at f7ccb602 [xfs] #11 [c5377f24] xfs_buf_do_callbacks at f7cca524 [xfs] #12 [c5377f30] xfs_buf_iodone_callbacks at f7cca5da [xfs] #13 [c5377f4c] xfs_buf_iodone_work at f7c718d0 [xfs] #14 [c5377f58] process_one_work at c024ee4c #15 [c5377f98] worker_thread at c024f43d #16 [c5377fbc] kthread at c025326b #17 [c5377fe8] kernel_thread_helper at c070e834 PID: 26653 TASK: e79143b0 CPU: 3 COMMAND: "umount" #0 [cde0fda0] __schedule at c0706595 #1 [cde0fe28] schedule at c0706b89 #2 [cde0fe30] schedule_timeout at c0705600 #3 [cde0fe94] __down_common at c0706098 #4 [cde0fec8] __down at c0706122 #5 [cde0fed0] down at c025936f #6 [cde0fee0] xfs_buf_lock at f7c7131d [xfs] #7 [cde0ff00] xfs_freesb at f7cc2236 [xfs] #8 [cde0ff10] xfs_fs_put_super at f7c80f21 [xfs] #9 [cde0ff1c] generic_shutdown_super at c0333d7a #10 [cde0ff38] kill_block_super at c0333e0f #11 [cde0ff48] deactivate_locked_super at c0334218 #12 [cde0ff58] deactivate_super at c033495d #13 [cde0ff68] mntput_no_expire at c034bc13 #14 [cde0ff7c] sys_umount at c034cc69 #15 [cde0ffa0] sys_oldumount at c034ccd4 #16 [cde0ffb0] system_call at c0707e66 commit 11159a05 added this to xfs_log_unmount and needs to be cleaned up at a later date. Signed-off-by: Ben Myers Index: xfs/fs/xfs/xfs_super.c =================================================================== --- xfs.orig/fs/xfs/xfs_super.c +++ xfs/fs/xfs/xfs_super.c @@ -919,6 +919,7 @@ xfs_fs_put_super( struct xfs_mount *mp = XFS_M(sb); xfs_filestream_unmount(mp); + cancel_delayed_work_sync(&mp->m_sync_work); xfs_unmountfs(mp); xfs_syncd_stop(mp); xfs_freesb(mp); From bpm@sgi.com Thu Sep 13 16:18:54 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8DLIrOC223140 for ; Thu, 13 Sep 2012 16:18:53 -0500 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay1.corp.sgi.com (Postfix) with ESMTP id CFFC68F8065; Thu, 13 Sep 2012 14:19:57 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id B2EA54266DC; Thu, 13 Sep 2012 16:19:57 -0500 (CDT) Date: Thu, 13 Sep 2012 16:19:57 -0500 From: Ben Myers To: Christoph Hellwig Cc: Mark Tinguely , xfs@oss.sgi.com Subject: Re: xfs: stop the sync worker before xfs_unmountfs Message-ID: <20120913211957.GT3274@sgi.com> References: <20120829134624.316257238@sgi.com> <20120829134628.835024558@sgi.com> <20120830002335.GB15292@dastard> <20120830172549.GG3274@sgi.com> <20120830223504.GE15292@dastard> <5040FF25.1010501@sgi.com> <20120901230824.GB6896@infradead.org> <20120912183347.GO3274@sgi.com> <20120913081742.GA23181@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20120913081742.GA23181@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) On Thu, Sep 13, 2012 at 04:17:42AM -0400, Christoph Hellwig wrote: > On Wed, Sep 12, 2012 at 01:33:47PM -0500, Ben Myers wrote: > > See what you think of this. Not heavily tested yet, and not pretty... but it > > is fairly minimal. > > > > Pull startup and shutdown of the sync worker out of xfs_syncd_init and > > xfs_syncd_stop into their callers. In the case of unmount, move shutdown of > > the xfs_sync_worker before teardown of the log in xfs_unmountfs. This prevents > > occasional crashes on unmount like so: > > > > PID: 21602 TASK: ee9df060 CPU: 0 COMMAND: "kworker/0:3" > > #0 [c5377d28] crash_kexec at c0292c94 > > Can you remove the trailing whitespaces in these lines? They make > reading the changelog on a normal 80 character wide terminal pretty > hard. Yeah. Sorry about that. Cleaned up. > The changes look fine to me, > > > Reviewed-by: Christoph Hellwig Thanks, Ben From chris.friesen@genband.com Thu Sep 13 18:22:33 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8DNMXaM235891 for ; Thu, 13 Sep 2012 18:22:33 -0500 X-ASG-Debug-ID: 1347578617-04bdf0067e1691d0001-NocioJ Received: from exprod7og119.obsmtp.com (exprod7og119.obsmtp.com [64.18.2.16]) by cuda.sgi.com with SMTP id vwjdLd0azbUSDzli (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 13 Sep 2012 16:23:38 -0700 (PDT) X-Barracuda-Envelope-From: chris.friesen@genband.com X-Barracuda-RBL-Trusted-Forwarder: 64.18.2.16 Received: from mail.genband.com ([63.149.188.88]) (using TLSv1) by exprod7ob119.postini.com ([64.18.6.12]) with SMTP ID DSNKUFJq+OcdtqIO/uywXI+aXcFWLyxm/uNm@postini.com; Thu, 13 Sep 2012 16:23:39 PDT Received: from gbausmail.genband.com ([172.16.21.62]) by mail.genband.com with Microsoft SMTPSVC(6.0.3790.4675); Thu, 13 Sep 2012 18:23:34 -0500 X-Barracuda-Apparent-Source-IP: 63.149.188.88 X-Barracuda-BBL-IP: 63.149.188.88 X-Barracuda-RBL-IP: 63.149.188.88 Received: from [1.220.39.108] ([1.220.39.108]) by gbausmail.genband.com with Microsoft SMTPSVC(6.0.3790.4675); Thu, 13 Sep 2012 18:23:34 -0500 Message-ID: <50526AF5.50201@genband.com> Date: Thu, 13 Sep 2012 17:23:33 -0600 From: Chris Friesen User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.24) Gecko/20111108 Fedora/3.1.16-1.fc14 Lightning/1.0b3pre Thunderbird/3.1.16 MIME-Version: 1.0 To: Ben Myers , Alex Elder , xfs@oss.sgi.com Subject: global serialization points in XFS circa 2.6.27? Content-Type: text/plain; charset=ISO-8859-1; format=flowed X-ASG-Orig-Subj: global serialization points in XFS circa 2.6.27? Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 13 Sep 2012 23:23:34.0776 (UTC) FILETIME=[CBA68780:01CD9206] X-Barracuda-Connect: exprod7og119.obsmtp.com[64.18.2.16] X-Barracuda-Start-Time: 1347578618 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.23 X-Barracuda-Spam-Status: No, SCORE=0.23 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RCVD_ILLEGAL_IP X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108463 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.23 RCVD_ILLEGAL_IP Received: contains illegal IP address Hi, I've got an embedded system running a modified 2.6.27 (yes, we're trying to upgrade) and we're running into a scenario where something is happening that causes accesses to *all* XFS filesystems to hang or be delayed for some time. I know it may be a bit of a stretch since the kernel is old, but I was wondering if you might have any suggestions as to what I might look at as far as locks/algorithms within XFS that would affect all filesystems. In case it matters, the hardware is fairly beefy-- 32 threads of Sandy Bridge CPU, 64GB RAM, SAS drives, etc. Chris -- Chris Friesen Software Designer 3500 Carling Avenue Ottawa, Ontario K2H 8E9 www.genband.com From david@fromorbit.com Thu Sep 13 20:06:31 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8E16VdZ246047 for ; Thu, 13 Sep 2012 20:06:31 -0500 X-ASG-Debug-ID: 1347584856-04cb6c568515b8e0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id ah0GB5GSQCrVBrOs for ; Thu, 13 Sep 2012 18:07:37 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AtkKACSCUlB5LAgn/2dsb2JhbABFunsBA3yBCIIgAQEFOhwjEAgDDgouFCUDIROIDLtWFIsBSSoShTIDlV+JNoZsgng Received: from ppp121-44-8-39.lns20.syd6.internode.on.net (HELO dastard) ([121.44.8.39]) by ipmail07.adl2.internode.on.net with ESMTP; 14 Sep 2012 10:37:35 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TCKNV-0005YZ-PS; Fri, 14 Sep 2012 11:07:29 +1000 Date: Fri, 14 Sep 2012 11:07:29 +1000 From: Dave Chinner To: Ben Myers Cc: Christoph Hellwig , Mark Tinguely , xfs@oss.sgi.com Subject: Re: [PATCH] xfs: stop the sync worker before xfs_unmountfs Message-ID: <20120914010729.GQ11511@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: stop the sync worker before xfs_unmountfs References: <20120829134628.835024558@sgi.com> <20120830002335.GB15292@dastard> <20120830172549.GG3274@sgi.com> <20120830223504.GE15292@dastard> <5040FF25.1010501@sgi.com> <20120901230824.GB6896@infradead.org> <20120912183347.GO3274@sgi.com> <20120912231406.GJ11511@dastard> <20120913164344.GV25175@sgi.com> <20120913211847.GS3274@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20120913211847.GS3274@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1347584856 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108469 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Sep 13, 2012 at 04:18:47PM -0500, Ben Myers wrote: > Cancel work of the xfs_sync_worker before teardown of the log in > xfs_unmountfs. This prevents occasional crashes on unmount like so: Looks OK. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From mgorman@suse.de Fri Sep 14 04:44:22 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8E9iMt9059574 for ; Fri, 14 Sep 2012 04:44:22 -0500 X-ASG-Debug-ID: 1347615927-04cb6c5686175790001-NocioJ Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by cuda.sgi.com with ESMTP id jbaGIORaYsE788pi (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 14 Sep 2012 02:45:29 -0700 (PDT) X-Barracuda-Envelope-From: mgorman@suse.de X-Barracuda-Apparent-Source-IP: 195.135.220.15 Received: from relay2.suse.de (unknown [195.135.220.254]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx2.suse.de (Postfix) with ESMTP id 7022489994; Fri, 14 Sep 2012 11:45:25 +0200 (CEST) Date: Fri, 14 Sep 2012 10:45:23 +0100 From: Mel Gorman To: Mark Tinguely Cc: Christoph Hellwig , xfs@oss.sgi.com, Dave Chinner Subject: Re: [PATCH 020/102] xfs: warn if direct reclaim tries to writeback pages Message-ID: <20120914094523.GD11266@suse.de> X-ASG-Orig-Subj: Re: [PATCH 020/102] xfs: warn if direct reclaim tries to writeback pages References: <1345698180-13612-1-git-send-email-david@fromorbit.com> <1345698180-13612-21-git-send-email-david@fromorbit.com> <20120827181742.GA13970@infradead.org> <20120905113242.GL11266@suse.de> <50523E20.5000508@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-15 Content-Disposition: inline In-Reply-To: <50523E20.5000508@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: cantor2.suse.de[195.135.220.15] X-Barracuda-Start-Time: 1347615928 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108503 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Sep 13, 2012 at 03:12:16PM -0500, Mark Tinguely wrote: > On 09/05/12 06:32, Mel Gorman wrote: > >On Mon, Aug 27, 2012 at 02:17:42PM -0400, Christoph Hellwig wrote: > >>On Thu, Aug 23, 2012 at 03:01:38PM +1000, Dave Chinner wrote: > >>>From: Mel Gorman > >>> > >>>Upstream commit: 94054fa3fca1fd78db02cb3d68d5627120f0a1d4 > >>> > >>>Direct reclaim should never writeback pages. For now, handle the > >>>situation and warn about it. Ultimately, this will be a BUG_ON. > >> > >>Is this actually the case on 3.0-stable? > >> > > > >No, it is not. AFAIK, 3.0-stable does not contain [ee72886d: mm: vmscan: > >do not writeback filesystem pages in direct reclaim] which is the absolute > >minimum required for commit [94054fa3: xfs: warn if direct reclaim tries > >to writeback pages] to make sense. > > > > I hit this warning testing on a linux-30.42 with a x86_64. > Just to be clear, this was linux 3.0.42 with this series of patches applied on top, right? > WARNING: at fs/xfs/linux-2.6/xfs_aops.c:961 xfs_vm_writepage+0x63c/0x6a0() > Hardware name: S2721-533 Thunder i7501 Pro > Modules linked in: ext4 jbd2 crc16 > Pid: 12122, comm: cp Not tainted 3.0.42 #2 I ask because on 3.0.42 this warning is not present. This patch should not be merged to 3.0-stable. -- Mel Gorman SUSE Labs From tm@tao.ma Fri Sep 14 06:02:17 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_45, T_DKIM_INVALID autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8EB2Hil079022 for ; Fri, 14 Sep 2012 06:02:17 -0500 X-ASG-Debug-ID: 1347620600-04bdf0067c18d6a0001-NocioJ Received: from oproxy9.bluehost.com (oproxy9.bluehost.com [69.89.24.6]) by cuda.sgi.com with SMTP id GeErMrsDrzWNPVfn for ; Fri, 14 Sep 2012 04:03:20 -0700 (PDT) X-Barracuda-Envelope-From: tm@tao.ma X-Barracuda-Apparent-Source-IP: 69.89.24.6 Received: (qmail 15878 invoked by uid 0); 14 Sep 2012 11:03:20 -0000 Received: from unknown (HELO box585.bluehost.com) (66.147.242.185) by oproxy9.bluehost.com with SMTP; 14 Sep 2012 11:03:20 -0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=tao.ma; s=default; h=Message-Id:Date:Subject:Cc:To:From; bh=HGe+hq3B14QoyWYHklqmSyN9kafQgYXES2n5dWR5Mxk=; b=pO1G4Fwx10mCvqeseqTpw8zi13hpxaXVk2Xu9CmyufhFcWW7eQSM4/HOi7FQKbgohE+9c36LwjcJYwFWzHwuvWx+W3WgIjQY8Zg+/wpk6bxAtkWKqWHmozwFy+8FfOc0; Received: from [182.92.247.2] (port=28320 helo=tma-laptop1.taobao.ali.com) by box585.bluehost.com with esmtpsa (TLSv1:AES256-SHA:256) (Exim 4.76) (envelope-from ) id 1TCTg7-0006y5-H2; Fri, 14 Sep 2012 05:03:19 -0600 From: Tao Ma To: xfs@oss.sgi.com Cc: Eric Sandeen Subject: [PATCH] xfstests: 275, Don't remove all the files in SCRATCH_MNT. Date: Fri, 14 Sep 2012 19:03:12 +0800 X-ASG-Orig-Subj: [PATCH] xfstests: 275, Don't remove all the files in SCRATCH_MNT. Message-Id: <1347620592-3420-1-git-send-email-tm@tao.ma> X-Mailer: git-send-email 1.7.4.1 X-Identified-User: {1390:box585.bluehost.com:colyli:tao.ma} {sentby:smtp auth 182.92.247.2 authed with tm@tao.ma} X-Barracuda-Connect: oproxy9.bluehost.com[69.89.24.6] X-Barracuda-Start-Time: 1347620600 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108509 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature From: Tao Ma After the volume is mkfsed, it should have no other files that need to be rmed. And what's more, it makes ext4 complain since lost+found is also removed. So remove this useless "rm -rf $SCRATCH_MNT/*". Cc: Eric Sandeen Signed-off-by: Tao Ma --- 275 | 2 -- 1 files changed, 0 insertions(+), 2 deletions(-) diff --git a/275 b/275 index 69b2895..06db775 100755 --- a/275 +++ b/275 @@ -57,8 +57,6 @@ umount $SCRATCH_DEV 2>/dev/null _scratch_mkfs_sized $((2 * 1024 * 1024 * 1024)) >>$seq.full 2>&1 _scratch_mount -rm -rf $SCRATCH_MNT/* - dd if=/dev/zero of=$SCRATCH_MNT/tmp1 bs=256K count=1 >>$seq.full 2>&1 [ $? -ne 0 ] && _fail "Error creating file" -- 1.7.1 From tm@tao.ma Fri Sep 14 06:04:35 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_DKIM_INVALID autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8EB4ZdY079472 for ; Fri, 14 Sep 2012 06:04:35 -0500 X-ASG-Debug-ID: 1347620742-04bdf0067e18d950001-NocioJ Received: from oproxy8-pub.bluehost.com (oproxy8-pub.bluehost.com [69.89.22.20]) by cuda.sgi.com with SMTP id fcibcVWHhh3FbFZF for ; Fri, 14 Sep 2012 04:05:42 -0700 (PDT) X-Barracuda-Envelope-From: tm@tao.ma X-Barracuda-Apparent-Source-IP: 69.89.22.20 Received: (qmail 25924 invoked by uid 0); 14 Sep 2012 11:05:42 -0000 Received: from unknown (HELO box585.bluehost.com) (66.147.242.185) by oproxy8.bluehost.com with SMTP; 14 Sep 2012 11:05:42 -0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=tao.ma; s=default; h=Content-Transfer-Encoding:Content-Type:In-Reply-To:References:Subject:CC:To:MIME-Version:From:Date:Message-ID; bh=NsaxCHnsHPIHRUf9Hlu6RxOK10UpHanUQJoQIJwOVIk=; b=Ss4au1uwe5Aqt2g2ssH9nrbChcD9EM9wvCRK66viCszNupt8qY9BdJh5Iq87xJK4wewhSciEewA3BFSWO3zB15/aZPJV87A0L8/0ZhxO3C/TMQsniDeNOb2uxwXL3XlW; Received: from [182.92.247.2] (port=62563 helo=[10.62.3.65]) by box585.bluehost.com with esmtpsa (TLSv1:CAMELLIA256-SHA:256) (Exim 4.76) (envelope-from ) id 1TCTiP-00007n-TP; Fri, 14 Sep 2012 05:05:42 -0600 Message-ID: <50530F83.3070204@tao.ma> Date: Fri, 14 Sep 2012 19:05:39 +0800 From: Tao Ma User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:15.0) Gecko/20120827 Thunderbird/15.0 MIME-Version: 1.0 To: Eric Sandeen CC: xfs@oss.sgi.com Subject: Re: [PATCH] xfstests: make 275 xfs specific. References: <1336230429-2939-1-git-send-email-tm@tao.ma> <20120505233744.GE25351@dastard> <4FA692B7.9040006@tao.ma> <504A511A.8090209@sandeen.net> <504EA0C2.2060601@sandeen.net> X-ASG-Orig-Subj: Re: [PATCH] xfstests: make 275 xfs specific. In-Reply-To: <504EA0C2.2060601@sandeen.net> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Identified-User: {1390:box585.bluehost.com:colyli:tao.ma} {sentby:smtp auth 182.92.247.2 authed with tm@tao.ma} X-Barracuda-Connect: oproxy8-pub.bluehost.com[69.89.22.20] X-Barracuda-Start-Time: 1347620742 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108509 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On 09/11/2012 10:24 AM, Eric Sandeen wrote: > On 9/7/12 2:55 PM, Eric Sandeen wrote: >> On 5/6/12 10:03 AM, Tao Ma wrote: >>> On 05/06/2012 07:37 AM, Dave Chinner wrote: >>>> On Sat, May 05, 2012 at 11:07:09PM +0800, Tao Ma wrote: >>>>> From: Tao Ma >>>>> >>>>> In my test with ext4, 275 can't pass because ext4 >>>>> can create a 8k file in the end not like what xfs >>>>> does. So make this test case xfs only for now. >>>> >>>> It's not an XFS specific test - it's a test that is supposed to test >>>> POSIX write behaviour. i.e. if the filesystem is full, and then you >>>> free 4k of space, then an 8k write should only be able to write 4k, >>>> yes? >>> Yes, but it doesn't work as expected for ext4. >> >> Came across this thread again. I had patches on the list a while ago >> to fix it up. >> >> [PATCH V2] xfstests: make 275 pass >> >> But it never got fully reviewed or merged. :( > > It's reviewed & merged now. Does it fix things for you? (I hope?) No, but much better. It removes "lost+found" after mkfs, so the fsck will complain about it. So I have created the corresponding patch for it, and now the test case pass. Please see my patch "xfstests: 275, Don't remove all the files in SCRATCH_MNT". Thanks Tao From bfoster@redhat.com Fri Sep 14 07:18:18 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8ECII4S092204 for ; Fri, 14 Sep 2012 07:18:18 -0500 X-ASG-Debug-ID: 1347625165-04cbb07ce3183f60001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id qhoq9SQlLG1hA833 for ; Fri, 14 Sep 2012 05:19:25 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8ECJPWM024847 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 14 Sep 2012 08:19:25 -0400 Received: from bfoster.bfoster ([10.16.225.83]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id q8ECJOb3022244 for ; Fri, 14 Sep 2012 08:19:25 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 05343120614; Fri, 14 Sep 2012 08:19:55 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 0/8] speculative preallocation inode tracking Date: Fri, 14 Sep 2012 08:19:47 -0400 X-ASG-Orig-Subj: [PATCH v3 0/8] speculative preallocation inode tracking Message-Id: <1347625195-6369-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1347625165 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com Hi all, This is v3 of the speculative preallocation inode tracking patchset. This functionality tracks inodes with post-EOF speculative preallocation for the purpose of background and on-demand trimming. Background scanning occurs on a longish interval (5 minutes by default) and in a best-effort mode (i.e., inodes are skipped due to lock contention or dirty cache). The intent is to clear up post-EOF blocks on inodes that might have allocations hanging around due to open-write-close sequences (NFS). On demand scanning is provided via a new ioctl and supports various parameters such as scan mode, filtering by quota id and minimum file size. A pending use case for on demand scanning is for accurate quota accounting via the gluster scale out filesystem (i.e., to free up preallocated space when near a usage limit). Brian P.S., I've rebased and run this through xfstests a couple times. I'll probably run at least once more with a low background scan interval just for sanity sake. Also, Dave previously mentioned this conflicts with the xfssyncd patchset. I can rebase on top of that if there is any preference in terms of order. v3: - Pushed dirty cache check up into patch 5 (minor clean up). - Reworked xfs_can_free_eofblocks() in patch 3 as per Dave C.'s review. - Rebased from linus' tree to the XFS tree. v2: - Remove unnecessary inode flag clear helper. - Condense eofblocks set/clear tag functions. - Move clear tag call into xfs_free_eofblocks(). - Modify AG walk infrastructure to support tag-based walk and utilize this functionality for the eofblocks scan (as opposed to the previous code duplicated from reclaim scanning). - Improve ioctl functionality: new data structure fields/flags, validate quota is enabled. - Increase default background scanning interval to 5 minutes, add tunable. Brian Foster (8): xfs: add EOFBLOCKS inode tagging/untagging xfs: support a tag-based inode_ag_iterator xfs: create helper to check whether to free eofblocks on inode xfs: export xfs_free_eofblocks() and return EAGAIN on trylock failure xfs: create function to scan and clear EOFBLOCKS inodes xfs: add XFS_IOC_FREE_EOFBLOCKS ioctl xfs: add enhanced filtering to EOFBLOCKS scan xfs: add background scanning to clear EOFBLOCKS inodes fs/xfs/xfs_ag.h | 1 + fs/xfs/xfs_fs.h | 23 +++++ fs/xfs/xfs_globals.c | 1 + fs/xfs/xfs_ioctl.c | 20 ++++ fs/xfs/xfs_iomap.c | 7 ++ fs/xfs/xfs_iops.c | 3 + fs/xfs/xfs_linux.h | 1 + fs/xfs/xfs_mount.h | 2 + fs/xfs/xfs_qm_syscalls.c | 5 +- fs/xfs/xfs_sync.c | 215 ++++++++++++++++++++++++++++++++++++++++++++-- fs/xfs/xfs_sync.h | 11 ++- fs/xfs/xfs_sysctl.c | 9 ++ fs/xfs/xfs_sysctl.h | 1 + fs/xfs/xfs_trace.h | 6 ++ fs/xfs/xfs_vnodeops.c | 27 +++--- fs/xfs/xfs_vnodeops.h | 41 +++++++++- 16 files changed, 344 insertions(+), 29 deletions(-) -- 1.7.7.6 From bfoster@redhat.com Fri Sep 14 07:18:18 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8ECIIXh092205 for ; Fri, 14 Sep 2012 07:18:18 -0500 X-ASG-Debug-ID: 1347625165-04cbb07ce2183f60001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id p9guEGphEpUUfV5f for ; Fri, 14 Sep 2012 05:19:25 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8ECJPkm024937 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 14 Sep 2012 08:19:25 -0400 Received: from bfoster.bfoster ([10.16.225.83]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q8ECJPhB030671 for ; Fri, 14 Sep 2012 08:19:25 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 5F5E7120611; Fri, 14 Sep 2012 08:19:56 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 6/8] xfs: add XFS_IOC_FREE_EOFBLOCKS ioctl Date: Fri, 14 Sep 2012 08:19:53 -0400 X-ASG-Orig-Subj: [PATCH v3 6/8] xfs: add XFS_IOC_FREE_EOFBLOCKS ioctl Message-Id: <1347625195-6369-7-git-send-email-bfoster@redhat.com> In-Reply-To: <1347625195-6369-1-git-send-email-bfoster@redhat.com> References: <1347625195-6369-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1347625165 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com The XFS_IOC_FREE_EOFBLOCKS ioctl allows users to invoke an EOFBLOCKS scan. The xfs_eofblocks structure is defined to support the command parameters (scan mode). Signed-off-by: Brian Foster --- fs/xfs/xfs_fs.h | 14 ++++++++++++++ fs/xfs/xfs_ioctl.c | 12 ++++++++++++ 2 files changed, 26 insertions(+), 0 deletions(-) diff --git a/fs/xfs/xfs_fs.h b/fs/xfs/xfs_fs.h index c13fed8..32bb2e8 100644 --- a/fs/xfs/xfs_fs.h +++ b/fs/xfs/xfs_fs.h @@ -339,6 +339,19 @@ typedef struct xfs_error_injection { /* + * Speculative preallocation trimming. + */ +struct xfs_eofblocks { + __u32 eof_flags; + __s32 version; + unsigned char pad[12]; +}; + +/* eof_flags values */ +#define XFS_EOF_FLAGS_FORCE 0x01 /* force/wait mode scan */ + + +/* * The user-level Handle Request interface structure. */ typedef struct xfs_fsop_handlereq { @@ -456,6 +469,7 @@ typedef struct xfs_handle { /* XFS_IOC_GETBIOSIZE ---- deprecated 47 */ #define XFS_IOC_GETBMAPX _IOWR('X', 56, struct getbmap) #define XFS_IOC_ZERO_RANGE _IOW ('X', 57, struct xfs_flock64) +#define XFS_IOC_FREE_EOFBLOCKS _IOR ('X', 58, struct xfs_eofblocks) /* * ioctl commands that replace IRIX syssgi()'s diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index 0e0232c..216ca7a 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -1602,6 +1602,18 @@ xfs_file_ioctl( error = xfs_errortag_clearall(mp, 1); return -error; + case XFS_IOC_FREE_EOFBLOCKS: { + struct xfs_eofblocks eofb; + int flags; + + if (copy_from_user(&eofb, arg, sizeof(eofb))) + return -XFS_ERROR(EFAULT); + + flags = (eofb.eof_flags & XFS_EOF_FLAGS_FORCE) ? SYNC_WAIT : SYNC_TRYLOCK; + error = xfs_inodes_free_eofblocks(mp, flags); + return -error; + } + default: return -ENOTTY; } -- 1.7.7.6 From bfoster@redhat.com Fri Sep 14 07:18:19 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8ECIIBF092218 for ; Fri, 14 Sep 2012 07:18:18 -0500 X-ASG-Debug-ID: 1347625165-04cbb07ce5183f70001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id K1Dmg2XggIN6U3KJ for ; Fri, 14 Sep 2012 05:19:25 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8ECJPpp006865 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 14 Sep 2012 08:19:25 -0400 Received: from bfoster.bfoster ([10.16.225.83]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q8ECJPVh022223 for ; Fri, 14 Sep 2012 08:19:25 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 82E49121337; Fri, 14 Sep 2012 08:19:56 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 4/8] xfs: export xfs_free_eofblocks() and return EAGAIN on trylock failure Date: Fri, 14 Sep 2012 08:19:51 -0400 X-ASG-Orig-Subj: [PATCH v3 4/8] xfs: export xfs_free_eofblocks() and return EAGAIN on trylock failure Message-Id: <1347625195-6369-5-git-send-email-bfoster@redhat.com> In-Reply-To: <1347625195-6369-1-git-send-email-bfoster@redhat.com> References: <1347625195-6369-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1347625165 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com Turn xfs_free_eofblocks() into a non-static function, return EAGAIN to indicate trylock failure and make sure this error is not propagated in xfs_release(). Signed-off-by: Brian Foster --- fs/xfs/xfs_vnodeops.c | 6 +++--- fs/xfs/xfs_vnodeops.h | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c index 12f5087..a61e852 100644 --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c @@ -150,7 +150,7 @@ xfs_readlink( * when the link count isn't zero and by xfs_dm_punch_hole() when * punching a hole to EOF. */ -STATIC int +int xfs_free_eofblocks( xfs_mount_t *mp, xfs_inode_t *ip, @@ -199,7 +199,7 @@ xfs_free_eofblocks( if (need_iolock) { if (!xfs_ilock_nowait(ip, XFS_IOLOCK_EXCL)) { xfs_trans_cancel(tp, 0); - return 0; + return EAGAIN; } } @@ -462,7 +462,7 @@ xfs_release( return 0; error = xfs_free_eofblocks(mp, ip, true); - if (error) + if (error && error != EAGAIN) return error; /* delalloc blocks after truncation means it really is dirty */ diff --git a/fs/xfs/xfs_vnodeops.h b/fs/xfs/xfs_vnodeops.h index d5701e3..1e03c4b 100644 --- a/fs/xfs/xfs_vnodeops.h +++ b/fs/xfs/xfs_vnodeops.h @@ -95,5 +95,6 @@ int xfs_flush_pages(struct xfs_inode *ip, xfs_off_t first, int xfs_wait_on_pages(struct xfs_inode *ip, xfs_off_t first, xfs_off_t last); int xfs_zero_eof(struct xfs_inode *, xfs_off_t, xfs_fsize_t); +int xfs_free_eofblocks(struct xfs_mount *, struct xfs_inode *, bool); #endif /* _XFS_VNODEOPS_H */ -- 1.7.7.6 From bfoster@redhat.com Fri Sep 14 07:18:19 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_72 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8ECIJ9m092231 for ; Fri, 14 Sep 2012 07:18:19 -0500 X-ASG-Debug-ID: 1347625165-04cb6c568517da60001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id YlU7ltDFkDUQ5ROe for ; Fri, 14 Sep 2012 05:19:26 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8ECJPPf002588 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 14 Sep 2012 08:19:25 -0400 Received: from bfoster.bfoster ([10.16.225.83]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id q8ECJP9K022250 for ; Fri, 14 Sep 2012 08:19:25 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 959BB121339; Fri, 14 Sep 2012 08:19:56 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 8/8] xfs: add background scanning to clear EOFBLOCKS inodes Date: Fri, 14 Sep 2012 08:19:55 -0400 X-ASG-Orig-Subj: [PATCH v3 8/8] xfs: add background scanning to clear EOFBLOCKS inodes Message-Id: <1347625195-6369-9-git-send-email-bfoster@redhat.com> In-Reply-To: <1347625195-6369-1-git-send-email-bfoster@redhat.com> References: <1347625195-6369-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1347625165 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com Create a delayed_work to enable background scanning and freeing of EOFBLOCKS inodes. The scanner kicks in once speculative preallocation occurs and stops requeueing itself when no EOFBLOCKS inodes exist. Scans are queued on the existing syncd workqueue and the interval is based on the new eofb_timer tunable (default to 5m). The background scanner performs unfiltered, best effort scans (which skips inodes under lock contention or with a dirty cache mapping). Signed-off-by: Brian Foster --- fs/xfs/xfs_globals.c | 1 + fs/xfs/xfs_linux.h | 1 + fs/xfs/xfs_mount.h | 2 ++ fs/xfs/xfs_sync.c | 30 ++++++++++++++++++++++++++++++ fs/xfs/xfs_sysctl.c | 9 +++++++++ fs/xfs/xfs_sysctl.h | 1 + 6 files changed, 44 insertions(+), 0 deletions(-) diff --git a/fs/xfs/xfs_globals.c b/fs/xfs/xfs_globals.c index 76e81cf..fda9a66 100644 --- a/fs/xfs/xfs_globals.c +++ b/fs/xfs/xfs_globals.c @@ -40,4 +40,5 @@ xfs_param_t xfs_params = { .rotorstep = { 1, 1, 255 }, .inherit_nodfrg = { 0, 1, 1 }, .fstrm_timer = { 1, 30*100, 3600*100}, + .eofb_timer = { 1*100, 300*100, 7200*100}, }; diff --git a/fs/xfs/xfs_linux.h b/fs/xfs/xfs_linux.h index 828662f..bbad99b 100644 --- a/fs/xfs/xfs_linux.h +++ b/fs/xfs/xfs_linux.h @@ -118,6 +118,7 @@ #define xfs_rotorstep xfs_params.rotorstep.val #define xfs_inherit_nodefrag xfs_params.inherit_nodfrg.val #define xfs_fstrm_centisecs xfs_params.fstrm_timer.val +#define xfs_eofb_centisecs xfs_params.eofb_timer.val #define current_cpu() (raw_smp_processor_id()) #define current_pid() (current->pid) diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index deee09e..bf5ecfa 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -199,6 +199,8 @@ typedef struct xfs_mount { struct xfs_mru_cache *m_filestream; /* per-mount filestream data */ struct delayed_work m_sync_work; /* background sync work */ struct delayed_work m_reclaim_work; /* background inode reclaim */ + struct delayed_work m_eofblocks_work; /* background eof blocks + trimming */ struct work_struct m_flush_work; /* background inode flush */ __int64_t m_update_flags; /* sb flags we need to update on the next remount,rw */ diff --git a/fs/xfs/xfs_sync.c b/fs/xfs/xfs_sync.c index 13cd9da..778cf6a 100644 --- a/fs/xfs/xfs_sync.c +++ b/fs/xfs/xfs_sync.c @@ -532,6 +532,31 @@ xfs_flush_worker( xfs_sync_data(mp, SYNC_TRYLOCK | SYNC_WAIT); } +/* + * Background scanning to trim post-EOF preallocated space. This is queued + * based on the 'eofb_centisecs' tunable (5m by default). + */ +STATIC void +xfs_queue_eofblocks( + struct xfs_mount *mp) +{ + rcu_read_lock(); + if (radix_tree_tagged(&mp->m_perag_tree, XFS_ICI_EOFBLOCKS_TAG)) + queue_delayed_work(xfs_syncd_wq, &mp->m_eofblocks_work, + msecs_to_jiffies(xfs_eofb_centisecs * 10)); + rcu_read_unlock(); +} + +STATIC void +xfs_eofblocks_worker( +struct work_struct *work) +{ + struct xfs_mount *mp = container_of(to_delayed_work(work), + struct xfs_mount, m_eofblocks_work); + xfs_inodes_free_eofblocks(mp, SYNC_TRYLOCK, NULL); + xfs_queue_eofblocks(mp); +} + int xfs_syncd_init( struct xfs_mount *mp) @@ -539,6 +564,7 @@ xfs_syncd_init( INIT_WORK(&mp->m_flush_work, xfs_flush_worker); INIT_DELAYED_WORK(&mp->m_sync_work, xfs_sync_worker); INIT_DELAYED_WORK(&mp->m_reclaim_work, xfs_reclaim_worker); + INIT_DELAYED_WORK(&mp->m_eofblocks_work, xfs_eofblocks_worker); xfs_syncd_queue_sync(mp); @@ -551,6 +577,7 @@ xfs_syncd_stop( { cancel_delayed_work_sync(&mp->m_sync_work); cancel_delayed_work_sync(&mp->m_reclaim_work); + cancel_delayed_work_sync(&mp->m_eofblocks_work); cancel_work_sync(&mp->m_flush_work); } @@ -1101,6 +1128,9 @@ xfs_inode_set_eofblocks_tag( XFS_ICI_EOFBLOCKS_TAG); spin_unlock(&ip->i_mount->m_perag_lock); + /* kick off background trimming */ + xfs_queue_eofblocks(ip->i_mount); + trace_xfs_perag_set_eofblocks(ip->i_mount, pag->pag_agno, -1, _RET_IP_); } diff --git a/fs/xfs/xfs_sysctl.c b/fs/xfs/xfs_sysctl.c index ee2d2ad..45d74fc 100644 --- a/fs/xfs/xfs_sysctl.c +++ b/fs/xfs/xfs_sysctl.c @@ -202,6 +202,15 @@ static ctl_table xfs_table[] = { .extra1 = &xfs_params.fstrm_timer.min, .extra2 = &xfs_params.fstrm_timer.max, }, + { + .procname = "eofb_centisecs", + .data = &xfs_params.eofb_timer.val, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = proc_dointvec_minmax, + .extra1 = &xfs_params.eofb_timer.min, + .extra2 = &xfs_params.eofb_timer.max, + }, /* please keep this the last entry */ #ifdef CONFIG_PROC_FS { diff --git a/fs/xfs/xfs_sysctl.h b/fs/xfs/xfs_sysctl.h index b9937d4..bd8e157 100644 --- a/fs/xfs/xfs_sysctl.h +++ b/fs/xfs/xfs_sysctl.h @@ -47,6 +47,7 @@ typedef struct xfs_param { xfs_sysctl_val_t rotorstep; /* inode32 AG rotoring control knob */ xfs_sysctl_val_t inherit_nodfrg;/* Inherit the "nodefrag" inode flag. */ xfs_sysctl_val_t fstrm_timer; /* Filestream dir-AG assoc'n timeout. */ + xfs_sysctl_val_t eofb_timer; /* Interval between eofb scan wakeups */ } xfs_param_t; /* -- 1.7.7.6 From bfoster@redhat.com Fri Sep 14 07:18:18 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8ECIIKd092206 for ; Fri, 14 Sep 2012 07:18:18 -0500 X-ASG-Debug-ID: 1347625165-04cb6c568717da60001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id YrWqVB2DxtwYn9Re for ; Fri, 14 Sep 2012 05:19:25 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8ECJPAn024849 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 14 Sep 2012 08:19:25 -0400 Received: from bfoster.bfoster ([10.16.225.83]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q8ECJOuU030669 for ; Fri, 14 Sep 2012 08:19:25 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 3C352120615; Fri, 14 Sep 2012 08:19:55 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 2/8] xfs: support a tag-based inode_ag_iterator Date: Fri, 14 Sep 2012 08:19:49 -0400 X-ASG-Orig-Subj: [PATCH v3 2/8] xfs: support a tag-based inode_ag_iterator Message-Id: <1347625195-6369-3-git-send-email-bfoster@redhat.com> In-Reply-To: <1347625195-6369-1-git-send-email-bfoster@redhat.com> References: <1347625195-6369-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1347625165 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com Genericize xfs_inode_ag_walk() to support an optional radix tree tag and args argument for the execute function. Create a new wrapper called xfs_inode_ag_iterator_tag() that performs a tag based walk of perag's and inodes. Signed-off-by: Brian Foster --- fs/xfs/xfs_qm_syscalls.c | 5 ++- fs/xfs/xfs_sync.c | 61 +++++++++++++++++++++++++++++++++++++++------- fs/xfs/xfs_sync.h | 7 ++++- 3 files changed, 60 insertions(+), 13 deletions(-) diff --git a/fs/xfs/xfs_qm_syscalls.c b/fs/xfs/xfs_qm_syscalls.c index 858a3b1..848bd8e 100644 --- a/fs/xfs/xfs_qm_syscalls.c +++ b/fs/xfs/xfs_qm_syscalls.c @@ -845,7 +845,8 @@ STATIC int xfs_dqrele_inode( struct xfs_inode *ip, struct xfs_perag *pag, - int flags) + int flags, + void *args) { /* skip quota inodes */ if (ip == ip->i_mount->m_quotainfo->qi_uquotaip || @@ -881,5 +882,5 @@ xfs_qm_dqrele_all_inodes( uint flags) { ASSERT(mp->m_quotainfo); - xfs_inode_ag_iterator(mp, xfs_dqrele_inode, flags); + xfs_inode_ag_iterator(mp, xfs_dqrele_inode, flags, NULL); } diff --git a/fs/xfs/xfs_sync.c b/fs/xfs/xfs_sync.c index 00c6224..0da93c9 100644 --- a/fs/xfs/xfs_sync.c +++ b/fs/xfs/xfs_sync.c @@ -101,8 +101,11 @@ xfs_inode_ag_walk( struct xfs_mount *mp, struct xfs_perag *pag, int (*execute)(struct xfs_inode *ip, - struct xfs_perag *pag, int flags), - int flags) + struct xfs_perag *pag, int flags, + void *args), + int flags, + void *args, + int tag) { uint32_t first_index; int last_error = 0; @@ -121,9 +124,17 @@ restart: int i; rcu_read_lock(); - nr_found = radix_tree_gang_lookup(&pag->pag_ici_root, + + if (tag == -1) + nr_found = radix_tree_gang_lookup(&pag->pag_ici_root, (void **)batch, first_index, XFS_LOOKUP_BATCH); + else + nr_found = radix_tree_gang_lookup_tag( + &pag->pag_ici_root, + (void **) batch, first_index, + XFS_LOOKUP_BATCH, tag); + if (!nr_found) { rcu_read_unlock(); break; @@ -164,7 +175,7 @@ restart: for (i = 0; i < nr_found; i++) { if (!batch[i]) continue; - error = execute(batch[i], pag, flags); + error = execute(batch[i], pag, flags, args); IRELE(batch[i]); if (error == EAGAIN) { skipped++; @@ -193,8 +204,10 @@ int xfs_inode_ag_iterator( struct xfs_mount *mp, int (*execute)(struct xfs_inode *ip, - struct xfs_perag *pag, int flags), - int flags) + struct xfs_perag *pag, int flags, + void *args), + int flags, + void *args) { struct xfs_perag *pag; int error = 0; @@ -204,7 +217,36 @@ xfs_inode_ag_iterator( ag = 0; while ((pag = xfs_perag_get(mp, ag))) { ag = pag->pag_agno + 1; - error = xfs_inode_ag_walk(mp, pag, execute, flags); + error = xfs_inode_ag_walk(mp, pag, execute, flags, args, -1); + xfs_perag_put(pag); + if (error) { + last_error = error; + if (error == EFSCORRUPTED) + break; + } + } + return XFS_ERROR(last_error); +} + +int +xfs_inode_ag_iterator_tag( + struct xfs_mount *mp, + int (*execute)(struct xfs_inode *ip, + struct xfs_perag *pag, int flags, + void *args), + int flags, + void *args, + int tag) +{ + struct xfs_perag *pag; + int error = 0; + int last_error = 0; + xfs_agnumber_t ag; + + ag = 0; + while ((pag = xfs_perag_get_tag(mp, ag, tag))) { + ag = pag->pag_agno + 1; + error = xfs_inode_ag_walk(mp, pag, execute, flags, args, tag); xfs_perag_put(pag); if (error) { last_error = error; @@ -219,7 +261,8 @@ STATIC int xfs_sync_inode_data( struct xfs_inode *ip, struct xfs_perag *pag, - int flags) + int flags, + void *args) { struct inode *inode = VFS_I(ip); struct address_space *mapping = inode->i_mapping; @@ -252,7 +295,7 @@ xfs_sync_data( ASSERT((flags & ~(SYNC_TRYLOCK|SYNC_WAIT)) == 0); - error = xfs_inode_ag_iterator(mp, xfs_sync_inode_data, flags); + error = xfs_inode_ag_iterator(mp, xfs_sync_inode_data, flags, NULL); if (error) return XFS_ERROR(error); diff --git a/fs/xfs/xfs_sync.h b/fs/xfs/xfs_sync.h index 4486491..463ea0a 100644 --- a/fs/xfs/xfs_sync.h +++ b/fs/xfs/xfs_sync.h @@ -48,7 +48,10 @@ void xfs_inode_clear_eofblocks_tag(struct xfs_inode *ip); int xfs_sync_inode_grab(struct xfs_inode *ip); int xfs_inode_ag_iterator(struct xfs_mount *mp, - int (*execute)(struct xfs_inode *ip, struct xfs_perag *pag, int flags), - int flags); + int (*execute)(struct xfs_inode *ip, struct xfs_perag *pag, int flags, void *args), + int flags, void *args); +int xfs_inode_ag_iterator_tag(struct xfs_mount *mp, + int (*execute)(struct xfs_inode *ip, struct xfs_perag *pag, int flags, void *args), + int flags, void *args, int tag); #endif -- 1.7.7.6 From bfoster@redhat.com Fri Sep 14 07:18:19 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8ECIIit092217 for ; Fri, 14 Sep 2012 07:18:19 -0500 X-ASG-Debug-ID: 1347625165-04bdf0067c191580001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id yixJCymji7kBAEhI for ; Fri, 14 Sep 2012 05:19:25 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8ECJPwZ024855 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 14 Sep 2012 08:19:25 -0400 Received: from bfoster.bfoster ([10.16.225.83]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q8ECJPEI021194 for ; Fri, 14 Sep 2012 08:19:25 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 8F4D2121336; Fri, 14 Sep 2012 08:19:56 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 7/8] xfs: add enhanced filtering to EOFBLOCKS scan Date: Fri, 14 Sep 2012 08:19:54 -0400 X-ASG-Orig-Subj: [PATCH v3 7/8] xfs: add enhanced filtering to EOFBLOCKS scan Message-Id: <1347625195-6369-8-git-send-email-bfoster@redhat.com> In-Reply-To: <1347625195-6369-1-git-send-email-bfoster@redhat.com> References: <1347625195-6369-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1347625165 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com Support EOFBLOCKS scan filtering by quota ID or minimum file size. Add the appropriate fields/flags to the xfs_eofblocks structure and pass it down to xfs_inode_free_eofblocks() where filtering functionality is implemented. A (user requested) quota ID based scan requires the associated quota mode be enabled. Signed-off-by: Brian Foster --- fs/xfs/xfs_fs.h | 9 +++++++++ fs/xfs/xfs_ioctl.c | 10 +++++++++- fs/xfs/xfs_sync.c | 30 ++++++++++++++++++++++++++---- fs/xfs/xfs_sync.h | 2 +- 4 files changed, 45 insertions(+), 6 deletions(-) diff --git a/fs/xfs/xfs_fs.h b/fs/xfs/xfs_fs.h index 32bb2e8..54c0f39 100644 --- a/fs/xfs/xfs_fs.h +++ b/fs/xfs/xfs_fs.h @@ -343,12 +343,21 @@ typedef struct xfs_error_injection { */ struct xfs_eofblocks { __u32 eof_flags; + __u32 eof_id; + __u64 eof_min_file_size; __s32 version; unsigned char pad[12]; }; /* eof_flags values */ #define XFS_EOF_FLAGS_FORCE 0x01 /* force/wait mode scan */ +#define XFS_EOF_FLAGS_USRID 0x02 /* filter by user id */ +#define XFS_EOF_FLAGS_GRPID 0x04 /* filter by group id */ +#define XFS_EOF_FLAGS_PROJID 0x08 /* filter by project id */ +#define XFS_EOF_FLAGS_MINFILESIZE 0x10 /* minimum file size */ + +#define XFS_EOF_VALID_QUOTA (XFS_EOF_FLAGS_USRID|XFS_EOF_FLAGS_GRPID| \ + XFS_EOF_FLAGS_PROJID) /* diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index 216ca7a..a7bf847 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -1609,8 +1609,16 @@ xfs_file_ioctl( if (copy_from_user(&eofb, arg, sizeof(eofb))) return -XFS_ERROR(EFAULT); + if (((eofb.eof_flags & XFS_EOF_FLAGS_USRID) && + !XFS_IS_UQUOTA_ON(mp)) || + ((eofb.eof_flags & XFS_EOF_FLAGS_GRPID) && + !XFS_IS_GQUOTA_ON(mp)) || + ((eofb.eof_flags & XFS_EOF_FLAGS_PROJID) && + !XFS_IS_PQUOTA_ON(mp))) + return -XFS_ERROR(EINVAL); + flags = (eofb.eof_flags & XFS_EOF_FLAGS_FORCE) ? SYNC_WAIT : SYNC_TRYLOCK; - error = xfs_inodes_free_eofblocks(mp, flags); + error = xfs_inodes_free_eofblocks(mp, flags, &eofb); return -error; } diff --git a/fs/xfs/xfs_sync.c b/fs/xfs/xfs_sync.c index 48cab9f..13cd9da 100644 --- a/fs/xfs/xfs_sync.c +++ b/fs/xfs/xfs_sync.c @@ -1015,6 +1015,21 @@ xfs_reclaim_inodes_count( } STATIC int +xfs_inode_match_quota_id( + struct xfs_inode *ip, + struct xfs_eofblocks *eofb) +{ + if (eofb->eof_flags & XFS_EOF_FLAGS_USRID) + return ip->i_d.di_uid == eofb->eof_id; + else if (eofb->eof_flags & XFS_EOF_FLAGS_GRPID) + return ip->i_d.di_gid == eofb->eof_id; + else if (eofb->eof_flags & XFS_EOF_FLAGS_PROJID) + return xfs_get_projid(ip) == eofb->eof_id; + + return 0; +} + +STATIC int xfs_inode_free_eofblocks( struct xfs_inode *ip, struct xfs_perag *pag, @@ -1022,6 +1037,7 @@ xfs_inode_free_eofblocks( void *args) { int ret; + struct xfs_eofblocks *eofb = args; bool force = flags & SYNC_WAIT; if (!xfs_can_free_eofblocks(ip, false)) { @@ -1031,8 +1047,13 @@ xfs_inode_free_eofblocks( return 0; } - if (!force && mapping_tagged(VFS_I(ip)->i_mapping, - PAGECACHE_TAG_DIRTY)) + if ((eofb && + (((eofb->eof_flags & XFS_EOF_VALID_QUOTA) && + !xfs_inode_match_quota_id(ip, eofb)) || + ((eofb->eof_flags & XFS_EOF_FLAGS_MINFILESIZE) && + (XFS_ISIZE(ip) < eofb->eof_min_file_size)))) || + (!force && mapping_tagged(VFS_I(ip)->i_mapping, + PAGECACHE_TAG_DIRTY))) return 0; ret = xfs_free_eofblocks(ip->i_mount, ip, false); @@ -1047,11 +1068,12 @@ xfs_inode_free_eofblocks( int xfs_inodes_free_eofblocks( struct xfs_mount *mp, - int flags) + int flags, + struct xfs_eofblocks *eofb) { ASSERT((flags & ~(SYNC_TRYLOCK|SYNC_WAIT)) == 0); return xfs_inode_ag_iterator_tag(mp, xfs_inode_free_eofblocks, flags, - NULL, XFS_ICI_EOFBLOCKS_TAG); + eofb, XFS_ICI_EOFBLOCKS_TAG); } void diff --git a/fs/xfs/xfs_sync.h b/fs/xfs/xfs_sync.h index 307654a..167f06c 100644 --- a/fs/xfs/xfs_sync.h +++ b/fs/xfs/xfs_sync.h @@ -45,7 +45,7 @@ void __xfs_inode_clear_reclaim_tag(struct xfs_mount *mp, struct xfs_perag *pag, void xfs_inode_set_eofblocks_tag(struct xfs_inode *ip); void xfs_inode_clear_eofblocks_tag(struct xfs_inode *ip); -int xfs_inodes_free_eofblocks(struct xfs_mount *, int); +int xfs_inodes_free_eofblocks(struct xfs_mount *, int, struct xfs_eofblocks *); int xfs_sync_inode_grab(struct xfs_inode *ip); int xfs_inode_ag_iterator(struct xfs_mount *mp, -- 1.7.7.6 From bfoster@redhat.com Fri Sep 14 07:18:19 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8ECIJAu092238 for ; Fri, 14 Sep 2012 07:18:19 -0500 X-ASG-Debug-ID: 1347625165-04bdf0067d191580001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id UotuQiwrBEnPn67s for ; Fri, 14 Sep 2012 05:19:25 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8ECJP2o006862 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 14 Sep 2012 08:19:25 -0400 Received: from bfoster.bfoster ([10.16.225.83]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id q8ECJPBQ022248 for ; Fri, 14 Sep 2012 08:19:25 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 78B72121338; Fri, 14 Sep 2012 08:19:56 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 5/8] xfs: create function to scan and clear EOFBLOCKS inodes Date: Fri, 14 Sep 2012 08:19:52 -0400 X-ASG-Orig-Subj: [PATCH v3 5/8] xfs: create function to scan and clear EOFBLOCKS inodes Message-Id: <1347625195-6369-6-git-send-email-bfoster@redhat.com> In-Reply-To: <1347625195-6369-1-git-send-email-bfoster@redhat.com> References: <1347625195-6369-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1347625165 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com xfs_inodes_free_eofblocks() implements scanning functionality for EOFBLOCKS inodes. It uses the AG iterator to walk the tagged inodes and free post-EOF blocks via the xfs_inode_free_eofblocks() execute function. The scan can be invoked in best-effort mode or wait (force) mode. A best-effort scan (default) handles all inodes that do not have a dirty cache and we successfully acquire the io lock via trylock. In wait mode, we continue to cycle through an AG until all inodes are handled. Signed-off-by: Brian Foster --- fs/xfs/xfs_sync.c | 40 ++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_sync.h | 1 + fs/xfs/xfs_trace.h | 1 + 3 files changed, 42 insertions(+), 0 deletions(-) diff --git a/fs/xfs/xfs_sync.c b/fs/xfs/xfs_sync.c index 0da93c9..48cab9f 100644 --- a/fs/xfs/xfs_sync.c +++ b/fs/xfs/xfs_sync.c @@ -1014,6 +1014,46 @@ xfs_reclaim_inodes_count( return reclaimable; } +STATIC int +xfs_inode_free_eofblocks( + struct xfs_inode *ip, + struct xfs_perag *pag, + int flags, + void *args) +{ + int ret; + bool force = flags & SYNC_WAIT; + + if (!xfs_can_free_eofblocks(ip, false)) { + /* inode could be preallocated or append-only */ + trace_xfs_inode_free_eofblocks_invalid(ip); + xfs_inode_clear_eofblocks_tag(ip); + return 0; + } + + if (!force && mapping_tagged(VFS_I(ip)->i_mapping, + PAGECACHE_TAG_DIRTY)) + return 0; + + ret = xfs_free_eofblocks(ip->i_mount, ip, false); + + /* ignore EAGAIN on a best effort scan */ + if (!force && (ret == EAGAIN)) + ret = 0; + + return ret; +} + +int +xfs_inodes_free_eofblocks( + struct xfs_mount *mp, + int flags) +{ + ASSERT((flags & ~(SYNC_TRYLOCK|SYNC_WAIT)) == 0); + return xfs_inode_ag_iterator_tag(mp, xfs_inode_free_eofblocks, flags, + NULL, XFS_ICI_EOFBLOCKS_TAG); +} + void xfs_inode_set_eofblocks_tag( xfs_inode_t *ip) diff --git a/fs/xfs/xfs_sync.h b/fs/xfs/xfs_sync.h index 463ea0a..307654a 100644 --- a/fs/xfs/xfs_sync.h +++ b/fs/xfs/xfs_sync.h @@ -45,6 +45,7 @@ void __xfs_inode_clear_reclaim_tag(struct xfs_mount *mp, struct xfs_perag *pag, void xfs_inode_set_eofblocks_tag(struct xfs_inode *ip); void xfs_inode_clear_eofblocks_tag(struct xfs_inode *ip); +int xfs_inodes_free_eofblocks(struct xfs_mount *, int); int xfs_sync_inode_grab(struct xfs_inode *ip); int xfs_inode_ag_iterator(struct xfs_mount *mp, diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index 6f46e03..cb52346 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -589,6 +589,7 @@ DEFINE_INODE_EVENT(xfs_dquot_dqdetach); DEFINE_INODE_EVENT(xfs_inode_set_eofblocks_tag); DEFINE_INODE_EVENT(xfs_inode_clear_eofblocks_tag); +DEFINE_INODE_EVENT(xfs_inode_free_eofblocks_invalid); DECLARE_EVENT_CLASS(xfs_iref_class, TP_PROTO(struct xfs_inode *ip, unsigned long caller_ip), -- 1.7.7.6 From bfoster@redhat.com Fri Sep 14 07:18:19 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8ECIIhG092215 for ; Fri, 14 Sep 2012 07:18:19 -0500 X-ASG-Debug-ID: 1347625165-04bdf06cd0995d0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id FNRL20eAVt9pxtZT for ; Fri, 14 Sep 2012 05:19:25 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8ECJPlU003482 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 14 Sep 2012 08:19:25 -0400 Received: from bfoster.bfoster ([10.16.225.83]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q8ECJOIg021832 for ; Fri, 14 Sep 2012 08:19:25 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 257A4120012; Fri, 14 Sep 2012 08:19:56 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 3/8] xfs: create helper to check whether to free eofblocks on inode Date: Fri, 14 Sep 2012 08:19:50 -0400 X-ASG-Orig-Subj: [PATCH v3 3/8] xfs: create helper to check whether to free eofblocks on inode Message-Id: <1347625195-6369-4-git-send-email-bfoster@redhat.com> In-Reply-To: <1347625195-6369-1-git-send-email-bfoster@redhat.com> References: <1347625195-6369-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1347625165 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com This check is used in multiple places to determine whether we should check for (and potentially free) post EOF blocks on an inode. Add a helper to consolidate the check. Note that when we remove an inode from the cache (xfs_inactive()), we are required to trim post-EOF blocks even if the inode is marked preallocated or append-only to maintain correct space accounting. The 'force' parameter to xfs_can_free_eofblocks() specifies whether we should ignore the prealloc/append-only status of the inode. Signed-off-by: Brian Foster --- fs/xfs/xfs_vnodeops.c | 19 +++++++------------ fs/xfs/xfs_vnodeops.h | 40 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 46 insertions(+), 13 deletions(-) diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c index d883881..12f5087 100644 --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c @@ -435,11 +435,7 @@ xfs_release( if (ip->i_d.di_nlink == 0) return 0; - if ((S_ISREG(ip->i_d.di_mode) && - (VFS_I(ip)->i_size > 0 || - (VN_CACHED(VFS_I(ip)) > 0 || ip->i_delayed_blks > 0)) && - (ip->i_df.if_flags & XFS_IFEXTENTS)) && - (!(ip->i_d.di_flags & (XFS_DIFLAG_PREALLOC | XFS_DIFLAG_APPEND)))) { + if (xfs_can_free_eofblocks(ip, false)) { /* * If we can't get the iolock just skip truncating the blocks @@ -515,13 +511,12 @@ xfs_inactive( goto out; if (ip->i_d.di_nlink != 0) { - if ((S_ISREG(ip->i_d.di_mode) && - (VFS_I(ip)->i_size > 0 || - (VN_CACHED(VFS_I(ip)) > 0 || ip->i_delayed_blks > 0)) && - (ip->i_df.if_flags & XFS_IFEXTENTS) && - (!(ip->i_d.di_flags & - (XFS_DIFLAG_PREALLOC | XFS_DIFLAG_APPEND)) || - ip->i_delayed_blks != 0))) { + /* + * force is true because we are evicting an inode from the + * cache. Post-eof blocks must be freed, lest we end up with + * broken free space accounting. + */ + if (xfs_can_free_eofblocks(ip, true)) { error = xfs_free_eofblocks(mp, ip, false); if (error) return VN_INACTIVE_CACHE; diff --git a/fs/xfs/xfs_vnodeops.h b/fs/xfs/xfs_vnodeops.h index 447e146..d5701e3 100644 --- a/fs/xfs/xfs_vnodeops.h +++ b/fs/xfs/xfs_vnodeops.h @@ -1,6 +1,10 @@ #ifndef _XFS_VNODEOPS_H #define _XFS_VNODEOPS_H 1 +#include "xfs_bmap_btree.h" +#include "xfs_dinode.h" +#include "xfs_inode.h" + struct attrlist_cursor_kern; struct file; struct iattr; @@ -9,8 +13,42 @@ struct iovec; struct kiocb; struct pipe_inode_info; struct uio; -struct xfs_inode; +/* + * Test whether it is appropriate to check an inode for and free post EOF + * blocks. The 'force' parameter determines whether we should also consider + * regular files that are marked preallocated or append-only. + */ +static inline bool +xfs_can_free_eofblocks(struct xfs_inode *ip, bool force) +{ + /* prealloc/delalloc exists only on regular files */ + if (!S_ISREG(ip->i_d.di_mode)) + return false; + + /* + * Zero sized files with no cached pages and delalloc blocks will not + * have speculative prealloc/delalloc blocks to remove. + */ + if (VFS_I(ip)->i_size == 0 && + VN_CACHED(VFS_I(ip)) == 0 && + ip->i_delayed_blks == 0) + return false; + + /* If we haven't read in the extent list, then don't do it now. */ + if (!(ip->i_df.if_flags & XFS_IFEXTENTS)) + return false; + + /* + * Do not free real preallocated or append-only files unless the file + * has delalloc blocks and we are forced to remove them. + */ + if (ip->i_d.di_flags & (XFS_DIFLAG_PREALLOC | XFS_DIFLAG_APPEND)) + if (!force || ip->i_delayed_blks == 0) + return false; + + return true; +} int xfs_setattr_nonsize(struct xfs_inode *ip, struct iattr *vap, int flags); int xfs_setattr_size(struct xfs_inode *ip, struct iattr *vap, int flags); -- 1.7.7.6 From bfoster@redhat.com Fri Sep 14 07:18:18 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.9 required=5.0 tests=BAYES_00,LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8ECIINI092210 for ; Fri, 14 Sep 2012 07:18:18 -0500 X-ASG-Debug-ID: 1347625165-04cb6c568617da60001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id i8orCk9HMvWOVqdG for ; Fri, 14 Sep 2012 05:19:25 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8ECJPxd029331 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 14 Sep 2012 08:19:25 -0400 Received: from bfoster.bfoster ([10.16.225.83]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q8ECJPMA022219 for ; Fri, 14 Sep 2012 08:19:25 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 54E7C120613; Fri, 14 Sep 2012 08:19:55 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v3 1/8] xfs: add EOFBLOCKS inode tagging/untagging Date: Fri, 14 Sep 2012 08:19:48 -0400 X-ASG-Orig-Subj: [PATCH v3 1/8] xfs: add EOFBLOCKS inode tagging/untagging Message-Id: <1347625195-6369-2-git-send-email-bfoster@redhat.com> In-Reply-To: <1347625195-6369-1-git-send-email-bfoster@redhat.com> References: <1347625195-6369-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1347625165 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com Add the XFS_ICI_EOFBLOCKS_TAG inode tag to identify inodes with speculatively preallocated blocks beyond EOF. An inode is tagged when speculative preallocation occurs and untagged either via truncate down or when post-EOF blocks are freed via release or reclaim. The tag management is intentionally not aggressive to prefer simplicity over the complexity of handling all the corner cases under which post-EOF blocks could be freed (i.e., forward truncation, fallocate, write error conditions, etc.). This means that a tagged inode may or may not have post-EOF blocks after a period of time. The tag is eventually cleared when the inode is released or reclaimed. Signed-off-by: Brian Foster --- fs/xfs/xfs_ag.h | 1 + fs/xfs/xfs_iomap.c | 7 +++++ fs/xfs/xfs_iops.c | 3 ++ fs/xfs/xfs_sync.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_sync.h | 3 ++ fs/xfs/xfs_trace.h | 5 ++++ fs/xfs/xfs_vnodeops.c | 2 + 7 files changed, 83 insertions(+), 0 deletions(-) diff --git a/fs/xfs/xfs_ag.h b/fs/xfs/xfs_ag.h index 44d65c1..22bd4db 100644 --- a/fs/xfs/xfs_ag.h +++ b/fs/xfs/xfs_ag.h @@ -233,6 +233,7 @@ typedef struct xfs_perag { #define XFS_ICI_NO_TAG (-1) /* special flag for an untagged lookup in xfs_inode_ag_iterator */ #define XFS_ICI_RECLAIM_TAG 0 /* inode is to be reclaimed */ +#define XFS_ICI_EOFBLOCKS_TAG 1 /* inode has blocks beyond EOF */ #define XFS_AG_MAXLEVELS(mp) ((mp)->m_ag_maxlevels) #define XFS_MIN_FREELIST_RAW(bl,cl,mp) \ diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index 973dff6..2968ee8 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -459,6 +459,13 @@ retry: if (!(imap[0].br_startblock || XFS_IS_REALTIME_INODE(ip))) return xfs_alert_fsblock_zero(ip, &imap[0]); + /* + * Tag the inode as speculatively preallocated so we can reclaim this + * space on demand, if necessary. + */ + if (prealloc) + xfs_inode_set_eofblocks_tag(ip); + *ret_imap = imap[0]; return 0; } diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index 4e00cf0..dcd1d5f 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -854,6 +854,9 @@ xfs_setattr_size( * and do not wait the usual (long) time for writeout. */ xfs_iflags_set(ip, XFS_ITRUNCATED); + + /* A truncate down always removes post-EOF blocks. */ + xfs_inode_clear_eofblocks_tag(ip); } if (mask & ATTR_CTIME) { diff --git a/fs/xfs/xfs_sync.c b/fs/xfs/xfs_sync.c index 9654817..00c6224 100644 --- a/fs/xfs/xfs_sync.c +++ b/fs/xfs/xfs_sync.c @@ -971,3 +971,65 @@ xfs_reclaim_inodes_count( return reclaimable; } +void +xfs_inode_set_eofblocks_tag( + xfs_inode_t *ip) +{ + struct xfs_mount *mp = ip->i_mount; + struct xfs_perag *pag; + int tagged; + + pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, ip->i_ino)); + spin_lock(&pag->pag_ici_lock); + trace_xfs_inode_set_eofblocks_tag(ip); + + tagged = radix_tree_tagged(&pag->pag_ici_root, + XFS_ICI_EOFBLOCKS_TAG); + radix_tree_tag_set(&pag->pag_ici_root, + XFS_INO_TO_AGINO(ip->i_mount, ip->i_ino), + XFS_ICI_EOFBLOCKS_TAG); + if (!tagged) { + /* propagate the eofblocks tag up into the perag radix tree */ + spin_lock(&ip->i_mount->m_perag_lock); + radix_tree_tag_set(&ip->i_mount->m_perag_tree, + XFS_INO_TO_AGNO(ip->i_mount, ip->i_ino), + XFS_ICI_EOFBLOCKS_TAG); + spin_unlock(&ip->i_mount->m_perag_lock); + + trace_xfs_perag_set_eofblocks(ip->i_mount, pag->pag_agno, + -1, _RET_IP_); + } + + spin_unlock(&pag->pag_ici_lock); + xfs_perag_put(pag); +} + +void +xfs_inode_clear_eofblocks_tag( + xfs_inode_t *ip) +{ + struct xfs_mount *mp = ip->i_mount; + struct xfs_perag *pag; + + pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, ip->i_ino)); + spin_lock(&pag->pag_ici_lock); + trace_xfs_inode_clear_eofblocks_tag(ip); + + radix_tree_tag_clear(&pag->pag_ici_root, + XFS_INO_TO_AGINO(ip->i_mount, ip->i_ino), + XFS_ICI_EOFBLOCKS_TAG); + if (!radix_tree_tagged(&pag->pag_ici_root, XFS_ICI_EOFBLOCKS_TAG)) { + /* clear the eofblocks tag from the perag radix tree */ + spin_lock(&ip->i_mount->m_perag_lock); + radix_tree_tag_clear(&ip->i_mount->m_perag_tree, + XFS_INO_TO_AGNO(ip->i_mount, ip->i_ino), + XFS_ICI_EOFBLOCKS_TAG); + spin_unlock(&ip->i_mount->m_perag_lock); + trace_xfs_perag_clear_eofblocks(ip->i_mount, pag->pag_agno, + -1, _RET_IP_); + } + + spin_unlock(&pag->pag_ici_lock); + xfs_perag_put(pag); +} + diff --git a/fs/xfs/xfs_sync.h b/fs/xfs/xfs_sync.h index 941202e..4486491 100644 --- a/fs/xfs/xfs_sync.h +++ b/fs/xfs/xfs_sync.h @@ -43,6 +43,9 @@ void __xfs_inode_set_reclaim_tag(struct xfs_perag *pag, struct xfs_inode *ip); void __xfs_inode_clear_reclaim_tag(struct xfs_mount *mp, struct xfs_perag *pag, struct xfs_inode *ip); +void xfs_inode_set_eofblocks_tag(struct xfs_inode *ip); +void xfs_inode_clear_eofblocks_tag(struct xfs_inode *ip); + int xfs_sync_inode_grab(struct xfs_inode *ip); int xfs_inode_ag_iterator(struct xfs_mount *mp, int (*execute)(struct xfs_inode *ip, struct xfs_perag *pag, int flags), diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index 7d36ccf..6f46e03 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -130,6 +130,8 @@ DEFINE_PERAG_REF_EVENT(xfs_perag_get_tag); DEFINE_PERAG_REF_EVENT(xfs_perag_put); DEFINE_PERAG_REF_EVENT(xfs_perag_set_reclaim); DEFINE_PERAG_REF_EVENT(xfs_perag_clear_reclaim); +DEFINE_PERAG_REF_EVENT(xfs_perag_set_eofblocks); +DEFINE_PERAG_REF_EVENT(xfs_perag_clear_eofblocks); TRACE_EVENT(xfs_attr_list_node_descend, TP_PROTO(struct xfs_attr_list_context *ctx, @@ -585,6 +587,9 @@ DEFINE_INODE_EVENT(xfs_update_time); DEFINE_INODE_EVENT(xfs_dquot_dqalloc); DEFINE_INODE_EVENT(xfs_dquot_dqdetach); +DEFINE_INODE_EVENT(xfs_inode_set_eofblocks_tag); +DEFINE_INODE_EVENT(xfs_inode_clear_eofblocks_tag); + DECLARE_EVENT_CLASS(xfs_iref_class, TP_PROTO(struct xfs_inode *ip, unsigned long caller_ip), TP_ARGS(ip, caller_ip), diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c index 2a5c6373..d883881 100644 --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c @@ -237,6 +237,8 @@ xfs_free_eofblocks( } else { error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); + if (!error) + xfs_inode_clear_eofblocks_tag(ip); } xfs_iunlock(ip, XFS_ILOCK_EXCL); -- 1.7.7.6 From tinguely@sgi.com Fri Sep 14 07:55:33 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8ECtXpg098734 for ; Fri, 14 Sep 2012 07:55:33 -0500 Received: from [128.162.232.125] (eagdhcp-232-125.americas.sgi.com [128.162.232.125]) by relay1.corp.sgi.com (Postfix) with ESMTP id B47FE8F8066; Fri, 14 Sep 2012 05:56:37 -0700 (PDT) Message-ID: <50532979.2070002@sgi.com> Date: Fri, 14 Sep 2012 07:56:25 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Mel Gorman CC: Christoph Hellwig , xfs@oss.sgi.com, Dave Chinner Subject: Re: [PATCH 020/102] xfs: warn if direct reclaim tries to writeback pages References: <1345698180-13612-1-git-send-email-david@fromorbit.com> <1345698180-13612-21-git-send-email-david@fromorbit.com> <20120827181742.GA13970@infradead.org> <20120905113242.GL11266@suse.de> <50523E20.5000508@sgi.com> <20120914094523.GD11266@suse.de> In-Reply-To: <20120914094523.GD11266@suse.de> Content-Type: text/plain; charset=ISO-8859-15; format=flowed Content-Transfer-Encoding: 7bit On 09/14/12 04:45, Mel Gorman wrote: > On Thu, Sep 13, 2012 at 03:12:16PM -0500, Mark Tinguely wrote: >> On 09/05/12 06:32, Mel Gorman wrote: >>> On Mon, Aug 27, 2012 at 02:17:42PM -0400, Christoph Hellwig wrote: >>>> On Thu, Aug 23, 2012 at 03:01:38PM +1000, Dave Chinner wrote: >>>>> From: Mel Gorman >>>>> >>>>> Upstream commit: 94054fa3fca1fd78db02cb3d68d5627120f0a1d4 >>>>> >>>>> Direct reclaim should never writeback pages. For now, handle the >>>>> situation and warn about it. Ultimately, this will be a BUG_ON. >>>> >>>> Is this actually the case on 3.0-stable? >>>> >>> >>> No, it is not. AFAIK, 3.0-stable does not contain [ee72886d: mm: vmscan: >>> do not writeback filesystem pages in direct reclaim] which is the absolute >>> minimum required for commit [94054fa3: xfs: warn if direct reclaim tries >>> to writeback pages] to make sense. >>> >> >> I hit this warning testing on a linux-30.42 with a x86_64. >> > > Just to be clear, this was linux 3.0.42 with this series of patches > applied on top, right? > >> WARNING: at fs/xfs/linux-2.6/xfs_aops.c:961 xfs_vm_writepage+0x63c/0x6a0() >> Hardware name: S2721-533 Thunder i7501 Pro >> Modules linked in: ext4 jbd2 crc16 >> Pid: 12122, comm: cp Not tainted 3.0.42 #2 > > I ask because on 3.0.42 this warning is not present. This patch should > not be merged to 3.0-stable. > Correct. Linux-3.0.42 with Dave 102 patches, I removed patch 94 and 95 per list comments. I added Brian Foster's patch as 103 I am testing xfstest 109 and 273 in a loop for shutdown worker races - none found yet. That message happened in the first loop, and never occurred again. And the machine was a x86_32 not 64. patch 103: Subject: xfs: check for stale inode before acquiring iflock on push From: Brian Foster Upstream commit: 9a3a5dab63461b84213052888bf38a962b22d035 An inode in the AIL can be flush locked and marked stale if a cluster free transaction occurs at the right time. The inode item is then marked as flushing, which causes xfsaild to spin and leaves the filesystem stalled. This is reproduced by running xfstests 273 in a loop for an extended period of time. Check for stale inodes before the flush lock. This marks the inode as pinned, leads to a log flush and allows the filesystem to proceed. Signed-off-by: Brian Foster Reviewed-by: Dave Chinner Reviewed-by: Christoph Hellwig Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers Index: linux-3.0.42/fs/xfs/xfs_inode_item.c =================================================================== --- linux-3.0.42.orig/fs/xfs/xfs_inode_item.c +++ linux-3.0.42/fs/xfs/xfs_inode_item.c @@ -507,6 +507,21 @@ xfs_inode_item_trylock( if (!xfs_ilock_nowait(ip, XFS_ILOCK_SHARED)) return XFS_ITEM_LOCKED; + /* + * Re-check the pincount now that we stabilized the value by + * taking the ilock. + */ + if (xfs_ipincount(ip) > 0) { + xfs_iunlock(ip, XFS_ILOCK_SHARED); + return XFS_ITEM_PINNED; + } + + /* Stale items should force out the iclog */ + if (ip->i_flags & XFS_ISTALE) { + xfs_iunlock(ip, XFS_ILOCK_SHARED); + return XFS_ITEM_PINNED; + } + if (!xfs_iflock_nowait(ip)) { /* * inode has already been flushed to the backing buffer, @@ -516,13 +531,6 @@ xfs_inode_item_trylock( return XFS_ITEM_PUSHBUF; } - /* Stale items should force out the iclog */ - if (ip->i_flags & XFS_ISTALE) { - xfs_ifunlock(ip); - xfs_iunlock(ip, XFS_ILOCK_SHARED); - return XFS_ITEM_PINNED; - } - #ifdef DEBUG if (!XFS_FORCED_SHUTDOWN(ip->i_mount)) { ASSERT(iip->ili_fields != 0); From sandeen@sandeen.net Fri Sep 14 08:42:51 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_45 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8EDgpCH110833 for ; Fri, 14 Sep 2012 08:42:51 -0500 X-ASG-Debug-ID: 1347630237-04cbb07ce5189450001-NocioJ Received: from mail.sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id ZBKDdIv325v02IIG for ; Fri, 14 Sep 2012 06:43:57 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) (Authenticated sender: sandeen) by mail.sandeen.net (Postfix) with ESMTP id 622AE4964601; Fri, 14 Sep 2012 08:43:57 -0500 (CDT) Message-ID: <5053349C.20106@sandeen.net> Date: Fri, 14 Sep 2012 08:43:56 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20120824 Thunderbird/15.0 MIME-Version: 1.0 To: Tao Ma CC: xfs@oss.sgi.com Subject: Re: [PATCH] xfstests: 275, Don't remove all the files in SCRATCH_MNT. References: <1347620592-3420-1-git-send-email-tm@tao.ma> X-ASG-Orig-Subj: Re: [PATCH] xfstests: 275, Don't remove all the files in SCRATCH_MNT. In-Reply-To: <1347620592-3420-1-git-send-email-tm@tao.ma> X-Enigmail-Version: 1.4.4 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1347630237 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108519 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 9/14/12 6:03 AM, Tao Ma wrote: > From: Tao Ma > > After the volume is mkfsed, it should have no other files that > need to be rmed. And what's more, it makes ext4 complain since > lost+found is also removed. > > So remove this useless "rm -rf $SCRATCH_MNT/*". Oh, sigh, after all the review how did I miss that :/ Reviewed-by: Eric Sandeen SGI: I won't be pushing this to kernel.org trees per the emails yesterday. Thanks, -Eric > Cc: Eric Sandeen > Signed-off-by: Tao Ma > --- > 275 | 2 -- > 1 files changed, 0 insertions(+), 2 deletions(-) > > diff --git a/275 b/275 > index 69b2895..06db775 100755 > --- a/275 > +++ b/275 > @@ -57,8 +57,6 @@ umount $SCRATCH_DEV 2>/dev/null > _scratch_mkfs_sized $((2 * 1024 * 1024 * 1024)) >>$seq.full 2>&1 > _scratch_mount > > -rm -rf $SCRATCH_MNT/* > - > dd if=/dev/zero of=$SCRATCH_MNT/tmp1 bs=256K count=1 >>$seq.full 2>&1 > [ $? -ne 0 ] && _fail "Error creating file" > > From tinguely@sgi.com Fri Sep 14 11:17:29 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8EGHTOm143573 for ; Fri, 14 Sep 2012 11:17:29 -0500 Received: from [128.162.232.125] (eagdhcp-232-125.americas.sgi.com [128.162.232.125]) by relay2.corp.sgi.com (Postfix) with ESMTP id 16B41304066; Fri, 14 Sep 2012 09:18:34 -0700 (PDT) Message-ID: <505358CD.4060609@sgi.com> Date: Fri, 14 Sep 2012 11:18:21 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Mel Gorman CC: Christoph Hellwig , xfs@oss.sgi.com, Dave Chinner Subject: Re: [PATCH 020/102] xfs: warn if direct reclaim tries to writeback pages References: <1345698180-13612-1-git-send-email-david@fromorbit.com> <1345698180-13612-21-git-send-email-david@fromorbit.com> <20120827181742.GA13970@infradead.org> <20120905113242.GL11266@suse.de> <50523E20.5000508@sgi.com> <20120914094523.GD11266@suse.de> <50532979.2070002@sgi.com> In-Reply-To: <50532979.2070002@sgi.com> Content-Type: text/plain; charset=ISO-8859-15; format=flowed Content-Transfer-Encoding: 7bit On 09/14/12 07:56, Mark Tinguely wrote: > On 09/14/12 04:45, Mel Gorman wrote: >> On Thu, Sep 13, 2012 at 03:12:16PM -0500, Mark Tinguely wrote: >>> WARNING: at fs/xfs/linux-2.6/xfs_aops.c:961 >>> xfs_vm_writepage+0x63c/0x6a0() >>> Hardware name: S2721-533 Thunder i7501 Pro >>> Modules linked in: ext4 jbd2 crc16 >>> Pid: 12122, comm: cp Not tainted 3.0.42 #2 >> >> I ask because on 3.0.42 this warning is not present. This patch should >> not be merged to 3.0-stable. >> > > Correct. Linux-3.0.42 with Dave 102 patches, I removed patch 94 and 95 > per list comments. I added Brian Foster's patch as 103 > > I am testing xfstest 109 and 273 in a loop for shutdown worker races - > none found yet. That message happened in the first loop, and never > occurred again. > > And the machine was a x86_32 not 64. PS. of course it reports only once... that is what the patch does. reboot the machine and it displays on first call to test 273. Does not happen on the x86_64 machine. Until I can duplicate it on another x86_32, less us assume there is something weird with that machine. --Mark. From cmaiolino@redhat.com Fri Sep 14 11:48:41 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8EGmfwc147395 for ; Fri, 14 Sep 2012 11:48:41 -0500 X-ASG-Debug-ID: 1347641387-04cbb07ce5195b50001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id SO7PWKaHDVdFGWv5 for ; Fri, 14 Sep 2012 09:49:48 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8EGnlCa025680 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 14 Sep 2012 12:49:47 -0400 Received: from andromeda.usersys.redhat.com (ovpn-113-109.phx2.redhat.com [10.3.113.109]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q8EGnk0T019005 for ; Fri, 14 Sep 2012 12:49:47 -0400 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: [PATCH 0/4] inode32/inode64 allocation changes Date: Fri, 14 Sep 2012 13:49:37 -0300 X-ASG-Orig-Subj: [PATCH 0/4] inode32/inode64 allocation changes Message-Id: <1347641381-30050-1-git-send-email-cmaiolino@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1347641388 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com This patch set adds inode64 as the default allocation mode, but also includes 2 patches to remove duplicated code and another one to make inode32 able to be remounted. NOTE: This patch has as dependency "Make inode64 a remountable option" patch. Carlos Maiolino (4): xfs: make inode64 as the default allocation mode xfs: add xfs_set_inode32() xfs: set xfs_initialize_perag() to use xfs_set_inode32/64() xfs: Make inode32 a remountable option fs/xfs/xfs_mount.c | 43 +++---------------- fs/xfs/xfs_super.c | 124 +++++++++++++++++++++++++++++++++++++++++------------ fs/xfs/xfs_super.h | 2 + 3 files changed, 104 insertions(+), 65 deletions(-) -- 1.7.11.4 From cmaiolino@redhat.com Fri Sep 14 11:48:48 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8EGmmjI147415 for ; Fri, 14 Sep 2012 11:48:48 -0500 X-ASG-Debug-ID: 1347641394-04bdf0067d1a3af0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id YmZ3popbi7zhC7NB for ; Fri, 14 Sep 2012 09:49:54 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8EGnsUX027630 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 14 Sep 2012 12:49:54 -0400 Received: from andromeda.usersys.redhat.com (ovpn-113-109.phx2.redhat.com [10.3.113.109]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q8EGnk0U019005 for ; Fri, 14 Sep 2012 12:49:53 -0400 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: [PATCH 1/4] xfs: make inode64 as the default allocation mode Date: Fri, 14 Sep 2012 13:49:38 -0300 X-ASG-Orig-Subj: [PATCH 1/4] xfs: make inode64 as the default allocation mode Message-Id: <1347641381-30050-2-git-send-email-cmaiolino@redhat.com> In-Reply-To: <1347641381-30050-1-git-send-email-cmaiolino@redhat.com> References: <1347641381-30050-1-git-send-email-cmaiolino@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1347641394 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com since 64-bit inodes can be accessed while using inode32, and these can also be used on 32-bit kernels, there is no reason to still keep inode32 as the default mount option. Signed-off-by: Carlos Maiolino --- fs/xfs/xfs_super.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index f1f2968..967d024 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -88,6 +88,8 @@ mempool_t *xfs_ioend_pool; * unwritten extent conversion */ #define MNTOPT_NOBARRIER "nobarrier" /* .. disable */ #define MNTOPT_64BITINODE "inode64" /* inodes can be allocated anywhere */ +#define MNTOPT_32BITINODE "inode32" /* inode allocation limited to + * XFS_MAXINUMBER_32 */ #define MNTOPT_IKEEP "ikeep" /* do not free empty inode clusters */ #define MNTOPT_NOIKEEP "noikeep" /* free empty inode clusters */ #define MNTOPT_LARGEIO "largeio" /* report large I/O sizes in stat() */ @@ -198,7 +200,6 @@ xfs_parseargs( */ mp->m_flags |= XFS_MOUNT_BARRIER; mp->m_flags |= XFS_MOUNT_COMPAT_IOSIZE; - mp->m_flags |= XFS_MOUNT_SMALL_INUMS; /* * These can be overridden by the mount option parsing. @@ -295,6 +296,13 @@ xfs_parseargs( return EINVAL; } dswidth = simple_strtoul(value, &eov, 10); + } else if (!strcmp(this_char, MNTOPT_32BITINODE)) { + mp->m_flags |= XFS_MOUNT_SMALL_INUMS; +#if !XFS_BIG_INUMS + xfs_warn(mp, "%s option not allowed on this system", + this_char); + return EINVAL; +#endif } else if (!strcmp(this_char, MNTOPT_64BITINODE)) { mp->m_flags &= ~XFS_MOUNT_SMALL_INUMS; #if !XFS_BIG_INUMS @@ -493,13 +501,13 @@ xfs_showargs( { XFS_MOUNT_FILESTREAMS, "," MNTOPT_FILESTREAM }, { XFS_MOUNT_GRPID, "," MNTOPT_GRPID }, { XFS_MOUNT_DISCARD, "," MNTOPT_DISCARD }, + { XFS_MOUNT_SMALL_INUMS, "," MNTOPT_32BITINODE }, { 0, NULL } }; static struct proc_xfs_info xfs_info_unset[] = { /* the few simple ones we can get from the mount struct */ { XFS_MOUNT_COMPAT_IOSIZE, "," MNTOPT_LARGEIO }, { XFS_MOUNT_BARRIER, "," MNTOPT_NOBARRIER }, - { XFS_MOUNT_SMALL_INUMS, "," MNTOPT_64BITINODE }, { 0, NULL } }; struct proc_xfs_info *xfs_infop; -- 1.7.11.4 From cmaiolino@redhat.com Fri Sep 14 11:48:50 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8EGmo5K147432 for ; Fri, 14 Sep 2012 11:48:50 -0500 X-ASG-Debug-ID: 1347641397-04cbb07ce4195b80001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id U5dxPBEF261Eht9v for ; Fri, 14 Sep 2012 09:49:57 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8EGnvbQ027642 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 14 Sep 2012 12:49:57 -0400 Received: from andromeda.usersys.redhat.com (ovpn-113-109.phx2.redhat.com [10.3.113.109]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q8EGnk0V019005 for ; Fri, 14 Sep 2012 12:49:56 -0400 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: [PATCH 2/4] xfs: add xfs_set_inode32() Date: Fri, 14 Sep 2012 13:49:39 -0300 X-ASG-Orig-Subj: [PATCH 2/4] xfs: add xfs_set_inode32() Message-Id: <1347641381-30050-3-git-send-email-cmaiolino@redhat.com> In-Reply-To: <1347641381-30050-1-git-send-email-cmaiolino@redhat.com> References: <1347641381-30050-1-git-send-email-cmaiolino@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1347641397 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com xfs_set_inode32() can be used to enable inode32 allocation mode. this will reduce the amount of duplicated code needed to mount/remount a filesystem with inode32 option. This patch also enable xfs_set_inode64() to return a xfs_agnumber_t value to also be used during mount/remount, instead of duplicate code Signed-off-by: Carlos Maiolino --- fs/xfs/xfs_super.c | 102 ++++++++++++++++++++++++++++++++++++++++------------- fs/xfs/xfs_super.h | 2 ++ 2 files changed, 80 insertions(+), 24 deletions(-) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 967d024..c4899d3 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -600,6 +600,84 @@ xfs_max_file_offset( return (((__uint64_t)pagefactor) << bitshift) - 1; } +xfs_agnumber_t +xfs_set_inode64(struct xfs_mount *mp) +{ + xfs_agnumber_t index = 0; + + for (index = 0; index < mp->m_sb.sb_agcount; index++) { + struct xfs_perag *pag; + + pag = xfs_perag_get(mp, index); + pag->pagi_inodeok = 1; + pag->pagf_metadata = 0; + xfs_perag_put(pag); + } + + /* There is no need for lock protection on m_flags, + * the rw_semaphore of the VFS superblock is locked + * during mount/umount/remount operations, so this is + * enough to avoid concurency on the m_flags field + */ + mp->m_flags &= ~(XFS_MOUNT_32BITINODES | + XFS_MOUNT_SMALL_INUMS); + mp->m_maxagi = index; + + return index; +} + +xfs_agnumber_t +xfs_set_inode32(struct xfs_mount *mp) +{ + xfs_agnumber_t index; + xfs_agnumber_t i = 0; + xfs_sb_t *sbp = &mp->m_sb; + xfs_agnumber_t max_metadata; + xfs_agino_t agino = XFS_OFFBNO_TO_AGINO(mp, sbp->sb_agblocks -1, 0); + xfs_ino_t ino = XFS_AGINO_TO_INO(mp, sbp->sb_agcount -1, agino); + xfs_perag_t *pag; + + /* Calculate how much should be reserved for inodes to meet + * the max inode percentage. + */ + if (mp->m_maxicount) { + __uint64_t icount; + + icount = sbp->sb_dblocks * sbp->sb_imax_pct; + do_div(icount, 100); + icount += sbp->sb_agblocks - 1; + do_div(icount, sbp->sb_agblocks); + max_metadata = icount; + } else { + max_metadata = sbp->sb_agcount; + } + + for (index = 0; index < sbp->sb_agcount; index++) { + ino = XFS_AGINO_TO_INO(mp, index, agino); + + if (ino > XFS_MAXINUMBER_32) { + i++; + pag = xfs_perag_get(mp, index); + pag->pagi_inodeok = 0; + pag->pagf_metadata = 1; + xfs_perag_put(pag); + continue; + } + + pag = xfs_perag_get(mp, index); + pag->pagi_inodeok = 1; + if (index < max_metadata) + pag->pagf_metadata = 1; + + xfs_perag_put(pag); + } + + index -= i; + mp->m_flags |= (XFS_MOUNT_32BITINODES | + XFS_MOUNT_SMALL_INUMS); + return index; +} + STATIC int xfs_blkdev_get( xfs_mount_t *mp, @@ -1039,30 +1117,6 @@ xfs_restore_resvblks(struct xfs_mount *mp) xfs_reserve_blocks(mp, &resblks, NULL); } -STATIC void -xfs_set_inode64(struct xfs_mount *mp) -{ - int i = 0; - - for (i = 0; i < mp->m_sb.sb_agcount; i++) { - struct xfs_perag *pag; - - pag = xfs_perag_get(mp, i); - pag->pagi_inodeok = 1; - pag->pagf_metadata = 0; - xfs_perag_put(pag); - } - - /* There is no need for lock protection on m_flags, - * the rw_semaphore of the VFS superblock is locked - * during mount/umount/remount operations, so this is - * enough to avoid concurency on the m_flags field - */ - mp->m_flags &= ~(XFS_MOUNT_32BITINODES | - XFS_MOUNT_SMALL_INUMS); - mp->m_maxagi = i; -} - STATIC int xfs_fs_remount( struct super_block *sb, diff --git a/fs/xfs/xfs_super.h b/fs/xfs/xfs_super.h index 09b0c26..9de4a92 100644 --- a/fs/xfs/xfs_super.h +++ b/fs/xfs/xfs_super.h @@ -75,6 +75,8 @@ struct block_device; extern __uint64_t xfs_max_file_offset(unsigned int); extern void xfs_blkdev_issue_flush(struct xfs_buftarg *); +extern xfs_agnumber_t xfs_set_inode32(struct xfs_mount *); +extern xfs_agnumber_t xfs_set_inode64(struct xfs_mount *); extern const struct export_operations xfs_export_operations; extern const struct xattr_handler *xfs_xattr_handlers[]; -- 1.7.11.4 From cmaiolino@redhat.com Fri Sep 14 11:48:53 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8EGmrYZ147441 for ; Fri, 14 Sep 2012 11:48:53 -0500 X-ASG-Debug-ID: 1347641400-04cb6c568518ffd0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id g6DWNMXp4ra0LHhx for ; Fri, 14 Sep 2012 09:50:00 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8EGnxUD006301 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 14 Sep 2012 12:50:00 -0400 Received: from andromeda.usersys.redhat.com (ovpn-113-109.phx2.redhat.com [10.3.113.109]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q8EGnk0W019005 for ; Fri, 14 Sep 2012 12:49:59 -0400 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: [PATCH 3/4] xfs: set xfs_initialize_perag() to use xfs_set_inode32/64() Date: Fri, 14 Sep 2012 13:49:40 -0300 X-ASG-Orig-Subj: [PATCH 3/4] xfs: set xfs_initialize_perag() to use xfs_set_inode32/64() Message-Id: <1347641381-30050-4-git-send-email-cmaiolino@redhat.com> In-Reply-To: <1347641381-30050-1-git-send-email-cmaiolino@redhat.com> References: <1347641381-30050-1-git-send-email-cmaiolino@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1347641400 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com Set xfs_initialize_perag() to use xfs_set_inode32() and xfs_set_inode64() functions, removing duplicated code Signed-off-by: Carlos Maiolino --- fs/xfs/xfs_mount.c | 43 +++++-------------------------------------- 1 file changed, 5 insertions(+), 38 deletions(-) diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 29c2f83..b2bd3a0 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -440,7 +440,7 @@ xfs_initialize_perag( xfs_agnumber_t agcount, xfs_agnumber_t *maxagi) { - xfs_agnumber_t index, max_metadata; + xfs_agnumber_t index; xfs_agnumber_t first_initialised = 0; xfs_perag_t *pag; xfs_agino_t agino; @@ -500,43 +500,10 @@ xfs_initialize_perag( else mp->m_flags &= ~XFS_MOUNT_32BITINODES; - if (mp->m_flags & XFS_MOUNT_32BITINODES) { - /* - * Calculate how much should be reserved for inodes to meet - * the max inode percentage. - */ - if (mp->m_maxicount) { - __uint64_t icount; - - icount = sbp->sb_dblocks * sbp->sb_imax_pct; - do_div(icount, 100); - icount += sbp->sb_agblocks - 1; - do_div(icount, sbp->sb_agblocks); - max_metadata = icount; - } else { - max_metadata = agcount; - } - - for (index = 0; index < agcount; index++) { - ino = XFS_AGINO_TO_INO(mp, index, agino); - if (ino > XFS_MAXINUMBER_32) { - index++; - break; - } - - pag = xfs_perag_get(mp, index); - pag->pagi_inodeok = 1; - if (index < max_metadata) - pag->pagf_metadata = 1; - xfs_perag_put(pag); - } - } else { - for (index = 0; index < agcount; index++) { - pag = xfs_perag_get(mp, index); - pag->pagi_inodeok = 1; - xfs_perag_put(pag); - } - } + if (mp->m_flags & XFS_MOUNT_32BITINODES) + index = xfs_set_inode32(mp); + else + index = xfs_set_inode64(mp); if (maxagi) *maxagi = index; -- 1.7.11.4 From cmaiolino@redhat.com Fri Sep 14 11:48:55 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8EGmtP7147458 for ; Fri, 14 Sep 2012 11:48:55 -0500 X-ASG-Debug-ID: 1347641402-04bdf0067d1a3b10001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id r23RJHV9qSKZAeQI for ; Fri, 14 Sep 2012 09:50:02 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8EGo2la027667 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 14 Sep 2012 12:50:02 -0400 Received: from andromeda.usersys.redhat.com (ovpn-113-109.phx2.redhat.com [10.3.113.109]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q8EGnk0X019005 for ; Fri, 14 Sep 2012 12:50:01 -0400 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: [PATCH 4/4] xfs: Make inode32 a remountable option Date: Fri, 14 Sep 2012 13:49:41 -0300 X-ASG-Orig-Subj: [PATCH 4/4] xfs: Make inode32 a remountable option Message-Id: <1347641381-30050-5-git-send-email-cmaiolino@redhat.com> In-Reply-To: <1347641381-30050-1-git-send-email-cmaiolino@redhat.com> References: <1347641381-30050-1-git-send-email-cmaiolino@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1347641402 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com As inode64 is the default option now, and was also made remountable previously, inode32 can also be remounted on-the-fly when it is needed. Signed-off-by: Carlos Maiolino --- fs/xfs/xfs_super.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index c4899d3..052dccb 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -122,13 +122,18 @@ mempool_t *xfs_ioend_pool; * in the future, too. */ enum { - Opt_barrier, Opt_nobarrier, Opt_inode64, Opt_err + Opt_barrier, + Opt_nobarrier, + Opt_inode64, + Opt_inode32, + Opt_err }; static const match_table_t tokens = { {Opt_barrier, "barrier"}, {Opt_nobarrier, "nobarrier"}, {Opt_inode64, "inode64"}, + {Opt_inode32, "inode32"}, {Opt_err, NULL} }; @@ -1145,6 +1150,9 @@ xfs_fs_remount( case Opt_inode64: xfs_set_inode64(mp); break; + case Opt_inode32: + xfs_set_inode32(mp); + break; default: /* * Logically we would return an error here to prevent -- 1.7.11.4 From sandeen@sandeen.net Fri Sep 14 13:05:27 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8EI5RR9155930 for ; Fri, 14 Sep 2012 13:05:27 -0500 X-ASG-Debug-ID: 1347645993-04cbb07ce419ca20001-NocioJ Received: from mail.sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id sO9f4Ld6SYoKi32N for ; Fri, 14 Sep 2012 11:06:33 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) (Authenticated sender: sandeen) by mail.sandeen.net (Postfix) with ESMTP id CC6084964604; Fri, 14 Sep 2012 13:06:33 -0500 (CDT) Message-ID: <50537229.1000801@sandeen.net> Date: Fri, 14 Sep 2012 13:06:33 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20120907 Thunderbird/15.0.1 MIME-Version: 1.0 To: Carlos Maiolino CC: xfs@oss.sgi.com Subject: Re: [PATCH 1/4] xfs: make inode64 as the default allocation mode References: <1347641381-30050-1-git-send-email-cmaiolino@redhat.com> <1347641381-30050-2-git-send-email-cmaiolino@redhat.com> X-ASG-Orig-Subj: Re: [PATCH 1/4] xfs: make inode64 as the default allocation mode In-Reply-To: <1347641381-30050-2-git-send-email-cmaiolino@redhat.com> X-Enigmail-Version: 1.4.4 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1347645993 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108537 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 9/14/12 11:49 AM, Carlos Maiolino wrote: > since 64-bit inodes can be accessed while using inode32, and these can also be > used on 32-bit kernels, there is no reason to still keep inode32 as the default > mount option. > > Signed-off-by: Carlos Maiolino > --- > fs/xfs/xfs_super.c | 12 ++++++++++-- > 1 file changed, 10 insertions(+), 2 deletions(-) > > diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c > index f1f2968..967d024 100644 > --- a/fs/xfs/xfs_super.c > +++ b/fs/xfs/xfs_super.c > @@ -88,6 +88,8 @@ mempool_t *xfs_ioend_pool; > * unwritten extent conversion */ > #define MNTOPT_NOBARRIER "nobarrier" /* .. disable */ > #define MNTOPT_64BITINODE "inode64" /* inodes can be allocated anywhere */ > +#define MNTOPT_32BITINODE "inode32" /* inode allocation limited to > + * XFS_MAXINUMBER_32 */ > #define MNTOPT_IKEEP "ikeep" /* do not free empty inode clusters */ > #define MNTOPT_NOIKEEP "noikeep" /* free empty inode clusters */ > #define MNTOPT_LARGEIO "largeio" /* report large I/O sizes in stat() */ > @@ -198,7 +200,6 @@ xfs_parseargs( > */ > mp->m_flags |= XFS_MOUNT_BARRIER; > mp->m_flags |= XFS_MOUNT_COMPAT_IOSIZE; > - mp->m_flags |= XFS_MOUNT_SMALL_INUMS; Self-note-taking. XFS_BIG_INUMS means the kernel itself is capable of > 32 bit inode nrs in struct inode. XFS_MOUNT_SMALL_INUMS is "users wants 32bit inodes " XFS_MOUNT_32BITINODES is "do not create inodes above 32 bits" MNTOPT_32BITINODE is the actual mount option string "inode32" I think rather than removing the line above, you might need to keep it under #if !XFS_BIG_INUMS mp->m_flags |= XFS_MOUNT_SMALL_INUMS; #endif so that "small" systems continue to enforce <= 32 bit inodes. > /* > * These can be overridden by the mount option parsing. > @@ -295,6 +296,13 @@ xfs_parseargs( > return EINVAL; > } > dswidth = simple_strtoul(value, &eov, 10); > + } else if (!strcmp(this_char, MNTOPT_32BITINODE)) { > + mp->m_flags |= XFS_MOUNT_SMALL_INUMS; > +#if !XFS_BIG_INUMS > + xfs_warn(mp, "%s option not allowed on this system", > + this_char); > + return EINVAL; > +#endif This looks wrong. If a user has a system which cannot handle 64 bit inodes, you reject a request to mount with 32-bit inodes? -Eric > } else if (!strcmp(this_char, MNTOPT_64BITINODE)) { > mp->m_flags &= ~XFS_MOUNT_SMALL_INUMS; > #if !XFS_BIG_INUMS > @@ -493,13 +501,13 @@ xfs_showargs( > { XFS_MOUNT_FILESTREAMS, "," MNTOPT_FILESTREAM }, > { XFS_MOUNT_GRPID, "," MNTOPT_GRPID }, > { XFS_MOUNT_DISCARD, "," MNTOPT_DISCARD }, > + { XFS_MOUNT_SMALL_INUMS, "," MNTOPT_32BITINODE }, > { 0, NULL } > }; > static struct proc_xfs_info xfs_info_unset[] = { > /* the few simple ones we can get from the mount struct */ > { XFS_MOUNT_COMPAT_IOSIZE, "," MNTOPT_LARGEIO }, > { XFS_MOUNT_BARRIER, "," MNTOPT_NOBARRIER }, > - { XFS_MOUNT_SMALL_INUMS, "," MNTOPT_64BITINODE }, > { 0, NULL } > }; > struct proc_xfs_info *xfs_infop; > From xfs-owner@oss.sgi.com Fri Sep 14 19:12:34 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.3 required=5.0 tests=BAYES_99,MIME_8BIT_HEADER autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8F0CXnf237929 for ; Fri, 14 Sep 2012 19:12:34 -0500 X-ASG-Debug-ID: 1347668018-04bdf0067c1c00d0001-w1Z2WR Received: from mail.postingtime.org (mail.postingtime.org [178.32.176.127]) by cuda.sgi.com with ESMTP id CXLvUvuFBz108JBl (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 14 Sep 2012 17:13:39 -0700 (PDT) X-Barracuda-Envelope-From: info@postingtime.org X-Barracuda-Apparent-Source-IP: 178.32.176.127 Received: (qmail 16889 invoked from network); 15 Sep 2012 03:13:43 +0300 Received: from 88.235.152.11.dynamic.ttnet.com.tr (HELO kkm-hp.local) (88.235.152.11) by mail.postingtime.org with (DHE-RSA-AES256-SHA encrypted) SMTP; 15 Sep 2012 03:13:43 +0300 Message-ID: From: "=?iso-8859-9?B?U2V2aW0gVHViYSBH3FJMRQ==?=" To: Subject: =?iso-8859-9?B?3W5naWxpemNlIFNvcnVudSBUYXJpaCBPbHV5b3IuLi4=?= Date: Sat, 15 Sep 2012 03:13:36 +0300 X-ASG-Orig-Subj: =?iso-8859-9?B?3W5naWxpemNlIFNvcnVudSBUYXJpaCBPbHV5b3IuLi4=?= MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-9" Content-Transfer-Encoding: quoted-printable X-Antivirus: avast! (VPS 120914-0, 14.09.2012), Outbound message X-Antivirus-Status: Clean X-Barracuda-Connect: mail.postingtime.org[178.32.176.127] X-Barracuda-Start-Time: 1347668019 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108561 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Merhaba =DDngilizceyi =E7ok uygun fiyatlarda =D6ZEL DERS alarak =F6=F0renmek = i=E7in benimle ileti=FEime ge=E7iniz. =DDngilizce Sorununu Uygun = Fiyatlarda =D6zel Ders Alarak =C7=F6zebilirsiniz Ayr=FDnt=FDl=FD Bilgi =DD=E7in L=FCtfen Beni arayn=FDz. 0212 252 90 35 = Dahili # 3 Sayg=FDlar=FDmla Sevim Tuba G=DCRLE KANADA K=DCLT=DCR MERKEZ=DD From raghu.prabhu13@gmail.com Fri Sep 14 21:16:22 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.7 required=5.0 tests=BAYES_00,FREEMAIL_FROM, J_CHICKENPOX_21,T_DKIM_INVALID,URI_OBFU_WWW autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8F2GMsN253757 for ; Fri, 14 Sep 2012 21:16:22 -0500 X-ASG-Debug-ID: 1347675448-04cb6c56881b2dd0001-NocioJ Received: from mail-pz0-f53.google.com (mail-pz0-f53.google.com [209.85.210.53]) by cuda.sgi.com with ESMTP id YzfoWDNZL9PRiEB3 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 14 Sep 2012 19:17:29 -0700 (PDT) X-Barracuda-Envelope-From: raghu.prabhu13@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.210.53 X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.53] Received: by dadg9 with SMTP id g9so3980436dad.26 for ; Fri, 14 Sep 2012 19:17:28 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.53] X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.53] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=date:from:to:cc:subject:message-id:mail-followup-to:references :mime-version:content-type:content-disposition:in-reply-to :x-operating-system:x-editor:user-agent; bh=X7T59u9Vgqkf5X3/SGQMnWjmk48YM1zG6hPofqvZwgk=; b=VS7Hh0CvvnKzu2M/GEEmFkTQiU0crlzazfYZgW5SwEk3rK2Y+lxIuM5tfT/8DMz1MJ pqr0zOBIMRRfGsI2Vmwb3b0zPuRHan2xHXH77US69XXQmSYststOy/XLyWpBa7eKLqou 5H3vziOyzNbo2qySgSjTA+F2fKzAKa7xedtMaTFXayMMhvasTikYYTzheqyS4N2Pb8pE zRJZ40bHIJNwrSB/U3ARRiCzUmd4wH4SvBw52zR8d6sEy81PGUMwHmDVGL9nj1Ka2TJJ iwECCU/CowWjzCq8GIl4IIwEzlUukK/5L8krvVicGLuF6q/b6BpluNam8rX+R1raQF7s 5LIw== Received: by 10.68.240.7 with SMTP id vw7mr7760120pbc.152.1347675448325; Fri, 14 Sep 2012 19:17:28 -0700 (PDT) Received: from localhost ([122.167.87.179]) by mx.google.com with ESMTPS id ka4sm2003500pbc.61.2012.09.14.19.17.25 (version=TLSv1/SSLv3 cipher=OTHER); Fri, 14 Sep 2012 19:17:27 -0700 (PDT) Date: Sat, 15 Sep 2012 07:47:23 +0530 From: Raghavendra D Prabhu To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: Re: [PATCH v5] Stop xfs_do_force_shutdown / messages fron xfs_log_force if filesystem is already shutdown. Message-ID: <20120915021723.GA58426@Archie.local> X-ASG-Orig-Subj: Re: Re: [PATCH v5] Stop xfs_do_force_shutdown / messages fron xfs_log_force if filesystem is already shutdown. Mail-Followup-To: Dave Chinner , xfs@oss.sgi.com References: <76577fa31ab2aa750994c1bc6a1b6f44beb03116.1347002369.git.rprabhu@wnohang.net> <20120911210512.GE11511@dastard> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="6c2NcOVqGQ03X4Wi" Content-Disposition: inline In-Reply-To: <20120911210512.GE11511@dastard> X-Operating-System: Arch linux x86_64 3.5.3-1-ARCH X-Editor: VIM - Vi IMproved 7.3 User-Agent: Mutt/1.5.21 (2011-07-01) X-Barracuda-Connect: mail-pz0-f53.google.com[209.85.210.53] X-Barracuda-Start-Time: 1347675449 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108571 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature --6c2NcOVqGQ03X4Wi Content-Type: text/plain; charset=us-ascii; format=flowed Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hi, * On Wed, Sep 12, 2012 at 07:05:12AM +1000, Dave Chinner wrote: >On Sat, Sep 08, 2012 at 03:28:11AM +0530, raghu.prabhu13@gmail.com wrote: >> From: Raghavendra D Prabhu =2E.... =2E... =2E.. >> >> Version 1: Removed calling xfs_syncd_stop from xfs_sync_worker. >> Version 2: Removed calling xfs_fs_writable in xfs_sync_worker and xfs_fl= ush_worker. >> Version 3: Removed calling xfs_syncd_stop in xfs_bwrite. >> Version 4: Added return statements to xfs_log_force and xfs_fs_sync_fs. >> Version 5: As per suggestion, added xfs_warn to xfs_fs_sync_fs and remov= ed EIO >> return in xfs_log_force >> >> Signed-off-by: Raghavendra D Prabhu >> Tested-by: Raghavendra D Prabhu > >Signed-off-by implies you tested it. Tested-by is used to >acknowledge third party testers, usually in the case to acknowledge >the fix was Tested-by the Reported-by... Sorry about that, I meant to add only the Signed-off part. > >And the signed-off-by belongs in the commit message (i.e. about the >first ---) not in the section after the commit message that is >stripped by the git tools. I will fix that. > >> --- >> fs/xfs/xfs_log.c | 5 ++++- >> fs/xfs/xfs_super.c | 5 +++++ >> 2 files changed, 9 insertions(+), 1 deletion(-) >> >> diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c >> index 7f4f937..161c925 100644 >> --- a/fs/xfs/xfs_log.c >> +++ b/fs/xfs/xfs_log.c >> @@ -3002,7 +3002,10 @@ xfs_log_force( >> >> trace_xfs_log_force(mp, 0); >> error =3D _xfs_log_force(mp, flags, NULL); >> - if (error) >> + /* >> + * Avoid warning when the filesystem has already shutdown. >> + */ >> + if (error && !XFS_FORCED_SHUTDOWN(mp)) >> xfs_warn(mp, "%s: error %d returned.", __func__, error); >> } >> >> diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c >> index bdaf4cb..ebafc99 100644 >> --- a/fs/xfs/xfs_super.c >> +++ b/fs/xfs/xfs_super.c >> @@ -943,6 +943,11 @@ xfs_fs_sync_fs( >> if (!wait) >> return 0; >> >> + if (XFS_FORCED_SHUTDOWN(mp)) { >> + xfs_warn(mp, "Sync called: filesystem already shutdown"); >> + return XFS_ERROR(EIO); >> + } > >Why should we emit a warning here? There's already information in the >log to indicate the filesystem is shut down... Actually in a previous review, you had suggested to add=20 information about it since 'sync' is called manually/less=20 often, so better to have more verbosity about it and user gets=20 feedback on it. So, is this fine? > >Cheers, > >Dave. >--=20 >Dave Chinner >david@fromorbit.com > Regards, --=20 Raghavendra Prabhu GPG Id : 0xD72BE977 Fingerprint: B93F EBCB 8E05 7039 CD3C A4B8 A616 DCA1 D72B E977 www: wnohang.net --6c2NcOVqGQ03X4Wi Content-Type: application/pgp-signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.19 (GNU/Linux) iQEcBAEBAgAGBQJQU+UzAAoJEKYW3KHXK+l3Gz0H/1NTy3T5VE1LEcJC9n5aLqXU 2Om+wg9ogw8yJFOSTRStOj3G758yheQk3ldQs0PS5OxHN0oZvmRdpDjSZJmAK8we jG+uZ8de6BdrfkiHvvYkd9r58AEqUz4EyI3r54mzQYG36UOhzbl1ayK9o59ITmQQ WynYywVqkc09/xcAvltmHaHLtCSchrlpEaRZfi1rSjjw1NUXoxP9uz9pDNo7HRC1 syWSXXvlPazM8vVkkgWbvFAwzWenwnerlb0EGDpPNtsO3DDpOo0shzkINt3P6JsB DH5CrmDgJeqfcJOzC/258kp42GZyygGdEOejcCuQe5iQ5B6KyVA7vgRpB44p+TY= =vbE/ -----END PGP SIGNATURE----- --6c2NcOVqGQ03X4Wi-- From apache@ds68.mirohost.net Sat Sep 15 00:20:15 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.6 required=5.0 tests=BAYES_50,FREEMAIL_FROM, J_CHICKENPOX_12,J_CHICKENPOX_32,MIME_8BIT_HEADER,SUBJECT_NEEDS_ENCODING, SUBJ_ILLEGAL_CHARS,URIBL_BLACK autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8F5KEhG011789 for ; Sat, 15 Sep 2012 00:20:15 -0500 X-ASG-Debug-ID: 1347686478-04cbb07ce31c0770001-NocioJ Received: from ds68.mirohost.net (ds68.mirohost.net [89.184.68.183]) by cuda.sgi.com with ESMTP id NsB8hcVwfb5RoE7c (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 14 Sep 2012 22:21:19 -0700 (PDT) X-Barracuda-Envelope-From: apache@ds68.mirohost.net X-Barracuda-Apparent-Source-IP: 89.184.68.183 Received: from apache by ds68.mirohost.net with local (Exim 4.69) (envelope-from ) id 1TCkof-0006Pv-EQ for xfs@oss.sgi.com; Sat, 15 Sep 2012 08:21:17 +0300 To: ".......Good day!" Subject: Âàø çíàêîìûé 116 ....... $632 per day with mobile?...................................................................... ðåêîìåíäóåò Âàì òîâàð íà ñàéòå Suzanna Boutique From: "116 .......[VIDEO] $632 per day with mobile?......................................................................" X-ASG-Orig-Subj: Âàø çíàêîìûé 116 ....... $632 per day with mobile?...................................................................... ðåêîìåíäóåò Âàì òîâàð íà ñàéòå Suzanna Boutique MIME-Version: 1.0 X-Mailer: Etechs Mailer Content-Type: text/plain; charset="windows-1251" Content-Transfer-Encoding: 7bit Message-Id: Date: Sat, 15 Sep 2012 08:21:17 +0300 X-Barracuda-Connect: ds68.mirohost.net[89.184.68.183] X-Barracuda-Start-Time: 1347686479 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 1.63 X-Barracuda-Spam-Status: No, SCORE=1.63 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC1_SA048b, SUBJECT_NEEDS_ENCODING X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108583 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.35 BSF_SC1_SA048b BODY: Custom Rule SA048b 1.28 SUBJECT_NEEDS_ENCODING SUBJECT_NEEDS_ENCODING Çäðàâñòâóéòå .......Good day!! Âàø çíàêîìûé, 116 ....... $632 per day with mobile?......................................................................, ðåêîìåíäóåò Âàì ïîñìîòðåòü "Ñåðåæêè "Chihuahua Cutie" " íà ñàéòå Suzanna Boutique. ×òîáû ïîñìîòðåòü ýòîò òîâàð, ùåëêíèòå, ïîæàëóéñòà, íà ññûëêó íèæå èëè ñêîïèðóéòå è âñòàâüòå ññûëêó â Âàø áðàóçåð: http://suzannaboutique.com/p469-Serezhki_Chihuahua_Cutie Äîïîëíèòåëüíî (íàïèñàë 116 ....... $632 per day with mobile?......................................................................): Hey- This video puts every mobile "breakthrough" I?ve seen to shame... http://processing-email.co.cc/aff/item.php?usn=aeb4&i=it_aw&e=xfs@oss.sgi.com ...a truly automated method that finally puts the full potential of fast ? even 100% FREE - mobile traffic at your fingertips... AND... ...At the same time, serves you up a "done-for-you" means to profit from all that traffic from day one, and I'll show you real time proof of that in just a second. But it's not just the profits alone - up to $632.83 in one day - that make this so different from anything you?ve seen... Even crazier is that the White House was impressed enough to honor the 20-year-old marketing maverick who created it... Check it out: http://processing-email.co.cc/aff/item.php?usn=aeb4&i=it_aw&e=xfs@oss.sgi.com Talk soon, Mark S. usa-ca Removal link: http://processing-email.co.cc/un.php?e=xfs@oss.sgi.com . Ñ óâàæåíèåì, Suzanna Boutique http://suzannaboutique.com/ From richard.ems@cape-horn-eng.com Mon Sep 17 09:55:12 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8HEtB5F173932 for ; Mon, 17 Sep 2012 09:55:11 -0500 X-ASG-Debug-ID: 1347893780-04cb6c56852b40a0001-NocioJ Received: from smtprelay06.ispgateway.de (smtprelay06.ispgateway.de [80.67.31.95]) by cuda.sgi.com with ESMTP id fBG9MK3ylx27zXFx for ; Mon, 17 Sep 2012 07:56:21 -0700 (PDT) X-Barracuda-Envelope-From: richard.ems@cape-horn-eng.com X-Barracuda-Apparent-Source-IP: 80.67.31.95 X-ASG-Whitelist: Client Received: from [62.43.225.238] (helo=localhost) by smtprelay06.ispgateway.de with esmtpsa (TLSv1:AES256-SHA:256) (Exim 4.68) (envelope-from ) id 1TDckF-0005lA-Ve for xfs@oss.sgi.com; Mon, 17 Sep 2012 16:56:20 +0200 Message-ID: <50573A13.7000206@cape-horn-eng.com> Date: Mon, 17 Sep 2012 16:56:19 +0200 From: Richard Ems User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:15.0) Gecko/20120825 Thunderbird/15.0 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: XFS (sdd1): Internal error xfs_da_do_buf(2) at line 2097 of file /usr/src/packages/BUILD/kernel-default-3.3.6/linux-3.3/fs/xfs/xfs_da_btree.c. X-Enigmail-Version: 1.4.4 X-ASG-Orig-Subj: XFS (sdd1): Internal error xfs_da_do_buf(2) at line 2097 of file /usr/src/packages/BUILD/kernel-default-3.3.6/linux-3.3/fs/xfs/xfs_da_btree.c. Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-Df-Sender: cmljaGFyZC5lbXNAY2FwZS1ob3JuLWVuZy5jb20= X-Barracuda-Connect: smtprelay06.ispgateway.de[80.67.31.95] X-Barracuda-Start-Time: 1347893781 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com Hi all, saturday morning one hard disc on our RAID6 failed. About one hour later, the XFS running on that device reported the following error: XFS (sdd1): Internal error xfs_da_do_buf(2) at line 2097 of file /usr/src/packages/BUILD/kernel-default-3.3.6/linux-3.3/fs/xfs/xfs_da_btree.c. We run openSUSE 12.1 64 bit, kernel 3.3.6, on a DELL R410 server, with 4 MD1200 storage systems attached. The failed disc was on one of these MD1200, configured with 11 x 3 TB discs on a RAID 6 and one hot standby disc. A rebuild started on the standby disc immediately and finished several hours later. But, and as mentioned above, about one hour after the disc failure the above error was reported and the mountpoint was set to read-only mode. This error got reported 228664 times in 23 hours: fs1:/var/log # grep -c -i "XFS .* Internal error xfs_da_do_buf(2)" messages-20120916 228664 fs1:/var/log # grep -i "XFS .* Internal error xfs_da_do_buf(2)" messages-20120916 | head -n 1 Sep 15 07:30:51 fs1 kernel: [7369085.790742] XFS (sdd1): Internal error xfs_da_do_buf(2) at line 2097 of file /usr/src/packages/BUILD/kernel-default-3.3.6/linux-3.3/fs/xfs/xfs_da_btree.c. Caller 0xffffffffa038a09a fs1:/var/log # grep -i "XFS .* Internal error xfs_da_do_buf(2)" messages-20120916 | tail -n 1 Sep 16 06:30:00 fs1 kernel: [7451668.512765] XFS (sdd1): Internal error xfs_da_do_buf(2) at line 2097 of file /usr/src/packages/BUILD/kernel-default-3.3.6/linux-3.3/fs/xfs/xfs_da_btree.c. Caller 0xffffffffa038a09a The complete stack trace reported is: Sep 15 07:30:51 fs1 kernel: [7369085.790735] ffff8801fd805000: 6f 86 00 0f 9d 38 00 15 26 1c 00 aa e3 17 00 a7 o....8..&....... Sep 15 07:30:51 fs1 kernel: [7369085.790742] XFS (sdd1): Internal error xfs_da_do_buf(2) at line 2097 of file /usr/src/packages/BUILD/kernel-default-3.3.6/linux-3.3/fs/xfs/xfs_da_btree.c. Caller 0xffffffffa038a09a Sep 15 07:30:51 fs1 kernel: [7369085.790745] Sep 15 07:30:51 fs1 kernel: [7369085.790749] Pid: 16081, comm: rsync Not tainted 3.3.6-1-default #1 Sep 15 07:30:51 fs1 kernel: [7369085.790752] Call Trace: Sep 15 07:30:51 fs1 kernel: [7369085.790766] [] dump_trace+0x78/0x320 Sep 15 07:30:51 fs1 kernel: [7369085.790775] [] dump_stack+0x69/0x6f Sep 15 07:30:51 fs1 kernel: [7369085.790804] [] xfs_corruption_error+0x62/0x90 [xfs] Sep 15 07:30:51 fs1 kernel: [7369085.790858] [] xfs_da_do_buf+0x5fa/0x680 [xfs] Sep 15 07:30:51 fs1 kernel: [7369085.790961] [] xfs_da_read_buf+0x1a/0x20 [xfs] Sep 15 07:30:51 fs1 kernel: [7369085.791061] [] xfs_dir2_leaf_lookup_int+0x60/0x300 [xfs] Sep 15 07:30:51 fs1 kernel: [7369085.791169] [] xfs_dir2_leaf_lookup+0x25/0x100 [xfs] Sep 15 07:30:51 fs1 kernel: [7369085.791275] [] xfs_dir_lookup+0x187/0x1a0 [xfs] Sep 15 07:30:51 fs1 kernel: [7369085.791376] [] xfs_lookup+0xb0/0x110 [xfs] Sep 15 07:30:51 fs1 kernel: [7369085.791442] [] xfs_vn_lookup+0x42/0x90 [xfs] Sep 15 07:30:51 fs1 kernel: [7369085.791496] [] d_alloc_and_lookup+0x3c/0x90 Sep 15 07:30:51 fs1 kernel: [7369085.791505] [] do_lookup+0x2a3/0x3a0 Sep 15 07:30:51 fs1 kernel: [7369085.791514] [] do_last+0xef/0x7d0 Sep 15 07:30:51 fs1 kernel: [7369085.791524] [] path_openat+0xdc/0x400 Sep 15 07:30:51 fs1 kernel: [7369085.791532] [] do_filp_open+0x4d/0xc0 Sep 15 07:30:51 fs1 kernel: [7369085.791542] [] do_sys_open+0x102/0x1e0 Sep 15 07:30:51 fs1 kernel: [7369085.791552] [] system_call_fastpath+0x16/0x1b Sep 15 07:30:51 fs1 kernel: [7369085.791569] [<00007f2e079aadf0>] 0x7f2e079aadef Sep 15 07:30:51 fs1 kernel: [7369085.791574] XFS (sdd1): Corruption detected. Unmount and run xfs_repair Sep 15 07:30:51 fs1 kernel: [7369085.791836] ffff8801fd805000: 6f 86 00 0f 9d 38 00 15 26 1c 00 aa e3 17 00 a7 o....8..&....... Sep 15 07:30:51 fs1 kernel: [7369085.791842] XFS (sdd1): Internal error xfs_da_do_buf(2) at line 2097 of file /usr/src/packages/BUILD/kernel-default-3.3.6/linux-3.3/fs/xfs/xfs_da_btree.c. Caller 0xffffffffa038a09a Sep 15 07:30:51 fs1 kernel: [7369085.791849] Sep 15 07:30:51 fs1 kernel: [7369085.791851] Pid: 16081, comm: rsync Not tainted 3.3.6-1-default #1 Sep 15 07:30:51 fs1 kernel: [7369085.791854] Call Trace: Sep 15 07:30:51 fs1 kernel: [7369085.791864] [] dump_trace+0x78/0x320 Sep 15 07:30:51 fs1 kernel: [7369085.791869] [] dump_stack+0x69/0x6f Sep 15 07:30:51 fs1 kernel: [7369085.791887] [] xfs_corruption_error+0x62/0x90 [xfs] Sep 15 07:30:51 fs1 kernel: [7369085.791937] [] xfs_da_do_buf+0x5fa/0x680 [xfs] Sep 15 07:30:51 fs1 kernel: [7369085.792039] [] xfs_da_read_buf+0x1a/0x20 [xfs] Sep 15 07:30:51 fs1 kernel: [7369085.792140] [] xfs_dir2_leaf_lookup_int+0x60/0x300 [xfs] Sep 15 07:30:51 fs1 kernel: [7369085.792247] [] xfs_dir2_leaf_lookup+0x25/0x100 [xfs] Sep 15 07:30:51 fs1 kernel: [7369085.792354] [] xfs_dir_lookup+0x187/0x1a0 [xfs] Sep 15 07:30:51 fs1 kernel: [7369085.792455] [] xfs_lookup+0xb0/0x110 [xfs] Sep 15 07:30:51 fs1 kernel: [7369085.792522] [] xfs_vn_lookup+0x42/0x90 [xfs] Sep 15 07:30:51 fs1 kernel: [7369085.792562] [] d_alloc_and_lookup+0x3c/0x90 Sep 15 07:30:51 fs1 kernel: [7369085.792569] [] do_lookup+0x2a3/0x3a0 Sep 15 07:30:51 fs1 kernel: [7369085.792577] [] path_lookupat+0x135/0x730 Sep 15 07:30:51 fs1 kernel: [7369085.792585] [] do_path_lookup+0x2c/0xd0 Sep 15 07:30:51 fs1 kernel: [7369085.792592] [] user_path_at_empty+0x5c/0xb0 Sep 15 07:30:51 fs1 kernel: [7369085.792597] [] vfs_fstatat+0x3e/0x90 Sep 15 07:30:51 fs1 kernel: [7369085.792603] [] sys_newlstat+0x1f/0x50 Sep 15 07:30:51 fs1 kernel: [7369085.792609] [] system_call_fastpath+0x16/0x1b Sep 15 07:30:51 fs1 kernel: [7369085.792616] [<00007f2e079aa4c5>] 0x7f2e079aa4c4 Sep 15 07:30:51 fs1 kernel: [7369085.792619] XFS (sdd1): Corruption detected. Unmount and run xfs_repair And this repeating again and again ... This system has been running fine for 87 days, no power outages or such. It's connected to an UPS, and the H800 Raid Controller has a BBU installed. The XFS is mounted with these options: /dev/sdd1 on /data_1 type xfs (rw,noatime,attr2,nobarrier,inode64,logbufs=8,logbsize=256k,sunit=128,swidth=1152,noquota,_netdev) After running xfs_repair on it, the XFS could be mounted again, BUT several dirs and plain files were put into lost+found: fs1:/data_1/lost+found # find . -type d | wc -l 115 fs1:/data_1/lost+found # find . -type f | wc -l 479 I have the full xfs_repair output. It's 56 MB uncompressed, and 1.1 MB gzipped. Should I attach/send it here? Why could this have happened? What more info can I provide to understand this issue and avoid this to happen again? Many thanks, Richard -- Richard Ems mail: Richard.Ems@Cape-Horn-Eng.com Cape Horn Engineering S.L. C/ Dr. J.J. Dómine 1, 5º piso 46011 Valencia Tel : +34 96 3242923 / Fax 924 http://www.cape-horn-eng.com From cmaiolino@redhat.com Mon Sep 17 10:07:01 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8HF71RA175409 for ; Mon, 17 Sep 2012 10:07:01 -0500 X-ASG-Debug-ID: 1347894490-04cb6c56862b5040001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id jP5utCs82nrvNcj8 for ; Mon, 17 Sep 2012 08:08:11 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8HF8AeM011934 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 17 Sep 2012 11:08:10 -0400 Received: from andromeda.usersys.redhat.com (ovpn-113-119.phx2.redhat.com [10.3.113.119]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q8HF87vb016825 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO) for ; Mon, 17 Sep 2012 11:08:10 -0400 Date: Mon, 17 Sep 2012 12:08:06 -0300 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: Re: [PATCH 1/4] xfs: make inode64 as the default allocation mode Message-ID: <20120917150806.GA1957@andromeda.usersys.redhat.com> X-ASG-Orig-Subj: Re: [PATCH 1/4] xfs: make inode64 as the default allocation mode Mail-Followup-To: xfs@oss.sgi.com References: <1347641381-30050-1-git-send-email-cmaiolino@redhat.com> <1347641381-30050-2-git-send-email-cmaiolino@redhat.com> <50537229.1000801@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50537229.1000801@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.22 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1347894491 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com On Fri, Sep 14, 2012 at 01:06:33PM -0500, Eric Sandeen wrote: > This looks wrong. If a user has a system which cannot handle 64 bit inodes, > you reject a request to mount with 32-bit inodes? > Yeah, you're right, thanks for the review. I'm fixing these mistakes and will re-send the patchset -- --Carlos From bfoster@redhat.com Mon Sep 17 10:14:01 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8HFE03F176165 for ; Mon, 17 Sep 2012 10:14:01 -0500 X-ASG-Debug-ID: 1347894910-04cbb07ce2308ba0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id dbSW7la5mcXqBiQx for ; Mon, 17 Sep 2012 08:15:10 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8HFFAPc013651 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 17 Sep 2012 11:15:10 -0400 Received: from bfoster.bfoster ([10.16.225.83]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q8HFF9Pq023601 for ; Mon, 17 Sep 2012 11:15:10 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 1FA8D120611; Mon, 17 Sep 2012 11:15:35 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH] xfstests: fix TEST_MNT typos (should be TEST_DIR) Date: Mon, 17 Sep 2012 11:15:35 -0400 X-ASG-Orig-Subj: [PATCH] xfstests: fix TEST_MNT typos (should be TEST_DIR) Message-Id: <1347894935-1495-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1347894910 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com We mistakenly use TEST_MNT in tests 222 and 253, which is undefined. Replace these two instances with TEST_DIR. Signed-off-by: Brian Foster --- 222 | 2 +- 253 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/222 b/222 index a65c845..df2672f 100755 --- a/222 +++ b/222 @@ -51,7 +51,7 @@ _supported_os Linux [ "$XFS_FSR_PROG" = "" ] && _notrun "xfs_fsr not found" -xfs_fsr -d -v $TEST_MNT > $seq.full 2>&1 +xfs_fsr -d -v $TEST_DIR > $seq.full 2>&1 echo "--- silence is golden ---" status=0 ; exit diff --git a/253 b/253 index d8c94a2..4d0b4c2 100755 --- a/253 +++ b/253 @@ -59,7 +59,7 @@ _require_scratch # real QA test starts here OUTPUT_DIR="${SCRATCH_MNT}/test_${seq}" -METADUMP_FILE="${TEST_MNT}/${seq}_metadump" +METADUMP_FILE="${TEST_DIR}/${seq}_metadump" ORPHANAGE="lost+found" _supported_fs xfs -- 1.7.7.6 From chris.friesen@genband.com Mon Sep 17 11:03:45 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8HG3jb5181199 for ; Mon, 17 Sep 2012 11:03:45 -0500 X-ASG-Debug-ID: 1347897893-04cbb07ce5318fa0001-NocioJ Received: from exprod7og120.obsmtp.com (exprod7og120.obsmtp.com [64.18.2.18]) by cuda.sgi.com with SMTP id bQ9nFbrnfFDwvJjx (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 17 Sep 2012 09:04:54 -0700 (PDT) X-Barracuda-Envelope-From: chris.friesen@genband.com X-Barracuda-RBL-Trusted-Forwarder: 64.18.2.18 Received: from mail.genband.com ([63.149.188.88]) (using TLSv1) by exprod7ob120.postini.com ([64.18.6.12]) with SMTP ID DSNKUFdKJXFvsQrTyKzfqp3tZsetdkZHGS3j@postini.com; Mon, 17 Sep 2012 09:04:54 PDT Received: from gbausmail.genband.com ([172.16.21.62]) by mail.genband.com with Microsoft SMTPSVC(6.0.3790.4675); Mon, 17 Sep 2012 10:51:38 -0500 X-Barracuda-Apparent-Source-IP: 63.149.188.88 X-Barracuda-BBL-IP: 63.149.188.88 X-Barracuda-RBL-IP: 63.149.188.88 Received: from [1.220.37.83] ([1.220.37.83]) by gbausmail.genband.com with Microsoft SMTPSVC(6.0.3790.4675); Mon, 17 Sep 2012 10:51:38 -0500 Message-ID: <50574709.9000301@genband.com> Date: Mon, 17 Sep 2012 09:51:37 -0600 From: Chris Friesen User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.24) Gecko/20111108 Fedora/3.1.16-1.fc14 Lightning/1.0b3pre Thunderbird/3.1.16 MIME-Version: 1.0 To: Ben Myers , Alex Elder , xfs@oss.sgi.com Subject: given a pointer to xfs_inode_t, how to determine path? Content-Type: text/plain; charset=ISO-8859-1; format=flowed X-ASG-Orig-Subj: given a pointer to xfs_inode_t, how to determine path? Content-Transfer-Encoding: 7bit X-OriginalArrivalTime: 17 Sep 2012 15:51:38.0395 (UTC) FILETIME=[52AE26B0:01CD94EC] X-Barracuda-Connect: exprod7og120.obsmtp.com[64.18.2.18] X-Barracuda-Start-Time: 1347897894 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.23 X-Barracuda-Spam-Status: No, SCORE=0.23 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RCVD_ILLEGAL_IP X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108806 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.23 RCVD_ILLEGAL_IP Received: contains illegal IP address Hi, We're running 2.6.27 (upgrading not currently possible, embedded product). We had a situation arise where we could see in stack traces that a number of tasks were stuck in vn_iowait(). That function takes a pointer to xfs_inode_t. Given that, would it be possible to work backwards to determine a filesystem path corresponding to that inode? I realize it would likely only go back to the head of the filesystem, but that would be fine. Thanks, Chris -- Chris Friesen Software Designer 3500 Carling Avenue Ottawa, Ontario K2H 8E9 www.genband.com From bpm@sgi.com Mon Sep 17 11:20:14 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8HGKDPO183019 for ; Mon, 17 Sep 2012 11:20:13 -0500 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay1.corp.sgi.com (Postfix) with ESMTP id 51F2F8F8033; Mon, 17 Sep 2012 09:21:21 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id E1CEE4266DC; Mon, 17 Sep 2012 11:21:20 -0500 (CDT) Date: Mon, 17 Sep 2012 11:21:20 -0500 From: Ben Myers To: Chris Friesen Cc: Alex Elder , xfs@oss.sgi.com Subject: Re: given a pointer to xfs_inode_t, how to determine path? Message-ID: <20120917162120.GG25175@sgi.com> References: <50574709.9000301@genband.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50574709.9000301@genband.com> User-Agent: Mutt/1.5.20 (2009-06-14) Hi Chris, On Mon, Sep 17, 2012 at 09:51:37AM -0600, Chris Friesen wrote: > We're running 2.6.27 (upgrading not currently possible, embedded product). > > We had a situation arise where we could see in stack traces that a > number of tasks were stuck in vn_iowait(). That function takes a > pointer to xfs_inode_t. Given that, would it be possible to work > backwards to determine a filesystem path corresponding to that > inode? I realize it would likely only go back to the head of the > filesystem, but that would be fine. Yep, it's possible. echo t > /proc/sysrq-trigger won't give you the full stack, but you may be able to get an idea of what is going on, well enough to make some guesses as to the culprit. That's probably your best first step. If you have crash installed: 1) disassemble vn_iowait and find out which register the xfs_inode_t pointer is in. 2) print out the full stacks of all the processes in the system. 'bt -f', I think. 3) grep for the xfs_inode_t pointer on those stacks. Regards, Ben From cmaiolino@redhat.com Mon Sep 17 11:50:42 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8HGofKJ186611 for ; Mon, 17 Sep 2012 11:50:42 -0500 X-ASG-Debug-ID: 1347900711-04cb6c56872bbe40001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id pYigfHC2IIBdGhFH for ; Mon, 17 Sep 2012 09:51:51 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8HGpps3002742 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 17 Sep 2012 12:51:51 -0400 Received: from andromeda.usersys.redhat.com (ovpn-113-119.phx2.redhat.com [10.3.113.119]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id q8HGpopG016371 for ; Mon, 17 Sep 2012 12:51:50 -0400 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: [PATCH 0/4 V2] inode32/inode64 allocation changes Date: Mon, 17 Sep 2012 13:51:38 -0300 X-ASG-Orig-Subj: [PATCH 0/4 V2] inode32/inode64 allocation changes Message-Id: <1347900702-23421-1-git-send-email-cmaiolino@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1347900711 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com This patch set adds inode64 as the default allocation mode, but also includes 2 patches to remove duplicated code and another one to make inode32 able to be remounted. NOTE: This patch has as dependency "Make inode64 a remountable option" patch. Carlos Maiolino (4): xfs: make inode64 as the default allocation mode xfs: add xfs_set_inode32() xfs: set xfs_initialize_perag() to use xfs_set_inode32/64() xfs: Make inode32 a remountable option fs/xfs/xfs_mount.c | 43 +++---------------- fs/xfs/xfs_super.c | 120 +++++++++++++++++++++++++++++++++++++++++------------ fs/xfs/xfs_super.h | 2 + 3 files changed, 101 insertions(+), 64 deletions(-) -- 1.7.11.4 From cmaiolino@redhat.com Mon Sep 17 11:50:46 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8HGok48186634 for ; Mon, 17 Sep 2012 11:50:46 -0500 X-ASG-Debug-ID: 1347900716-04cbb07ce2326c30001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id dY4GyODIO6dCmKS1 for ; Mon, 17 Sep 2012 09:51:56 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8HGpuGh009285 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 17 Sep 2012 12:51:56 -0400 Received: from andromeda.usersys.redhat.com (ovpn-113-119.phx2.redhat.com [10.3.113.119]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id q8HGpopH016371 for ; Mon, 17 Sep 2012 12:51:55 -0400 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: [PATCH 1/4] xfs: make inode64 as the default allocation mode Date: Mon, 17 Sep 2012 13:51:39 -0300 X-ASG-Orig-Subj: [PATCH 1/4] xfs: make inode64 as the default allocation mode Message-Id: <1347900702-23421-2-git-send-email-cmaiolino@redhat.com> In-Reply-To: <1347900702-23421-1-git-send-email-cmaiolino@redhat.com> References: <1347900702-23421-1-git-send-email-cmaiolino@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1347900716 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com since 64-bit inodes can be accessed while using inode32, and these can also be used on 32-bit kernels, there is no reason to still keep inode32 as the default mount option. Signed-off-by: Carlos Maiolino --- fs/xfs/xfs_super.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index f1f2968..b1aa2db 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -88,6 +88,8 @@ mempool_t *xfs_ioend_pool; * unwritten extent conversion */ #define MNTOPT_NOBARRIER "nobarrier" /* .. disable */ #define MNTOPT_64BITINODE "inode64" /* inodes can be allocated anywhere */ +#define MNTOPT_32BITINODE "inode32" /* inode allocation limited to + * XFS_MAXINUMBER_32 */ #define MNTOPT_IKEEP "ikeep" /* do not free empty inode clusters */ #define MNTOPT_NOIKEEP "noikeep" /* free empty inode clusters */ #define MNTOPT_LARGEIO "largeio" /* report large I/O sizes in stat() */ @@ -198,7 +200,9 @@ xfs_parseargs( */ mp->m_flags |= XFS_MOUNT_BARRIER; mp->m_flags |= XFS_MOUNT_COMPAT_IOSIZE; +#if !XFS_BIG_INUMS mp->m_flags |= XFS_MOUNT_SMALL_INUMS; +#endif /* * These can be overridden by the mount option parsing. @@ -295,6 +299,8 @@ xfs_parseargs( return EINVAL; } dswidth = simple_strtoul(value, &eov, 10); + } else if (!strcmp(this_char, MNTOPT_32BITINODE)) { + mp->m_flags |= XFS_MOUNT_SMALL_INUMS; } else if (!strcmp(this_char, MNTOPT_64BITINODE)) { mp->m_flags &= ~XFS_MOUNT_SMALL_INUMS; #if !XFS_BIG_INUMS @@ -493,13 +499,13 @@ xfs_showargs( { XFS_MOUNT_FILESTREAMS, "," MNTOPT_FILESTREAM }, { XFS_MOUNT_GRPID, "," MNTOPT_GRPID }, { XFS_MOUNT_DISCARD, "," MNTOPT_DISCARD }, + { XFS_MOUNT_SMALL_INUMS, "," MNTOPT_32BITINODE }, { 0, NULL } }; static struct proc_xfs_info xfs_info_unset[] = { /* the few simple ones we can get from the mount struct */ { XFS_MOUNT_COMPAT_IOSIZE, "," MNTOPT_LARGEIO }, { XFS_MOUNT_BARRIER, "," MNTOPT_NOBARRIER }, - { XFS_MOUNT_SMALL_INUMS, "," MNTOPT_64BITINODE }, { 0, NULL } }; struct proc_xfs_info *xfs_infop; -- 1.7.11.4 From cmaiolino@redhat.com Mon Sep 17 11:50:53 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8HGoqc6186663 for ; Mon, 17 Sep 2012 11:50:53 -0500 X-ASG-Debug-ID: 1347900722-04bdf0067c2ce220001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 9URdQQOjOd0IdLjc for ; Mon, 17 Sep 2012 09:52:02 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8HGq15K009319 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 17 Sep 2012 12:52:01 -0400 Received: from andromeda.usersys.redhat.com (ovpn-113-119.phx2.redhat.com [10.3.113.119]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id q8HGpopI016371 for ; Mon, 17 Sep 2012 12:52:01 -0400 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: [PATCH 2/4] xfs: add xfs_set_inode32() Date: Mon, 17 Sep 2012 13:51:40 -0300 X-ASG-Orig-Subj: [PATCH 2/4] xfs: add xfs_set_inode32() Message-Id: <1347900702-23421-3-git-send-email-cmaiolino@redhat.com> In-Reply-To: <1347900702-23421-1-git-send-email-cmaiolino@redhat.com> References: <1347900702-23421-1-git-send-email-cmaiolino@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1347900722 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com xfs_set_inode32() can be used to enable inode32 allocation mode. this will reduce the amount of duplicated code needed to mount/remount a filesystem with inode32 option. This patch also enable xfs_set_inode64() to return a xfs_agnumber_t value to also be used during mount/remount, instead of duplicate code Signed-off-by: Carlos Maiolino --- fs/xfs/xfs_super.c | 102 ++++++++++++++++++++++++++++++++++++++++------------- fs/xfs/xfs_super.h | 2 ++ 2 files changed, 80 insertions(+), 24 deletions(-) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index b1aa2db..2d7a0d9 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -598,6 +598,84 @@ xfs_max_file_offset( return (((__uint64_t)pagefactor) << bitshift) - 1; } +xfs_agnumber_t +xfs_set_inode64(struct xfs_mount *mp) +{ + xfs_agnumber_t index = 0; + + for (index = 0; index < mp->m_sb.sb_agcount; index++) { + struct xfs_perag *pag; + + pag = xfs_perag_get(mp, index); + pag->pagi_inodeok = 1; + pag->pagf_metadata = 0; + xfs_perag_put(pag); + } + + /* There is no need for lock protection on m_flags, + * the rw_semaphore of the VFS superblock is locked + * during mount/umount/remount operations, so this is + * enough to avoid concurency on the m_flags field + */ + mp->m_flags &= ~(XFS_MOUNT_32BITINODES | + XFS_MOUNT_SMALL_INUMS); + mp->m_maxagi = index; + + return index; +} + +xfs_agnumber_t +xfs_set_inode32(struct xfs_mount *mp) +{ + xfs_agnumber_t index; + xfs_agnumber_t i = 0; + xfs_sb_t *sbp = &mp->m_sb; + xfs_agnumber_t max_metadata; + xfs_agino_t agino = XFS_OFFBNO_TO_AGINO(mp, sbp->sb_agblocks -1, 0); + xfs_ino_t ino = XFS_AGINO_TO_INO(mp, sbp->sb_agcount -1, agino); + xfs_perag_t *pag; + + /* Calculate how much should be reserved for inodes to meet + * the max inode percentage. + */ + if (mp->m_maxicount) { + __uint64_t icount; + + icount = sbp->sb_dblocks * sbp->sb_imax_pct; + do_div(icount, 100); + icount += sbp->sb_agblocks - 1; + do_div(icount, sbp->sb_agblocks); + max_metadata = icount; + } else { + max_metadata = sbp->sb_agcount; + } + + for (index = 0; index < sbp->sb_agcount; index++) { + ino = XFS_AGINO_TO_INO(mp, index, agino); + + if (ino > XFS_MAXINUMBER_32) { + i++; + pag = xfs_perag_get(mp, index); + pag->pagi_inodeok = 0; + pag->pagf_metadata = 1; + xfs_perag_put(pag); + continue; + } + + pag = xfs_perag_get(mp, index); + pag->pagi_inodeok = 1; + if (index < max_metadata) + pag->pagf_metadata = 1; + + xfs_perag_put(pag); + } + + index -= i; + mp->m_flags |= (XFS_MOUNT_32BITINODES | + XFS_MOUNT_SMALL_INUMS); + return index; +} + STATIC int xfs_blkdev_get( xfs_mount_t *mp, @@ -1037,30 +1115,6 @@ xfs_restore_resvblks(struct xfs_mount *mp) xfs_reserve_blocks(mp, &resblks, NULL); } -STATIC void -xfs_set_inode64(struct xfs_mount *mp) -{ - int i = 0; - - for (i = 0; i < mp->m_sb.sb_agcount; i++) { - struct xfs_perag *pag; - - pag = xfs_perag_get(mp, i); - pag->pagi_inodeok = 1; - pag->pagf_metadata = 0; - xfs_perag_put(pag); - } - - /* There is no need for lock protection on m_flags, - * the rw_semaphore of the VFS superblock is locked - * during mount/umount/remount operations, so this is - * enough to avoid concurency on the m_flags field - */ - mp->m_flags &= ~(XFS_MOUNT_32BITINODES | - XFS_MOUNT_SMALL_INUMS); - mp->m_maxagi = i; -} - STATIC int xfs_fs_remount( struct super_block *sb, diff --git a/fs/xfs/xfs_super.h b/fs/xfs/xfs_super.h index 09b0c26..9de4a92 100644 --- a/fs/xfs/xfs_super.h +++ b/fs/xfs/xfs_super.h @@ -75,6 +75,8 @@ struct block_device; extern __uint64_t xfs_max_file_offset(unsigned int); extern void xfs_blkdev_issue_flush(struct xfs_buftarg *); +extern xfs_agnumber_t xfs_set_inode32(struct xfs_mount *); +extern xfs_agnumber_t xfs_set_inode64(struct xfs_mount *); extern const struct export_operations xfs_export_operations; extern const struct xattr_handler *xfs_xattr_handlers[]; -- 1.7.11.4 From cmaiolino@redhat.com Mon Sep 17 11:50:55 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8HGotGe186679 for ; Mon, 17 Sep 2012 11:50:55 -0500 X-ASG-Debug-ID: 1347900725-04cb6c56852bbe90001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id l22H00IVYdRloAkq for ; Mon, 17 Sep 2012 09:52:05 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8HGq5Ze012316 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 17 Sep 2012 12:52:05 -0400 Received: from andromeda.usersys.redhat.com (ovpn-113-119.phx2.redhat.com [10.3.113.119]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id q8HGpopJ016371 for ; Mon, 17 Sep 2012 12:52:04 -0400 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: [PATCH 3/4] xfs: set xfs_initialize_perag() to use xfs_set_inode32/64() Date: Mon, 17 Sep 2012 13:51:41 -0300 X-ASG-Orig-Subj: [PATCH 3/4] xfs: set xfs_initialize_perag() to use xfs_set_inode32/64() Message-Id: <1347900702-23421-4-git-send-email-cmaiolino@redhat.com> In-Reply-To: <1347900702-23421-1-git-send-email-cmaiolino@redhat.com> References: <1347900702-23421-1-git-send-email-cmaiolino@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1347900725 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com Set xfs_initialize_perag() to use xfs_set_inode32() and xfs_set_inode64() functions, removing duplicated code Signed-off-by: Carlos Maiolino --- fs/xfs/xfs_mount.c | 43 +++++-------------------------------------- 1 file changed, 5 insertions(+), 38 deletions(-) diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 29c2f83..b2bd3a0 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -440,7 +440,7 @@ xfs_initialize_perag( xfs_agnumber_t agcount, xfs_agnumber_t *maxagi) { - xfs_agnumber_t index, max_metadata; + xfs_agnumber_t index; xfs_agnumber_t first_initialised = 0; xfs_perag_t *pag; xfs_agino_t agino; @@ -500,43 +500,10 @@ xfs_initialize_perag( else mp->m_flags &= ~XFS_MOUNT_32BITINODES; - if (mp->m_flags & XFS_MOUNT_32BITINODES) { - /* - * Calculate how much should be reserved for inodes to meet - * the max inode percentage. - */ - if (mp->m_maxicount) { - __uint64_t icount; - - icount = sbp->sb_dblocks * sbp->sb_imax_pct; - do_div(icount, 100); - icount += sbp->sb_agblocks - 1; - do_div(icount, sbp->sb_agblocks); - max_metadata = icount; - } else { - max_metadata = agcount; - } - - for (index = 0; index < agcount; index++) { - ino = XFS_AGINO_TO_INO(mp, index, agino); - if (ino > XFS_MAXINUMBER_32) { - index++; - break; - } - - pag = xfs_perag_get(mp, index); - pag->pagi_inodeok = 1; - if (index < max_metadata) - pag->pagf_metadata = 1; - xfs_perag_put(pag); - } - } else { - for (index = 0; index < agcount; index++) { - pag = xfs_perag_get(mp, index); - pag->pagi_inodeok = 1; - xfs_perag_put(pag); - } - } + if (mp->m_flags & XFS_MOUNT_32BITINODES) + index = xfs_set_inode32(mp); + else + index = xfs_set_inode64(mp); if (maxagi) *maxagi = index; -- 1.7.11.4 From cmaiolino@redhat.com Mon Sep 17 11:51:00 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8HGox6p186700 for ; Mon, 17 Sep 2012 11:50:59 -0500 X-ASG-Debug-ID: 1347900729-04cbb07ce5326de0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id qhahDih6DEzIEZA6 for ; Mon, 17 Sep 2012 09:52:09 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8HGq9Yf009355 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 17 Sep 2012 12:52:09 -0400 Received: from andromeda.usersys.redhat.com (ovpn-113-119.phx2.redhat.com [10.3.113.119]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id q8HGpopK016371 for ; Mon, 17 Sep 2012 12:52:09 -0400 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: [PATCH 4/4] xfs: Make inode32 a remountable option Date: Mon, 17 Sep 2012 13:51:42 -0300 X-ASG-Orig-Subj: [PATCH 4/4] xfs: Make inode32 a remountable option Message-Id: <1347900702-23421-5-git-send-email-cmaiolino@redhat.com> In-Reply-To: <1347900702-23421-1-git-send-email-cmaiolino@redhat.com> References: <1347900702-23421-1-git-send-email-cmaiolino@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1347900729 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com As inode64 is the default option now, and was also made remountable previously, inode32 can also be remounted on-the-fly when it is needed. Signed-off-by: Carlos Maiolino --- fs/xfs/xfs_super.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 2d7a0d9..02b9f54 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -122,13 +122,18 @@ mempool_t *xfs_ioend_pool; * in the future, too. */ enum { - Opt_barrier, Opt_nobarrier, Opt_inode64, Opt_err + Opt_barrier, + Opt_nobarrier, + Opt_inode64, + Opt_inode32, + Opt_err }; static const match_table_t tokens = { {Opt_barrier, "barrier"}, {Opt_nobarrier, "nobarrier"}, {Opt_inode64, "inode64"}, + {Opt_inode32, "inode32"}, {Opt_err, NULL} }; @@ -1143,6 +1148,9 @@ xfs_fs_remount( case Opt_inode64: xfs_set_inode64(mp); break; + case Opt_inode32: + xfs_set_inode32(mp); + break; default: /* * Logically we would return an error here to prevent -- 1.7.11.4 From bpm@oss.sgi.com Mon Sep 17 12:19:03 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=ALL_TRUSTED,BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from oss.sgi.com (localhost [127.0.0.1]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8HHJ3OJ190450 for ; Mon, 17 Sep 2012 12:19:03 -0500 Received: (from bpm@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id q8HHJ3bb190422; Mon, 17 Sep 2012 12:19:03 -0500 Date: Mon, 17 Sep 2012 12:19:03 -0500 Message-Id: <201209171719.q8HHJ3bb190422@oss.sgi.com> From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, master, updated. v3.6-rc1-10-g4026c9f X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: b686d1f79acb65c6a34473c15fcfa2ee54aed8e2 X-Git-Newrev: 4026c9fde9c67266932afd209e25bfef4474a1be This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, master has been updated 4026c9f xfs: stop the sync worker before xfs_unmountfs from b686d1f79acb65c6a34473c15fcfa2ee54aed8e2 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 4026c9fde9c67266932afd209e25bfef4474a1be Author: Ben Myers Date: Thu Sep 13 16:18:47 2012 -0500 xfs: stop the sync worker before xfs_unmountfs Cancel work of the xfs_sync_worker before teardown of the log in xfs_unmountfs. This prevents occasional crashes on unmount like so: PID: 21602 TASK: ee9df060 CPU: 0 COMMAND: "kworker/0:3" #0 [c5377d28] crash_kexec at c0292c94 #1 [c5377d80] oops_end at c07090c2 #2 [c5377d98] no_context at c06f614e #3 [c5377dbc] __bad_area_nosemaphore at c06f6281 #4 [c5377df4] bad_area_nosemaphore at c06f629b #5 [c5377e00] do_page_fault at c070b0cb #6 [c5377e7c] error_code (via page_fault) at c070892c EAX: f300c6a8 EBX: f300c6a8 ECX: 000000c0 EDX: 000000c0 EBP: c5377ed0 DS: 007b ESI: 00000000 ES: 007b EDI: 00000001 GS: ffffad20 CS: 0060 EIP: c0481ad0 ERR: ffffffff EFLAGS: 00010246 #7 [c5377eb0] atomic64_read_cx8 at c0481ad0 #8 [c5377ebc] xlog_assign_tail_lsn_locked at f7cc7c6e [xfs] #9 [c5377ed4] xfs_trans_ail_delete_bulk at f7ccd520 [xfs] #10 [c5377f0c] xfs_buf_iodone at f7ccb602 [xfs] #11 [c5377f24] xfs_buf_do_callbacks at f7cca524 [xfs] #12 [c5377f30] xfs_buf_iodone_callbacks at f7cca5da [xfs] #13 [c5377f4c] xfs_buf_iodone_work at f7c718d0 [xfs] #14 [c5377f58] process_one_work at c024ee4c #15 [c5377f98] worker_thread at c024f43d #16 [c5377fbc] kthread at c025326b #17 [c5377fe8] kernel_thread_helper at c070e834 PID: 26653 TASK: e79143b0 CPU: 3 COMMAND: "umount" #0 [cde0fda0] __schedule at c0706595 #1 [cde0fe28] schedule at c0706b89 #2 [cde0fe30] schedule_timeout at c0705600 #3 [cde0fe94] __down_common at c0706098 #4 [cde0fec8] __down at c0706122 #5 [cde0fed0] down at c025936f #6 [cde0fee0] xfs_buf_lock at f7c7131d [xfs] #7 [cde0ff00] xfs_freesb at f7cc2236 [xfs] #8 [cde0ff10] xfs_fs_put_super at f7c80f21 [xfs] #9 [cde0ff1c] generic_shutdown_super at c0333d7a #10 [cde0ff38] kill_block_super at c0333e0f #11 [cde0ff48] deactivate_locked_super at c0334218 #12 [cde0ff58] deactivate_super at c033495d #13 [cde0ff68] mntput_no_expire at c034bc13 #14 [cde0ff7c] sys_umount at c034cc69 #15 [cde0ffa0] sys_oldumount at c034ccd4 #16 [cde0ffb0] system_call at c0707e66 commit 11159a05 added this to xfs_log_unmount and needs to be cleaned up at a later date. Signed-off-by: Ben Myers Reviewed-by: Dave Chinner Reviewed-by: Mark Tinguely ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_super.c | 1 + 1 file changed, 1 insertion(+) hooks/post-receive -- XFS development tree From bpm@oss.sgi.com Mon Sep 17 12:19:20 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=ALL_TRUSTED,BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from oss.sgi.com (localhost [127.0.0.1]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8HHJKcS190589 for ; Mon, 17 Sep 2012 12:19:20 -0500 Received: (from bpm@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id q8HHJKBF190561; Mon, 17 Sep 2012 12:19:20 -0500 Date: Mon, 17 Sep 2012 12:19:20 -0500 Message-Id: <201209171719.q8HHJKBF190561@oss.sgi.com> From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, for-next, updated. v3.6-rc1-10-g4026c9f X-Git-Refname: refs/heads/for-next X-Git-Reftype: branch X-Git-Oldrev: b686d1f79acb65c6a34473c15fcfa2ee54aed8e2 X-Git-Newrev: 4026c9fde9c67266932afd209e25bfef4474a1be This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, for-next has been updated 4026c9f xfs: stop the sync worker before xfs_unmountfs from b686d1f79acb65c6a34473c15fcfa2ee54aed8e2 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 4026c9fde9c67266932afd209e25bfef4474a1be Author: Ben Myers Date: Thu Sep 13 16:18:47 2012 -0500 xfs: stop the sync worker before xfs_unmountfs Cancel work of the xfs_sync_worker before teardown of the log in xfs_unmountfs. This prevents occasional crashes on unmount like so: PID: 21602 TASK: ee9df060 CPU: 0 COMMAND: "kworker/0:3" #0 [c5377d28] crash_kexec at c0292c94 #1 [c5377d80] oops_end at c07090c2 #2 [c5377d98] no_context at c06f614e #3 [c5377dbc] __bad_area_nosemaphore at c06f6281 #4 [c5377df4] bad_area_nosemaphore at c06f629b #5 [c5377e00] do_page_fault at c070b0cb #6 [c5377e7c] error_code (via page_fault) at c070892c EAX: f300c6a8 EBX: f300c6a8 ECX: 000000c0 EDX: 000000c0 EBP: c5377ed0 DS: 007b ESI: 00000000 ES: 007b EDI: 00000001 GS: ffffad20 CS: 0060 EIP: c0481ad0 ERR: ffffffff EFLAGS: 00010246 #7 [c5377eb0] atomic64_read_cx8 at c0481ad0 #8 [c5377ebc] xlog_assign_tail_lsn_locked at f7cc7c6e [xfs] #9 [c5377ed4] xfs_trans_ail_delete_bulk at f7ccd520 [xfs] #10 [c5377f0c] xfs_buf_iodone at f7ccb602 [xfs] #11 [c5377f24] xfs_buf_do_callbacks at f7cca524 [xfs] #12 [c5377f30] xfs_buf_iodone_callbacks at f7cca5da [xfs] #13 [c5377f4c] xfs_buf_iodone_work at f7c718d0 [xfs] #14 [c5377f58] process_one_work at c024ee4c #15 [c5377f98] worker_thread at c024f43d #16 [c5377fbc] kthread at c025326b #17 [c5377fe8] kernel_thread_helper at c070e834 PID: 26653 TASK: e79143b0 CPU: 3 COMMAND: "umount" #0 [cde0fda0] __schedule at c0706595 #1 [cde0fe28] schedule at c0706b89 #2 [cde0fe30] schedule_timeout at c0705600 #3 [cde0fe94] __down_common at c0706098 #4 [cde0fec8] __down at c0706122 #5 [cde0fed0] down at c025936f #6 [cde0fee0] xfs_buf_lock at f7c7131d [xfs] #7 [cde0ff00] xfs_freesb at f7cc2236 [xfs] #8 [cde0ff10] xfs_fs_put_super at f7c80f21 [xfs] #9 [cde0ff1c] generic_shutdown_super at c0333d7a #10 [cde0ff38] kill_block_super at c0333e0f #11 [cde0ff48] deactivate_locked_super at c0334218 #12 [cde0ff58] deactivate_super at c033495d #13 [cde0ff68] mntput_no_expire at c034bc13 #14 [cde0ff7c] sys_umount at c034cc69 #15 [cde0ffa0] sys_oldumount at c034ccd4 #16 [cde0ffb0] system_call at c0707e66 commit 11159a05 added this to xfs_log_unmount and needs to be cleaned up at a later date. Signed-off-by: Ben Myers Reviewed-by: Dave Chinner Reviewed-by: Mark Tinguely ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_super.c | 1 + 1 file changed, 1 insertion(+) hooks/post-receive -- XFS development tree From david@fromorbit.com Mon Sep 17 17:48:52 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8HMmpNO230432 for ; Mon, 17 Sep 2012 17:48:52 -0500 X-ASG-Debug-ID: 1347922199-04cbb07ce537cfb0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id vhPC8a34M3osCZSL for ; Mon, 17 Sep 2012 15:50:00 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ag4KAHeoV1B5LJUB/2dsb2JhbABFhR62AQN/gQiCIAEBBAE6HCMFCwgDDgouFCUDIROHegW6WBSLDSdfhWIDlWGJNoZsgniBSg Received: from ppp121-44-149-1.lns20.syd7.internode.on.net (HELO dastard) ([121.44.149.1]) by ipmail07.adl2.internode.on.net with ESMTP; 18 Sep 2012 08:19:58 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TDk8b-0005rN-89; Tue, 18 Sep 2012 08:49:57 +1000 Date: Tue, 18 Sep 2012 08:49:57 +1000 From: Dave Chinner To: Ben Myers Cc: Chris Friesen , Alex Elder , xfs@oss.sgi.com Subject: Re: given a pointer to xfs_inode_t, how to determine path? Message-ID: <20120917224957.GI13691@dastard> X-ASG-Orig-Subj: Re: given a pointer to xfs_inode_t, how to determine path? References: <50574709.9000301@genband.com> <20120917162120.GG25175@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20120917162120.GG25175@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1347922199 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108834 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Sep 17, 2012 at 11:21:20AM -0500, Ben Myers wrote: > Hi Chris, > > On Mon, Sep 17, 2012 at 09:51:37AM -0600, Chris Friesen wrote: > > We're running 2.6.27 (upgrading not currently possible, embedded product). > > > > We had a situation arise where we could see in stack traces that a > > number of tasks were stuck in vn_iowait(). That function takes a > > pointer to xfs_inode_t. Given that, would it be possible to work > > backwards to determine a filesystem path corresponding to that > > inode? I realize it would likely only go back to the head of the > > filesystem, but that would be fine. > > Yep, it's possible. > > echo t > /proc/sysrq-trigger won't give you the full stack, but you may be able > to get an idea of what is going on, well enough to make some guesses as to the > culprit. That's probably your best first step. Doesn't give you the path of the inode, or anything that can tell you what the inode number is so you could run "find -inum " after the system has recovered. > If you have crash installed: > > 1) disassemble vn_iowait and find out which register the xfs_inode_t pointer is in. > 2) print out the full stacks of all the processes in the system. 'bt -f', I think. 'bt -F ' tells you what entries on the stack are of a particular symbol. i.e. they'll show up as [xfs_inode] instead of a number for all addresses from inside the xfs inode slab cache. comapring the output of 'bt -F' and 'bt -f' will get you the inode address without needing to be able to read x86-64 assembly language... > 3) grep for the xfs_inode_t pointer on those stacks. Which doesn't get you the path, either. From there, follow to the struct inode, and from there to the struct dentry and grab the file name, then walk the d_parent dentry links back up to the root and construct the path that way. Alternatively, I think you can walk from the top down by looking that the open files that a given process has and working down to the xfs_inode, but it's been a long time since I've had to come from that direction. Indeed, you might even be able to use lsof to do this and get an idea from userspace what files are currently open on the hung processes. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Sep 17 18:49:03 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_45 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8HNn3eJ237057 for ; Mon, 17 Sep 2012 18:49:03 -0500 X-ASG-Debug-ID: 1347925810-04cbb07ce5388d00001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id o6ffGvYOpwoMY1nc for ; Mon, 17 Sep 2012 16:50:12 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ag4KANa2V1B5LJUB/2dsb2JhbABFhR62AgOBAIEIgiABAQQBOhwjBQsIAxgjCxQlAyETh3oFumIUiw0ba4ViA5VhiTaGbIJ4 Received: from ppp121-44-149-1.lns20.syd7.internode.on.net (HELO dastard) ([121.44.149.1]) by ipmail07.adl2.internode.on.net with ESMTP; 18 Sep 2012 09:19:35 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TDl4A-0005xF-Ms; Tue, 18 Sep 2012 09:49:26 +1000 Date: Tue, 18 Sep 2012 09:49:26 +1000 From: Dave Chinner To: Richard Ems Cc: xfs@oss.sgi.com Subject: Re: XFS (sdd1): Internal error xfs_da_do_buf(2) at line 2097 of file /usr/src/packages/BUILD/kernel-default-3.3.6/linux-3.3/fs/xfs/xfs_da_btree.c. Message-ID: <20120917234926.GJ13691@dastard> X-ASG-Orig-Subj: Re: XFS (sdd1): Internal error xfs_da_do_buf(2) at line 2097 of file /usr/src/packages/BUILD/kernel-default-3.3.6/linux-3.3/fs/xfs/xfs_da_btree.c. References: <50573A13.7000206@cape-horn-eng.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50573A13.7000206@cape-horn-eng.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1347925810 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108838 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Sep 17, 2012 at 04:56:19PM +0200, Richard Ems wrote: > Hi all, > > saturday morning one hard disc on our RAID6 failed. About one hour later, > the XFS running on that device reported the following error: > > XFS (sdd1): Internal error xfs_da_do_buf(2) at line 2097 of file /usr/src/packages/BUILD/kernel-default-3.3.6/linux-3.3/fs/xfs/xfs_da_btree.c. ..... > Sep 15 07:30:51 fs1 kernel: [7369085.792619] XFS (sdd1): Corruption detected. Unmount and run xfs_repair > > > And this repeating again and again ... > > This system has been running fine for 87 days, no power outages or such. > It's connected to an UPS, and the H800 Raid Controller has a BBU installed. ..... > Why could this have happened? Something went wrong at the RAID level (i.e. your hardware) in handling the disk failure and recovering the array. It corrupted blocks in the volume rather than recovering them cleanly without errors. The corrupted blocks happened to be in a directory block, and a frequently accessed one according to the errors in the log. What you found in lost+found was the recoverable fragments of the directory and whatever else was corrupted during the disk failure incident. > What more info can I provide to understand this issue and avoid > this to happen again? I'd be asking your hardware vendor about why it corrupted the volume on a single disk failure when it is supposed to be able to transparently handle double disk failures without losing/corrupting data. Cheers, Dave. -- Dave Chinner david@fromorbit.com From bfoster@redhat.com Mon Sep 17 21:13:22 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8I2DMGM250089 for ; Mon, 17 Sep 2012 21:13:22 -0500 X-ASG-Debug-ID: 1347934472-04cb6c56852fe0a0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id or09HaftO82aH6hY for ; Mon, 17 Sep 2012 19:14:32 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8I2EWGS032156 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 17 Sep 2012 22:14:32 -0400 Received: from laptop.bfoster (vpn-9-18.rdu.redhat.com [10.11.9.18]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id q8I2EUWx001411 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Mon, 17 Sep 2012 22:14:31 -0400 Message-ID: <5057D8AB.6000208@redhat.com> Date: Mon, 17 Sep 2012 22:12:59 -0400 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:15.0) Gecko/20120827 Thunderbird/15.0 MIME-Version: 1.0 To: Carlos Maiolino CC: xfs@oss.sgi.com Subject: Re: [PATCH 2/4] xfs: add xfs_set_inode32() References: <1347900702-23421-1-git-send-email-cmaiolino@redhat.com> <1347900702-23421-3-git-send-email-cmaiolino@redhat.com> X-ASG-Orig-Subj: Re: [PATCH 2/4] xfs: add xfs_set_inode32() In-Reply-To: <1347900702-23421-3-git-send-email-cmaiolino@redhat.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1347934472 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com On 09/17/2012 12:51 PM, Carlos Maiolino wrote: > xfs_set_inode32() can be used to enable inode32 allocation mode. this will > reduce the amount of duplicated code needed to mount/remount a filesystem with > inode32 option. > This patch also enable xfs_set_inode64() to return a xfs_agnumber_t value to > also be used during mount/remount, instead of duplicate code > > Signed-off-by: Carlos Maiolino > --- > fs/xfs/xfs_super.c | 102 ++++++++++++++++++++++++++++++++++++++++------------- > fs/xfs/xfs_super.h | 2 ++ > 2 files changed, 80 insertions(+), 24 deletions(-) > > diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c > index b1aa2db..2d7a0d9 100644 > --- a/fs/xfs/xfs_super.c > +++ b/fs/xfs/xfs_super.c > @@ -598,6 +598,84 @@ xfs_max_file_offset( > return (((__uint64_t)pagefactor) << bitshift) - 1; > } > > +xfs_agnumber_t > +xfs_set_inode64(struct xfs_mount *mp) > +{ > + xfs_agnumber_t index = 0; > + > + for (index = 0; index < mp->m_sb.sb_agcount; index++) { > + struct xfs_perag *pag; > + > + pag = xfs_perag_get(mp, index); > + pag->pagi_inodeok = 1; > + pag->pagf_metadata = 0; > + xfs_perag_put(pag); > + } > + > + /* There is no need for lock protection on m_flags, > + * the rw_semaphore of the VFS superblock is locked > + * during mount/umount/remount operations, so this is > + * enough to avoid concurency on the m_flags field > + */ > + mp->m_flags &= ~(XFS_MOUNT_32BITINODES | > + XFS_MOUNT_SMALL_INUMS); > + mp->m_maxagi = index; > + > + return index; > +} > + > +xfs_agnumber_t > +xfs_set_inode32(struct xfs_mount *mp) > +{ > + xfs_agnumber_t index; > + xfs_agnumber_t i = 0; > + xfs_sb_t *sbp = &mp->m_sb; > + xfs_agnumber_t max_metadata; > + xfs_agino_t agino = XFS_OFFBNO_TO_AGINO(mp, sbp->sb_agblocks -1, 0); > + xfs_ino_t ino = XFS_AGINO_TO_INO(mp, sbp->sb_agcount -1, agino); > + xfs_perag_t *pag; > + > + /* Calculate how much should be reserved for inodes to meet > + * the max inode percentage. > + */ > + if (mp->m_maxicount) { > + __uint64_t icount; > + > + icount = sbp->sb_dblocks * sbp->sb_imax_pct; > + do_div(icount, 100); > + icount += sbp->sb_agblocks - 1; > + do_div(icount, sbp->sb_agblocks); > + max_metadata = icount; > + } else { > + max_metadata = sbp->sb_agcount; > + } > + > + for (index = 0; index < sbp->sb_agcount; index++) { > + ino = XFS_AGINO_TO_INO(mp, index, agino); > + > + if (ino > XFS_MAXINUMBER_32) { > + i++; > + pag = xfs_perag_get(mp, index); > + pag->pagi_inodeok = 0; > + pag->pagf_metadata = 1; Is it correct to set pagf_metadata here? I'm learning some of this code as I review this so I could be wrong, but it looks like pagf_metadata basically sets a preference on an ag for metadata (e.g., presumably because we are limiting metadata space on a potentially large fs). The existing code looks like it sets pagf_metadata only on AG's below the max_metadata mark... Brian > + xfs_perag_put(pag); > + continue; > + } > + > + pag = xfs_perag_get(mp, index); > + pag->pagi_inodeok = 1; > + if (index < max_metadata) > + pag->pagf_metadata = 1; > + > + xfs_perag_put(pag); > + } > + > + index -= i; > + mp->m_flags |= (XFS_MOUNT_32BITINODES | > + XFS_MOUNT_SMALL_INUMS); > + return index; > +} > + > STATIC int > xfs_blkdev_get( > xfs_mount_t *mp, > @@ -1037,30 +1115,6 @@ xfs_restore_resvblks(struct xfs_mount *mp) > xfs_reserve_blocks(mp, &resblks, NULL); > } > > -STATIC void > -xfs_set_inode64(struct xfs_mount *mp) > -{ > - int i = 0; > - > - for (i = 0; i < mp->m_sb.sb_agcount; i++) { > - struct xfs_perag *pag; > - > - pag = xfs_perag_get(mp, i); > - pag->pagi_inodeok = 1; > - pag->pagf_metadata = 0; > - xfs_perag_put(pag); > - } > - > - /* There is no need for lock protection on m_flags, > - * the rw_semaphore of the VFS superblock is locked > - * during mount/umount/remount operations, so this is > - * enough to avoid concurency on the m_flags field > - */ > - mp->m_flags &= ~(XFS_MOUNT_32BITINODES | > - XFS_MOUNT_SMALL_INUMS); > - mp->m_maxagi = i; > -} > - > STATIC int > xfs_fs_remount( > struct super_block *sb, > diff --git a/fs/xfs/xfs_super.h b/fs/xfs/xfs_super.h > index 09b0c26..9de4a92 100644 > --- a/fs/xfs/xfs_super.h > +++ b/fs/xfs/xfs_super.h > @@ -75,6 +75,8 @@ struct block_device; > extern __uint64_t xfs_max_file_offset(unsigned int); > > extern void xfs_blkdev_issue_flush(struct xfs_buftarg *); > +extern xfs_agnumber_t xfs_set_inode32(struct xfs_mount *); > +extern xfs_agnumber_t xfs_set_inode64(struct xfs_mount *); > > extern const struct export_operations xfs_export_operations; > extern const struct xattr_handler *xfs_xattr_handlers[]; > From cmaiolino@redhat.com Mon Sep 17 21:39:39 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8I2ddb1252751 for ; Mon, 17 Sep 2012 21:39:39 -0500 X-ASG-Debug-ID: 1347936049-04cbb07ce53d1ae0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 0rDcYX5WdHAlbk0A for ; Mon, 17 Sep 2012 19:40:49 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8I2en6C013231 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Mon, 17 Sep 2012 22:40:49 -0400 Received: from andromeda.usersys.redhat.com (ovpn-113-119.phx2.redhat.com [10.3.113.119]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id q8I2ejf7025174 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO) for ; Mon, 17 Sep 2012 22:40:48 -0400 Date: Mon, 17 Sep 2012 23:40:45 -0300 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: Re: [PATCH 2/4] xfs: add xfs_set_inode32() Message-ID: <20120918024045.GA14326@andromeda.usersys.redhat.com> X-ASG-Orig-Subj: Re: [PATCH 2/4] xfs: add xfs_set_inode32() Mail-Followup-To: xfs@oss.sgi.com References: <1347900702-23421-1-git-send-email-cmaiolino@redhat.com> <1347900702-23421-3-git-send-email-cmaiolino@redhat.com> <5057D8AB.6000208@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5057D8AB.6000208@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1347936049 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com On Mon, Sep 17, 2012 at 10:12:59PM -0400, Brian Foster wrote: > On 09/17/2012 12:51 PM, Carlos Maiolino wrote: > > xfs_set_inode32() can be used to enable inode32 allocation mode. this will > > reduce the amount of duplicated code needed to mount/remount a filesystem with > > inode32 option. > > This patch also enable xfs_set_inode64() to return a xfs_agnumber_t value to > > also be used during mount/remount, instead of duplicate code > > > > Signed-off-by: Carlos Maiolino > > --- > > fs/xfs/xfs_super.c | 102 ++++++++++++++++++++++++++++++++++++++++------------- > > fs/xfs/xfs_super.h | 2 ++ > > 2 files changed, 80 insertions(+), 24 deletions(-) > > > > diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c > > index b1aa2db..2d7a0d9 100644 > > --- a/fs/xfs/xfs_super.c > > +++ b/fs/xfs/xfs_super.c > > @@ -598,6 +598,84 @@ xfs_max_file_offset( > > return (((__uint64_t)pagefactor) << bitshift) - 1; > > } > > > > +xfs_agnumber_t > > +xfs_set_inode64(struct xfs_mount *mp) > > +{ > > + xfs_agnumber_t index = 0; > > + > > + for (index = 0; index < mp->m_sb.sb_agcount; index++) { > > + struct xfs_perag *pag; > > + > > + pag = xfs_perag_get(mp, index); > > + pag->pagi_inodeok = 1; > > + pag->pagf_metadata = 0; > > + xfs_perag_put(pag); > > + } > > + > > + /* There is no need for lock protection on m_flags, > > + * the rw_semaphore of the VFS superblock is locked > > + * during mount/umount/remount operations, so this is > > + * enough to avoid concurency on the m_flags field > > + */ > > + mp->m_flags &= ~(XFS_MOUNT_32BITINODES | > > + XFS_MOUNT_SMALL_INUMS); > > + mp->m_maxagi = index; > > + > > + return index; > > +} > > + > > +xfs_agnumber_t > > +xfs_set_inode32(struct xfs_mount *mp) > > +{ > > + xfs_agnumber_t index; > > + xfs_agnumber_t i = 0; > > + xfs_sb_t *sbp = &mp->m_sb; > > + xfs_agnumber_t max_metadata; > > + xfs_agino_t agino = XFS_OFFBNO_TO_AGINO(mp, sbp->sb_agblocks -1, 0); > > + xfs_ino_t ino = XFS_AGINO_TO_INO(mp, sbp->sb_agcount -1, agino); > > + xfs_perag_t *pag; > > + > > + /* Calculate how much should be reserved for inodes to meet > > + * the max inode percentage. > > + */ > > + if (mp->m_maxicount) { > > + __uint64_t icount; > > + > > + icount = sbp->sb_dblocks * sbp->sb_imax_pct; > > + do_div(icount, 100); > > + icount += sbp->sb_agblocks - 1; > > + do_div(icount, sbp->sb_agblocks); > > + max_metadata = icount; > > + } else { > > + max_metadata = sbp->sb_agcount; > > + } > > + > > + for (index = 0; index < sbp->sb_agcount; index++) { > > + ino = XFS_AGINO_TO_INO(mp, index, agino); > > + > > + if (ino > XFS_MAXINUMBER_32) { > > + i++; > > + pag = xfs_perag_get(mp, index); > > + pag->pagi_inodeok = 0; > > + pag->pagf_metadata = 1; > > Is it correct to set pagf_metadata here? I'm learning some of this code > as I review this so I could be wrong, but it looks like pagf_metadata > basically sets a preference on an ag for metadata (e.g., presumably > because we are limiting metadata space on a potentially large fs). The > existing code looks like it sets pagf_metadata only on AG's below the > max_metadata mark... > > Brian > This AG will be preferred to inode allocation, so, pagf_metadata = 1. And since using 32bit inodes we are limited where we can make inode allocations, set the first AGs as metadata preferred makes sense to me. (but I can be wrong too :) > > + xfs_perag_put(pag); > > + continue; > > + } > > + > > + pag = xfs_perag_get(mp, index); > > + pag->pagi_inodeok = 1; > > + if (index < max_metadata) > > + pag->pagf_metadata = 1; > > + > > + xfs_perag_put(pag); > > + } > > + > > + index -= i; > > + mp->m_flags |= (XFS_MOUNT_32BITINODES | > > + XFS_MOUNT_SMALL_INUMS); > > + return index; > > +} > > + > > STATIC int > > xfs_blkdev_get( > > xfs_mount_t *mp, > > @@ -1037,30 +1115,6 @@ xfs_restore_resvblks(struct xfs_mount *mp) > > xfs_reserve_blocks(mp, &resblks, NULL); > > } > > > > -STATIC void > > -xfs_set_inode64(struct xfs_mount *mp) > > -{ > > - int i = 0; > > - > > - for (i = 0; i < mp->m_sb.sb_agcount; i++) { > > - struct xfs_perag *pag; > > - > > - pag = xfs_perag_get(mp, i); > > - pag->pagi_inodeok = 1; > > - pag->pagf_metadata = 0; > > - xfs_perag_put(pag); > > - } > > - > > - /* There is no need for lock protection on m_flags, > > - * the rw_semaphore of the VFS superblock is locked > > - * during mount/umount/remount operations, so this is > > - * enough to avoid concurency on the m_flags field > > - */ > > - mp->m_flags &= ~(XFS_MOUNT_32BITINODES | > > - XFS_MOUNT_SMALL_INUMS); > > - mp->m_maxagi = i; > > -} > > - > > STATIC int > > xfs_fs_remount( > > struct super_block *sb, > > diff --git a/fs/xfs/xfs_super.h b/fs/xfs/xfs_super.h > > index 09b0c26..9de4a92 100644 > > --- a/fs/xfs/xfs_super.h > > +++ b/fs/xfs/xfs_super.h > > @@ -75,6 +75,8 @@ struct block_device; > > extern __uint64_t xfs_max_file_offset(unsigned int); > > > > extern void xfs_blkdev_issue_flush(struct xfs_buftarg *); > > +extern xfs_agnumber_t xfs_set_inode32(struct xfs_mount *); > > +extern xfs_agnumber_t xfs_set_inode64(struct xfs_mount *); > > > > extern const struct export_operations xfs_export_operations; > > extern const struct xattr_handler *xfs_xattr_handlers[]; > > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs -- --Carlos From david@fromorbit.com Tue Sep 18 00:49:24 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8I5nOiS011048 for ; Tue, 18 Sep 2012 00:49:24 -0500 X-ASG-Debug-ID: 1347947433-04bdf06cd0283800001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id WNwjZzoY5HLubmH0 for ; Mon, 17 Sep 2012 22:50:34 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ag4KACsLWFB5LJUB/2dsb2JhbABFhR62DQOBAIEIgiABAQQBJxMcIxAIAw4KLhQlAyETh3oFunUUiw0JC3KFYgOVYZAigniBSA Received: from ppp121-44-149-1.lns20.syd7.internode.on.net (HELO dastard) ([121.44.149.1]) by ipmail05.adl6.internode.on.net with ESMTP; 18 Sep 2012 15:20:32 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TDqhZ-0006YY-QI; Tue, 18 Sep 2012 15:50:29 +1000 Date: Tue, 18 Sep 2012 15:50:29 +1000 From: Dave Chinner To: Carlos Maiolino Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/4] xfs: make inode64 as the default allocation mode Message-ID: <20120918055029.GL13691@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/4] xfs: make inode64 as the default allocation mode References: <1347900702-23421-1-git-send-email-cmaiolino@redhat.com> <1347900702-23421-2-git-send-email-cmaiolino@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1347900702-23421-2-git-send-email-cmaiolino@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1347947433 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108862 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Sep 17, 2012 at 01:51:39PM -0300, Carlos Maiolino wrote: > since 64-bit inodes can be accessed while using inode32, and these can also be > used on 32-bit kernels, there is no reason to still keep inode32 as the default > mount option. This needs to explain why XFS_MOUNT_SMALL_INUMS is still the default for !XFS_BIG_INUMS. i.e. inode64 is not an unconditional default value. > > Signed-off-by: Carlos Maiolino > --- > fs/xfs/xfs_super.c | 8 +++++++- > 1 file changed, 7 insertions(+), 1 deletion(-) > > diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c > index f1f2968..b1aa2db 100644 > --- a/fs/xfs/xfs_super.c > +++ b/fs/xfs/xfs_super.c > @@ -88,6 +88,8 @@ mempool_t *xfs_ioend_pool; > * unwritten extent conversion */ > #define MNTOPT_NOBARRIER "nobarrier" /* .. disable */ > #define MNTOPT_64BITINODE "inode64" /* inodes can be allocated anywhere */ > +#define MNTOPT_32BITINODE "inode32" /* inode allocation limited to > + * XFS_MAXINUMBER_32 */ > #define MNTOPT_IKEEP "ikeep" /* do not free empty inode clusters */ > #define MNTOPT_NOIKEEP "noikeep" /* free empty inode clusters */ > #define MNTOPT_LARGEIO "largeio" /* report large I/O sizes in stat() */ > @@ -198,7 +200,9 @@ xfs_parseargs( > */ > mp->m_flags |= XFS_MOUNT_BARRIER; > mp->m_flags |= XFS_MOUNT_COMPAT_IOSIZE; > +#if !XFS_BIG_INUMS > mp->m_flags |= XFS_MOUNT_SMALL_INUMS; > +#endif > > /* > * These can be overridden by the mount option parsing. > @@ -295,6 +299,8 @@ xfs_parseargs( > return EINVAL; > } > dswidth = simple_strtoul(value, &eov, 10); > + } else if (!strcmp(this_char, MNTOPT_32BITINODE)) { > + mp->m_flags |= XFS_MOUNT_SMALL_INUMS; > } else if (!strcmp(this_char, MNTOPT_64BITINODE)) { > mp->m_flags &= ~XFS_MOUNT_SMALL_INUMS; > #if !XFS_BIG_INUMS > @@ -493,13 +499,13 @@ xfs_showargs( > { XFS_MOUNT_FILESTREAMS, "," MNTOPT_FILESTREAM }, > { XFS_MOUNT_GRPID, "," MNTOPT_GRPID }, > { XFS_MOUNT_DISCARD, "," MNTOPT_DISCARD }, > + { XFS_MOUNT_SMALL_INUMS, "," MNTOPT_32BITINODE }, > { 0, NULL } > }; > static struct proc_xfs_info xfs_info_unset[] = { > /* the few simple ones we can get from the mount struct */ > { XFS_MOUNT_COMPAT_IOSIZE, "," MNTOPT_LARGEIO }, > { XFS_MOUNT_BARRIER, "," MNTOPT_NOBARRIER }, > - { XFS_MOUNT_SMALL_INUMS, "," MNTOPT_64BITINODE }, I'd leave that in the table, that way people will still know if they are using inode64 or not by grepping /proc/self/mounts. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Sep 18 01:40:13 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_21 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8I6eDx1019855 for ; Tue, 18 Sep 2012 01:40:13 -0500 X-ASG-Debug-ID: 1347950483-04cbb07ce544be80001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id GZA7SDVuMCx2T7u1 for ; Mon, 17 Sep 2012 23:41:23 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ag4KAPQWWFB5LJUB/2dsb2JhbABFDoUQtg8DgQCBCIIgAQEFOhwjEAgDGC4UJQMhE4d/unAUiw2BBoViA5VhiTaGbIIsTA Received: from ppp121-44-149-1.lns20.syd7.internode.on.net (HELO dastard) ([121.44.149.1]) by ipmail05.adl6.internode.on.net with ESMTP; 18 Sep 2012 16:10:47 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TDrU7-0006ed-VR; Tue, 18 Sep 2012 16:40:39 +1000 Date: Tue, 18 Sep 2012 16:40:39 +1000 From: Dave Chinner To: "Theodore Ts'o" Cc: linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com Subject: Re: Anyone have test cases for SEEK_HOLE/SEEK_DATA? Message-ID: <20120918064039.GS11511@dastard> X-ASG-Orig-Subj: Re: Anyone have test cases for SEEK_HOLE/SEEK_DATA? References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1347950483 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108864 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Sep 17, 2012 at 10:04:34PM -0400, Theodore Ts'o wrote: > > Does anyone have test cases for SEEK_HOLE/SEEK_DATA handy? As near as I > can tell xfstests doesn't have any tests for SEEK_HOLE/SEEK_DATA > functionality, and I was hoping someone had some test programs and test > sets already written. Perhaps a cc to xfs@oss.sgi.com so the xfstests maintainers see the question would be a sensible idea? As it is, there are tests pending check-in that test seek-data/seek-hole functionality - they were used to verify the unwritten extent aware XFS implementation that recently went into the kernel.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Sep 18 01:46:13 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8I6kDXw020362 for ; Tue, 18 Sep 2012 01:46:13 -0500 X-ASG-Debug-ID: 1347950842-04cbb07ce244d320001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id rn3PE2LKAz6BkwGB for ; Mon, 17 Sep 2012 23:47:23 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ag4KAEMYWFB5LJUB/2dsb2JhbAA9CIUetg8DgQCBCIIgAQEFJxMcFxwIAxguFCUDNId/umcUiw0UAnCFYgOVYYk2hmyCeIFI Received: from ppp121-44-149-1.lns20.syd7.internode.on.net (HELO dastard) ([121.44.149.1]) by ipmail05.adl6.internode.on.net with ESMTP; 18 Sep 2012 16:17:19 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TDraY-0006fK-84 for xfs@oss.sgi.com; Tue, 18 Sep 2012 16:47:18 +1000 Date: Tue, 18 Sep 2012 16:47:18 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: Re: [PATCH 2/4] xfs: add xfs_set_inode32() Message-ID: <20120918064718.GM13691@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/4] xfs: add xfs_set_inode32() References: <1347900702-23421-1-git-send-email-cmaiolino@redhat.com> <1347900702-23421-3-git-send-email-cmaiolino@redhat.com> <5057D8AB.6000208@redhat.com> <20120918024045.GA14326@andromeda.usersys.redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20120918024045.GA14326@andromeda.usersys.redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1347950842 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108864 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Sep 17, 2012 at 11:40:45PM -0300, Carlos Maiolino wrote: > On Mon, Sep 17, 2012 at 10:12:59PM -0400, Brian Foster wrote: > > On 09/17/2012 12:51 PM, Carlos Maiolino wrote: > > > xfs_set_inode32() can be used to enable inode32 allocation mode. this will > > > reduce the amount of duplicated code needed to mount/remount a filesystem with > > > inode32 option. > > > This patch also enable xfs_set_inode64() to return a xfs_agnumber_t value to > > > also be used during mount/remount, instead of duplicate code "This patch also changes xfs_set_inode64() to return the maximum AG number that inodes can be allocated in so that the behaviour is the same as xfs_set_inode32(). This simplifies code that calls these functions and neds to know the maximum AG that inodes can be allocated in." .... > > > + for (index = 0; index < sbp->sb_agcount; index++) { > > > + ino = XFS_AGINO_TO_INO(mp, index, agino); > > > + > > > + if (ino > XFS_MAXINUMBER_32) { > > > + i++; > > > + pag = xfs_perag_get(mp, index); > > > + pag->pagi_inodeok = 0; > > > + pag->pagf_metadata = 1; > > > > Is it correct to set pagf_metadata here? I'm learning some of this code > > as I review this so I could be wrong, but it looks like pagf_metadata > > basically sets a preference on an ag for metadata (e.g., presumably > > because we are limiting metadata space on a potentially large fs). The > > existing code looks like it sets pagf_metadata only on AG's below the > > max_metadata mark... > > > > Brian > > > This AG will be preferred to inode allocation, so, pagf_metadata = 1. And since > using 32bit inodes we are limited where we can make inode allocations, > set the first AGs as metadata preferred makes sense to me. > (but I can be wrong too :) This discussion is being had because this code addition is in a different patch that removes the code that it is replacing. Indeed, if you look at the code that is being replaced by this function, it's clear that pag->pagf_metadata is only set on AGs that also have pag->pagi_inodeok set. Part of this confusion also comes about because you are intrducing new functionality inthe same patch you are trying to factor code. i.e. making more than one change in a single patch. Hence I think that some restructuring of the patch set needs to be done so each patch makes one clear change. The first patch is fine, the second should factor xfs_initialize_perag() to use xfs_set_inode64()/xfs_set_inode32() without changing any logic, the third should introduce the inode64->inode32 transition support into xfs_set_inode32() and the last can stay the same introducing the remount support for inode32. > > > + xfs_perag_put(pag); > > > + continue; > > > + } > > > + > > > + pag = xfs_perag_get(mp, index); > > > + pag->pagi_inodeok = 1; > > > + if (index < max_metadata) > > > + pag->pagf_metadata = 1; > > > + > > > + xfs_perag_put(pag); > > > + } > > > + > > > + index -= i; And this is pretty clunky. Much better is to introduce a "maxagi" variable and set it each time through the loop when you set pag->pagi_inodeok = 1, and return that value. It becomes immediataely clear what the return parameter of the function is without needing to document it.... > > > + mp->m_flags |= (XFS_MOUNT_32BITINODES | > > > + XFS_MOUNT_SMALL_INUMS); > > > + return index; > > > +} > > > + > > > STATIC int > > > xfs_blkdev_get( > > > xfs_mount_t *mp, > > > @@ -1037,30 +1115,6 @@ xfs_restore_resvblks(struct xfs_mount *mp) > > > xfs_reserve_blocks(mp, &resblks, NULL); > > > } > > > > > > -STATIC void > > > -xfs_set_inode64(struct xfs_mount *mp) > > > -{ > > > - int i = 0; > > > - > > > - for (i = 0; i < mp->m_sb.sb_agcount; i++) { > > > - struct xfs_perag *pag; > > > - > > > - pag = xfs_perag_get(mp, i); > > > - pag->pagi_inodeok = 1; > > > - pag->pagf_metadata = 0; > > > - xfs_perag_put(pag); > > > - } > > > - > > > - /* There is no need for lock protection on m_flags, > > > - * the rw_semaphore of the VFS superblock is locked > > > - * during mount/umount/remount operations, so this is > > > - * enough to avoid concurency on the m_flags field > > > - */ > > > - mp->m_flags &= ~(XFS_MOUNT_32BITINODES | > > > - XFS_MOUNT_SMALL_INUMS); > > > - mp->m_maxagi = i; > > > -} There's also a problem of symmetry here - xfs_set_inode64() sets mp->m_maxagi, which will break growfs logic when it is called by xfs_initialize_perag() in the next patch. For growfs, mp->m_maxagi cannot be updated until after all the AG headers are initialised and written to disk, but to do that we need to have the xfs_perag headers already initialised. Hence we have to avoid using them by not updating mp->m_maxagi until after the initialisation is complete (i.e. after the growfs transaction commits). This is another reason that factoring should be done in a single patch without changing logic ;) Cheers, Dave. -- Dave Chinner david@fromorbit.com From richard.ems@cape-horn-eng.com Tue Sep 18 03:30:04 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_45 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8I8U3fq027978 for ; Tue, 18 Sep 2012 03:30:04 -0500 X-ASG-Debug-ID: 1347957074-04cb6c56883768d0001-NocioJ Received: from smtprelay05.ispgateway.de (smtprelay05.ispgateway.de [80.67.31.100]) by cuda.sgi.com with ESMTP id wg3waMfkfLVcTWFP for ; Tue, 18 Sep 2012 01:31:14 -0700 (PDT) X-Barracuda-Envelope-From: richard.ems@cape-horn-eng.com X-Barracuda-Apparent-Source-IP: 80.67.31.100 X-ASG-Whitelist: Client Received: from [62.43.225.238] (helo=localhost) by smtprelay05.ispgateway.de with esmtpsa (TLSv1:AES256-SHA:256) (Exim 4.68) (envelope-from ) id 1TDtD6-0000Z4-Is; Tue, 18 Sep 2012 10:31:12 +0200 Message-ID: <5058314F.7000102@cape-horn-eng.com> Date: Tue, 18 Sep 2012 10:31:11 +0200 From: Richard Ems User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:15.0) Gecko/20120825 Thunderbird/15.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: XFS (sdd1): Internal error xfs_da_do_buf(2) at line 2097 of file /usr/src/packages/BUILD/kernel-default-3.3.6/linux-3.3/fs/xfs/xfs_da_btree.c. References: <50573A13.7000206@cape-horn-eng.com> <20120917234926.GJ13691@dastard> X-ASG-Orig-Subj: Re: XFS (sdd1): Internal error xfs_da_do_buf(2) at line 2097 of file /usr/src/packages/BUILD/kernel-default-3.3.6/linux-3.3/fs/xfs/xfs_da_btree.c. In-Reply-To: <20120917234926.GJ13691@dastard> X-Enigmail-Version: 1.4.4 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-Df-Sender: cmljaGFyZC5lbXNAY2FwZS1ob3JuLWVuZy5jb20= X-Barracuda-Connect: smtprelay05.ispgateway.de[80.67.31.100] X-Barracuda-Start-Time: 1347957074 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com On 09/18/2012 01:49 AM, Dave Chinner wrote: > On Mon, Sep 17, 2012 at 04:56:19PM +0200, Richard Ems wrote: >> Hi all, >> >> saturday morning one hard disc on our RAID6 failed. About one hour later, >> the XFS running on that device reported the following error: >> >> XFS (sdd1): Internal error xfs_da_do_buf(2) at line 2097 of file /usr/src/packages/BUILD/kernel-default-3.3.6/linux-3.3/fs/xfs/xfs_da_btree.c. > ..... >> Sep 15 07:30:51 fs1 kernel: [7369085.792619] XFS (sdd1): Corruption detected. Unmount and run xfs_repair >> >> >> And this repeating again and again ... >> >> This system has been running fine for 87 days, no power outages or such. >> It's connected to an UPS, and the H800 Raid Controller has a BBU installed. > ..... >> Why could this have happened? > > Something went wrong at the RAID level (i.e. your hardware) in > handling the disk failure and recovering the array. It corrupted > blocks in the volume rather than recovering them cleanly without > errors. The corrupted blocks happened to be in a directory block, > and a frequently accessed one according to the errors in the log. > > What you found in lost+found was the recoverable fragments of the > directory and whatever else was corrupted during the disk failure > incident. > >> What more info can I provide to understand this issue and avoid >> this to happen again? > > I'd be asking your hardware vendor about why it corrupted the > volume on a single disk failure when it is supposed to be able to > transparently handle double disk failures without losing/corrupting > data. > > Cheers, > > Dave. > Ok, many thanks Dave. I will forward this conversation to the DELL guys ... Thanks again, Richard -- Richard Ems mail: Richard.Ems@Cape-Horn-Eng.com Cape Horn Engineering S.L. C/ Dr. J.J. Dómine 1, 5º piso 46011 Valencia Tel : +34 96 3242923 / Fax 924 http://www.cape-horn-eng.com From hawk@tbi.univie.ac.at Tue Sep 18 03:48:16 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8I8mG1X029166 for ; Tue, 18 Sep 2012 03:48:16 -0500 X-ASG-Debug-ID: 1347958164-04cb6c568637a8d0001-NocioJ Received: from mescalin.tbi.univie.ac.at (mescalin.tbi.univie.ac.at [131.130.44.61]) by cuda.sgi.com with ESMTP id O8f3KDLU1io2X6kN (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 18 Sep 2012 01:49:25 -0700 (PDT) X-Barracuda-Envelope-From: hawk@tbi.univie.ac.at X-Barracuda-Apparent-Source-IP: 131.130.44.61 Received: from h082218137050.host.wavenet.at ([82.218.137.50]:59615 helo=BD-MacBook.local) by mescalin.tbi.univie.ac.at with esmtpsa (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1TDtUf-0001n6-Tb for xfs@oss.sgi.com; Tue, 18 Sep 2012 10:49:24 +0200 Message-ID: <50583590.7060702@tbi.univie.ac.at> Date: Tue, 18 Sep 2012 10:49:20 +0200 From: Richard Neuboeck User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:14.0) Gecko/20120713 Thunderbird/14.0 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: xfs mount fails 'can't read superblock' X-Enigmail-Version: 1.4.4 X-ASG-Orig-Subj: xfs mount fails 'can't read superblock' Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="------------enig970F8637FCEB805773DF9AA0" X-TBI-Spam-Score: -1.0 (-) X-TBI-Spam-Report: No hits=-1.0 required=5.0 tests=ALL_TRUSTED autolearn=ham version=3.3.1 X-Barracuda-Connect: mescalin.tbi.univie.ac.at[131.130.44.61] X-Barracuda-Start-Time: 1347958165 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108874 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- This is an OpenPGP/MIME signed message (RFC 2440 and 3156) --------------enig970F8637FCEB805773DF9AA0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Hi XFS gurus, I've a XFS related problem that boggles my find and I couldn't find a solution yet. I've got a virtual machine (huddle) that gets a ~66TB logical volume from the host handed as (virtio) block device (/dev/vdb). For ease of maintenance I didn't partition the device but formatted it directly with xfs. The system at the time of formatting was Ubuntu Lucid 64bit. A few days ago I upgraded the virtual machine to Ubuntu LTS 'precise', Kernel 3.2, and got the following error while trying to mount the device:= root@huddle:~# mount /dev/vdb /mnt/storage mount: /dev/vdb: can't read superblock dmesg shows some more info: root@huddle:~# dmesg | tail [ 672.774206] end_request: I/O error, dev vdb, sector 0 [ 672.774393] XFS (vdb): SB buffer read failed At first I thought the block device had some error and checked the virtual machine configuration and host system. =46rom the host system (Ubuntu lucid 64bit, Kernel 2.6) I can still mount= the xfs formatted device without problems. I also ran xfs_repair -n that didn't show any problem. I tried to hand the virual machine a different ext4 formated block device (also without partition and preformatted). This didn't yield any mount problems. The Ubuntu 'precise' machine has an older kernel (2.6.32-42) too. Booting this kernel the xfs formatted block device gets mounted without error. The curious part is that it is still possible to mount the volume under Kernel 3.2 without error using the loop option: root@huddle:~# mount -v -t xfs -o loop /dev/vdb /mnt/storage/ Trying xfs_repair also brings up the I/O Error unless I use it with the -f option under Kernel 3.2. Obviously the problem is Kernel 3.2 related. I'm not sure if I'm at the right place in the XFS Mailinglist but thought it would make a good starting point since I couldn't find anything related in bugzilla or the web in general and the problem didn't show up using ext4 (so may not be a generic kernel problem). Any suggestion for a solution (without partitioning the device) would be greatly appreciated since the use of the loop back device doesn't support quotas and I guess brings a performance penalty as well (but I haven't tested it yet). Here is some more information about the virtual machine: It's using Ubuntu LTS 'precise' 64bit root@huddle:~# uname -a Linux huddle 3.2.0-30-generic #48-Ubuntu SMP Fri Aug 24 16:52:48 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux The XFS tools are the following version, though using kernel 2.6.32 the same tools work without problem. root@huddle:~# xfs_repair -V xfs_repair version 3.1.7 That's how the logical volume from the host looks inside the virtual machine: root@huddle:~# ls -l /dev/vdb brw-rw---- 1 root disk 253, 16 Sep 17 19:36 /dev/vdb Running any kernel, blkid still identifies the device correctly as xfs volume: root@huddle:~# blkid /dev/vdb /dev/vdb: UUID=3D"5adcd575-d3f2-48c3-81de-104f125b275e" TYPE=3D"xfs" Thanks in advance. Richard --=20 --------------------------------------------------------------------- Systemadministration [a] Department for Theoretical Chemistry University of Vienna Waehringer Strasse 17/3/304, 1090 Wien, Austria [p] +43 664 920 32 95 [m] hawk@tbi.univie.ac.at [w] http://www.tbi.univie.ac.at/~hawk --------------------------------------------------------------------- --------------enig970F8637FCEB805773DF9AA0 Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG/MacGPG2 v2.0.18 (Darwin) Comment: Using GnuPG with Mozilla - http://www.enigmail.net/ iEYEARECAAYFAlBYNZAACgkQnGohgOrO9GFA1ACfYJlUZoxrxZOPN1KudYcKHzqN btIAoKdUk+spDW8L1eF4EYWVPUuBmzcW =O+hY -----END PGP SIGNATURE----- --------------enig970F8637FCEB805773DF9AA0-- From tinguely@sgi.com Tue Sep 18 08:27:00 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8IDR0UF048401 for ; Tue, 18 Sep 2012 08:27:00 -0500 Received: from [128.162.232.125] (eagdhcp-232-125.americas.sgi.com [128.162.232.125]) by relay1.corp.sgi.com (Postfix) with ESMTP id 5E1E88F8089; Tue, 18 Sep 2012 06:28:08 -0700 (PDT) Message-ID: <505876E6.9040001@sgi.com> Date: Tue, 18 Sep 2012 08:28:06 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Ben Myers CC: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: stop the sync worker before xfs_unmountfs References: <20120829134624.316257238@sgi.com> <20120829134628.835024558@sgi.com> <20120830002335.GB15292@dastard> <20120830172549.GG3274@sgi.com> <20120830223504.GE15292@dastard> <5040FF25.1010501@sgi.com> <20120901230824.GB6896@infradead.org> <20120912183347.GO3274@sgi.com> <20120912231406.GJ11511@dastard> <20120913164344.GV25175@sgi.com> <20120913211847.GS3274@sgi.com> In-Reply-To: <20120913211847.GS3274@sgi.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/13/12 16:18, Ben Myers wrote: > Cancel work of the xfs_sync_worker before teardown of the log in > xfs_unmountfs. This prevents occasional crashes on unmount like so: ... > Signed-off-by: Ben Myers > > Index: xfs/fs/xfs/xfs_super.c > =================================================================== > --- xfs.orig/fs/xfs/xfs_super.c > +++ xfs/fs/xfs/xfs_super.c > @@ -919,6 +919,7 @@ xfs_fs_put_super( > struct xfs_mount *mp = XFS_M(sb); > > xfs_filestream_unmount(mp); > + cancel_delayed_work_sync(&mp->m_sync_work); > xfs_unmountfs(mp); > xfs_syncd_stop(mp); > xfs_freesb(mp); > Tests successfully on all 3 of the machines that were crashing without the patch. Reviewed-by: Mark Tinguely From tinguely@sgi.com Tue Sep 18 08:57:55 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8IDvthM050750 for ; Tue, 18 Sep 2012 08:57:55 -0500 Received: from [128.162.232.125] (eagdhcp-232-125.americas.sgi.com [128.162.232.125]) by relay1.corp.sgi.com (Postfix) with ESMTP id A2B078F8084; Tue, 18 Sep 2012 06:59:06 -0700 (PDT) Message-ID: <50587E28.7090704@sgi.com> Date: Tue, 18 Sep 2012 08:59:04 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [RFC, PATCH 0/102]: xfs: 3.0.x stable kernel update References: <1345698180-13612-1-git-send-email-david@fromorbit.com> In-Reply-To: <1345698180-13612-1-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 08/23/12 00:01, Dave Chinner wrote: > This series is a backport of all the major bug fixes in the current > TOT kernel to the current 3.0.x stable tree. > > I won't make any secret of this - the fixes and supporting patches > have been selected as a result of the issues reported in the current > RHEL XFS codebase which currently is 2 commits short of the 3.0 code > base. With that said, it doesn't take a brain surgeon to work out > the motivations behind this work and eventual destination of the > patch set. ;) > > There's no guarantee I have caught every single bug fix that has > been made since 3.0, but I've tried to grab all the bug fix commits > as indicated by the commit headers (hence the importance of good one > line bug summaries). > > Over the past couple of weeks of testing and refining, I've had only > three significant problems arise from QA and load testing: > > 1) An unreproducable log space hang > 2) An unmount panic due to buffers not being cleaned up > before tearing down the perag tree > 3) A forced shutdown panic in block_invalidatepage() > via xfs_aops_discard_page() > > It's entirely possible that #1 was due to the CIL space hang we > still haven't got to the bottom of, so i'm not not greatly concerned > by that. #2 implies I haven't quite backported the shutdown ordering > fixes correctly (or I missed one), so I have a bit more work to do > there. And for #3 - I've never seen that before and I haven't been > able to reproduce it, so I really don't know what potential cause or > impact it has. > > I've been beating on the series with xfstests, dbench, fsmark, > postmark, compilebench and a few other load scripts that I've got, > and it seems fairly resilient. Hence, it's time to give the series > wider testing and review to flush out any remaining issues. > > For all the folks that run 3.0.x stable kernels, I'd appreciate it if > you could give this a whirl on your test systems to see if there are > any obvious, glaring problems that show up under your particular > workloads. This woul dbe of great benefit to me before I submit the > series to the stable kernel gurus - I'd prefer it there's more > substantial testing than "i've done what I can" when sending them > the series. > > For all the XFS developers that have copious amounts of free time > available, I'd appreciate an eye run over the patch list to see if > there's any potential bug fixes that I missed or have made glaring > errors in backporting. Some of the fixes are dependent on cleanups I > haven't included, so some of the patches are a bit different to what > is in mainline (e.g. anything that touches setattr). Most important > to look at is probably the inode i_size changes and the logging of > all metadata changes. > > Enjoy! > > Cheers, > > Dave. > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs This looks great. Like I said earlier, I did not find Brian Foster's log patch: xfs: check for stale inode before acquiring iflock on push Upstream commit: 9a3a5dab63461b84213052888bf38a962b22d035 sample implementation listed on: http://oss.sgi.com/archives/xfs/2012-09/msg00188.html Reviewed-by: Mark Tinguely From tinguely@sgi.com Tue Sep 18 09:42:30 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_21 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8IEgUPe055322 for ; Tue, 18 Sep 2012 09:42:30 -0500 Received: from [128.162.232.125] (eagdhcp-232-125.americas.sgi.com [128.162.232.125]) by relay2.corp.sgi.com (Postfix) with ESMTP id 88E80304048; Tue, 18 Sep 2012 07:43:38 -0700 (PDT) Message-ID: <50588898.6050802@sgi.com> Date: Tue, 18 Sep 2012 09:43:36 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: "Theodore Ts'o" , linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com Subject: Re: Anyone have test cases for SEEK_HOLE/SEEK_DATA? References: <20120918064039.GS11511@dastard> In-Reply-To: <20120918064039.GS11511@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/18/12 01:40, Dave Chinner wrote: > On Mon, Sep 17, 2012 at 10:04:34PM -0400, Theodore Ts'o wrote: >> >> Does anyone have test cases for SEEK_HOLE/SEEK_DATA handy? As near as I >> can tell xfstests doesn't have any tests for SEEK_HOLE/SEEK_DATA >> functionality, and I was hoping someone had some test programs and test >> sets already written. > > Perhaps a cc to xfs@oss.sgi.com so the xfstests maintainers see the > question would be a sensible idea? > > As it is, there are tests pending check-in that test > seek-data/seek-hole functionality - they were used to verify the > unwritten extent aware XFS implementation that recently went into > the kernel.... > > Cheers, > > Dave. xfstest 285 and 286 (I believe these tests were only in the OSS version and not in the kernel.org developers version of xfstests). There is rough version of another test that I got directly from Jeff Lui, the person who wrote the SEEK_HOLE/SEEK_DATA feature in XFS. This version tests the advance features of SEEK_HOLE/SEEK_DATA. Ben asked me about this advanced test when he committed the advance features of SEEK_HOLE/SEEK_DATA to the XFS OSS tree. To the best of my knowledge, this test has not been submitted as an xfstest so we could not add it then. --Mark Tinguely. From tinguely@sgi.com Tue Sep 18 11:15:13 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8IGFDXW065770 for ; Tue, 18 Sep 2012 11:15:13 -0500 Received: from [128.162.232.125] (eagdhcp-232-125.americas.sgi.com [128.162.232.125]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1A04C304051; Tue, 18 Sep 2012 09:16:21 -0700 (PDT) Message-ID: <50589E53.2050407@sgi.com> Date: Tue, 18 Sep 2012 11:16:19 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Brian Foster CC: xfs@oss.sgi.com Subject: Re: [PATCH] xfstests: fix TEST_MNT typos (should be TEST_DIR) References: <1347894935-1495-1-git-send-email-bfoster@redhat.com> In-Reply-To: <1347894935-1495-1-git-send-email-bfoster@redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/17/12 10:15, Brian Foster wrote: > We mistakenly use TEST_MNT in tests 222 and 253, which is undefined. > Replace these two instances with TEST_DIR. > > Signed-off-by: Brian Foster > --- Good catch. Reviewed-by: Mark Tinguely From tytso@thunk.org Tue Sep 18 13:14:51 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8IIEn3Q078270 for ; Tue, 18 Sep 2012 13:14:51 -0500 X-ASG-Debug-ID: 1347992160-04cbb07ce2486c30001-NocioJ Received: from imap.thunk.org (li9-11.members.linode.com [67.18.176.11]) by cuda.sgi.com with ESMTP id uifWbf371jgPtmu8 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO); Tue, 18 Sep 2012 11:16:00 -0700 (PDT) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 67.18.176.11 Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.72) (envelope-from ) id 1TE2Ku-0003zb-96; Tue, 18 Sep 2012 18:15:52 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 3A095241562; Tue, 18 Sep 2012 14:15:56 -0400 (EDT) Date: Tue, 18 Sep 2012 14:15:56 -0400 From: "Theodore Ts'o" To: Mark Tinguely Cc: Dave Chinner , linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com Subject: Re: Anyone have test cases for SEEK_HOLE/SEEK_DATA? Message-ID: <20120918181556.GC28689@thunk.org> X-ASG-Orig-Subj: Re: Anyone have test cases for SEEK_HOLE/SEEK_DATA? References: <20120918064039.GS11511@dastard> <50588898.6050802@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50588898.6050802@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: li9-11.members.linode.com[67.18.176.11] X-Barracuda-Start-Time: 1347992160 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108907 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Sep 18, 2012 at 09:43:36AM -0500, Mark Tinguely wrote: > xfstest 285 and 286 (I believe these tests were only in the OSS > version and not in the kernel.org developers version of xfstests). Hi Mark, Could you clarify what the relationship is between the OSS xfstests tree and the one on kernel.org? Is the OSS tree always ahead of the kernel.org tree (i.e., are the commits in the OSS tree a superset of the ones in the kernel.org tree)? I had been under the impression that commits flowed from the kernel.org tree to the OSS tree, but it sounds like I was misinformed on that point? Thanks, - Ted From sandeen@sandeen.net Tue Sep 18 13:19:05 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_21 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8IIJ5O9078858 for ; Tue, 18 Sep 2012 13:19:05 -0500 X-ASG-Debug-ID: 1347992416-04cb6c56883cadd0001-NocioJ Received: from mail.sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id 6EmFkWqnhfdXqyBD for ; Tue, 18 Sep 2012 11:20:16 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) (Authenticated sender: sandeen) by mail.sandeen.net (Postfix) with ESMTP id 1C8734964601; Tue, 18 Sep 2012 13:20:16 -0500 (CDT) Message-ID: <5058BB5F.5050506@sandeen.net> Date: Tue, 18 Sep 2012 13:20:15 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20120907 Thunderbird/15.0.1 MIME-Version: 1.0 To: "Theodore Ts'o" CC: Mark Tinguely , linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com Subject: Re: Anyone have test cases for SEEK_HOLE/SEEK_DATA? References: <20120918064039.GS11511@dastard> <50588898.6050802@sgi.com> <20120918181556.GC28689@thunk.org> X-ASG-Orig-Subj: Re: Anyone have test cases for SEEK_HOLE/SEEK_DATA? In-Reply-To: <20120918181556.GC28689@thunk.org> X-Enigmail-Version: 1.4.4 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1347992416 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108908 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 9/18/12 1:15 PM, Theodore Ts'o wrote: > On Tue, Sep 18, 2012 at 09:43:36AM -0500, Mark Tinguely wrote: >> xfstest 285 and 286 (I believe these tests were only in the OSS >> version and not in the kernel.org developers version of xfstests). > > Hi Mark, > > Could you clarify what the relationship is between the OSS xfstests > tree and the one on kernel.org? Is the OSS tree always ahead of the > kernel.org tree (i.e., are the commits in the OSS tree a superset of > the ones in the kernel.org tree)? > > I had been under the impression that commits flowed from the > kernel.org tree to the OSS tree, but it sounds like I was misinformed > on that point? That was more or less correct at one point, but we recently decided to ditch the kernel.org repos and let sgi manage a single repo on oss.sgi.com going forward, just to simplify things. We just reached that agreement and haven't really communicated it yet I guess. So going forward, stick with the one on oss.sgi.com. Thanks, -Eric > Thanks, > > - Ted > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From bpm@sgi.com Tue Sep 18 13:27:34 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_21 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8IIRXOc079778 for ; Tue, 18 Sep 2012 13:27:34 -0500 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay3.corp.sgi.com (Postfix) with ESMTP id DDF22AC005; Tue, 18 Sep 2012 11:28:41 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 80A144266DC; Tue, 18 Sep 2012 13:28:41 -0500 (CDT) Date: Tue, 18 Sep 2012 13:28:41 -0500 From: Ben Myers To: "Theodore Ts'o" Cc: Mark Tinguely , Dave Chinner , linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com Subject: Re: Anyone have test cases for SEEK_HOLE/SEEK_DATA? Message-ID: <20120918182841.GA3343@sgi.com> References: <20120918064039.GS11511@dastard> <50588898.6050802@sgi.com> <20120918181556.GC28689@thunk.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20120918181556.GC28689@thunk.org> User-Agent: Mutt/1.5.20 (2009-06-14) Hey Ted, On Tue, Sep 18, 2012 at 02:15:56PM -0400, Theodore Ts'o wrote: > On Tue, Sep 18, 2012 at 09:43:36AM -0500, Mark Tinguely wrote: > > xfstest 285 and 286 (I believe these tests were only in the OSS > > version and not in the kernel.org developers version of xfstests). > > Could you clarify what the relationship is between the OSS xfstests > tree and the one on kernel.org? Is the OSS tree always ahead of the > kernel.org tree (i.e., are the commits in the OSS tree a superset of > the ones in the kernel.org tree)? The trees on kernel.org are being retired. I'm not sure what Christoph is going to do with the kernel.org repos, but expect new changes to go directly into the xfstests repo on oss.sgi.com. > I had been under the impression that commits flowed from the > kernel.org tree to the OSS tree, but it sounds like I was misinformed > on that point? Your impression is just a few days out of date. See: http://oss.sgi.com/archives/xfs/2012-09/msg00156.html Regards, Ben From tytso@thunk.org Tue Sep 18 13:40:56 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8IIeuJV080938 for ; Tue, 18 Sep 2012 13:40:56 -0500 X-ASG-Debug-ID: 1347993727-04cbb07ce2489d50001-NocioJ Received: from imap.thunk.org (li9-11.members.linode.com [67.18.176.11]) by cuda.sgi.com with ESMTP id AjHYINU1qFj0EwKl (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO); Tue, 18 Sep 2012 11:42:07 -0700 (PDT) X-Barracuda-Envelope-From: tytso@thunk.org X-Barracuda-Apparent-Source-IP: 67.18.176.11 Received: from root (helo=closure.thunk.org) by imap.thunk.org with local-esmtp (Exim 4.72) (envelope-from ) id 1TE2k9-00040t-Rt; Tue, 18 Sep 2012 18:41:57 +0000 Received: by closure.thunk.org (Postfix, from userid 15806) id 548E5241562; Tue, 18 Sep 2012 14:42:01 -0400 (EDT) Date: Tue, 18 Sep 2012 14:42:01 -0400 From: "Theodore Ts'o" To: Ben Myers Cc: Mark Tinguely , Dave Chinner , linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, xfs@oss.sgi.com Subject: Re: Anyone have test cases for SEEK_HOLE/SEEK_DATA? Message-ID: <20120918184201.GD28689@thunk.org> X-ASG-Orig-Subj: Re: Anyone have test cases for SEEK_HOLE/SEEK_DATA? References: <20120918064039.GS11511@dastard> <50588898.6050802@sgi.com> <20120918181556.GC28689@thunk.org> <20120918182841.GA3343@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20120918182841.GA3343@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: tytso@thunk.org X-SA-Exim-Scanned: No (on imap.thunk.org); SAEximRunCond expanded to false X-Barracuda-Connect: li9-11.members.linode.com[67.18.176.11] X-Barracuda-Start-Time: 1347993727 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108908 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Sep 18, 2012 at 01:28:41PM -0500, Ben Myers wrote: > Your impression is just a few days out of date. See: > > http://oss.sgi.com/archives/xfs/2012-09/msg00156.html On a unrelated note, has there been any thought about potentially setting up a separate mailing list dedicated for xfstests? I'm not subscribed to the xfs mailing list, mainly because I was trying to avoid adding yet another high volume mailing list to my inbox (although to be fair, I guess it's only 25 messages per day even on the busiest days), and so I've missed out on review of Dave's changes to break out the tests into hierarchies, etc. I wonder if there are other xfstests users that aren't yet subscribed to the xfs mailing list who would if there was a separate mailing list. Not a big deal; if people really don't want a separate mailing list, I guess I could subscribe to the xfs list as well... - Ted From bpm@sgi.com Tue Sep 18 14:02:37 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_21 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8IJ2b6Q085976 for ; Tue, 18 Sep 2012 14:02:37 -0500 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay3.corp.sgi.com (Postfix) with ESMTP id A1BBDAC003; Tue, 18 Sep 2012 12:03:45 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 473A64266DC; Tue, 18 Sep 2012 14:03:45 -0500 (CDT) Date: Tue, 18 Sep 2012 14:03:45 -0500 From: Ben Myers To: "Theodore Ts'o" Cc: linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, Mark Tinguely , xfs@oss.sgi.com Subject: Re: Anyone have test cases for SEEK_HOLE/SEEK_DATA? Message-ID: <20120918190345.GU3274@sgi.com> References: <20120918064039.GS11511@dastard> <50588898.6050802@sgi.com> <20120918181556.GC28689@thunk.org> <20120918182841.GA3343@sgi.com> <20120918184201.GD28689@thunk.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20120918184201.GD28689@thunk.org> User-Agent: Mutt/1.5.20 (2009-06-14) Hey Ted, On Tue, Sep 18, 2012 at 02:42:01PM -0400, Theodore Ts'o wrote: > On Tue, Sep 18, 2012 at 01:28:41PM -0500, Ben Myers wrote: > > Your impression is just a few days out of date. See: > > > > http://oss.sgi.com/archives/xfs/2012-09/msg00156.html > > On a unrelated note, has there been any thought about potentially > setting up a separate mailing list dedicated for xfstests? You might even be the first person to suggest that. ;) > I'm not > subscribed to the xfs mailing list, mainly because I was trying to > avoid adding yet another high volume mailing list to my inbox > (although to be fair, I guess it's only 25 messages per day even on > the busiest days), and so I've missed out on review of Dave's changes > to break out the tests into hierarchies, etc. I wonder if there are > other xfstests users that aren't yet subscribed to the xfs mailing > list who would if there was a separate mailing list. > > Not a big deal; if people really don't want a separate mailing list, I > guess I could subscribe to the xfs list as well... I think it's worth discussing and I'm not resistant to a separate list. But like you said, xfs@oss.sgi.com isn't extremely high volume. Maybe a filter for xfstests in the subject would be good enough for your purposes? Regards, Ben From bpm@sgi.com Tue Sep 18 15:43:38 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8IKhcCX100331 for ; Tue, 18 Sep 2012 15:43:38 -0500 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay2.corp.sgi.com (Postfix) with ESMTP id 51FDA304053; Tue, 18 Sep 2012 13:44:43 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 2BFC64266DC; Tue, 18 Sep 2012 15:44:43 -0500 (CDT) Date: Tue, 18 Sep 2012 15:44:43 -0500 From: Ben Myers To: Eric Sandeen Cc: xfs-oss , =?UTF-8?B?QXJrYWRpdXN6IE1pxZtraWV3aWM=?=@oss.sgi.com, Bill Kendall , Boris Ranto Subject: Re: [PATCH] xfsdump: save & restore 32-bit projids Message-ID: <20120918204443.GV3274@sgi.com> References: <503ABD37.7090006@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <503ABD37.7090006@redhat.com> User-Agent: Mutt/1.5.20 (2009-06-14) Hey Eric, On Sun, Aug 26, 2012 at 07:20:07PM -0500, Eric Sandeen wrote: > Current xfsdump/xfsrestore only recognize the lower 16 bits of the projid. > With this patch, the full 32 bits are dumped & restored. > > Reported-by: Boris Ranto > Cc: Arkadiusz MiÅ›kiewicz > Signed-off-by: Eric Sandeen > --- > > This also adds a definition for bs_forkoff, but I don't think > that is something which should get saved & restored, correct? > > TBH I've done very little hacking on xfsdump. I think this > requires a new version, but not sure. This seems to work but > may need sanity checks & fixups. And, of course, an xfstest. I have two versioned dump files ~/dump-v3 and ~/dump-v4. v3 is prior to your patch and v4 was with this patch. Here is a version 3 xfsrestore of a version 4 dump: ~/xfsdump # xfsrestore -f ~/dump-v4 /mnt/scratch xfsrestore: using file dump (drive_simple) strategy xfsrestore: version 3.1.0 (dump format 3.0) - type ^C for status and control ^^^^^^^^^^^^^^^ version 3 xfsrestore: searching media for dump xfsrestore: ERROR: unrecognized media file header version (4) xfsrestore: restore complete: 0 seconds elapsed xfsrestore: Restore Summary: xfsrestore: stream 0 /root/dump-v4 OK (success) xfsrestore: Restore Status: SUCCESS <---- FAIL? We should consider whether failure is the correct thing to do when trying to restore from an incompatible dump file. That is not a problem with this patch. Now a version 4 xfsrestore with a version 3 dump: ~/xfsdump # xfsrestore -f ~/dump-v3 /mnt/scratch xfsrestore: using file dump (drive_simple) strategy xfsrestore: version 3.1.0 (dump format 4.0) - type ^C for status and control ^^^^^^^^^^^^^^^ version 4, looks good xfsrestore: searching media for dump xfsrestore: examining media file 0 xfsrestore: dump description: xfsrestore: hostname: foo xfsrestore: mount point: /mnt/scratch xfsrestore: volume: /dev/sdb1 xfsrestore: session time: Tue Sep 18 14:45:36 2012 xfsrestore: level: 0 xfsrestore: session label: "k" xfsrestore: media label: "k" xfsrestore: file system id: 983f85f2-9a11-460d-a276-9aec42fbd8f7 xfsrestore: session id: 4fbfbd3d-6f4a-4ad5-909b-bdf4742e849d xfsrestore: media id: 41f8e77c-7b93-49c5-a9ed-c66a391778e7 xfsrestore: using online session inventory xfsrestore: searching media for directory dump xfsrestore: reading directories xfsrestore: 4 directories and 9 entries processed xfsrestore: directory post-processing xfsrestore: restoring non-directory files xfsrestore: restore complete: 0 seconds elapsed xfsrestore: Restore Summary: xfsrestore: stream 0 /root/dump-v3 OK (success) xfsrestore: Restore Status: SUCCESS So the behavior with respect to versioning is: You can restore from dumps that have a smaller or equal dump version than your xfsrestore, but not from dumps with versions greater than your xfsrestore. Now I'd like to see the behavior with some project ids set and a version 3 dump with version 4 xfsrestore. A version 4 xfsrestore with a version 3 dump: ~/xfsdump # xfsrestore -f ~/dump-v3-3 /mnt/scratch/restore/ xfsrestore: using file dump (drive_simple) strategy xfsrestore: version 3.1.0 (dump format 4.0) - type ^C for status and control xfsrestore: searching media for dump xfsrestore: examining media file 0 xfsrestore: dump description: xfsrestore: hostname: foo xfsrestore: mount point: /mnt/scratch xfsrestore: volume: /dev/sdb1 xfsrestore: session time: Tue Sep 18 15:18:16 2012 xfsrestore: level: 0 xfsrestore: session label: "l" xfsrestore: media label: "l" xfsrestore: file system id: 983f85f2-9a11-460d-a276-9aec42fbd8f7 xfsrestore: session id: 9ad2909c-3542-428b-9f73-0bf207b77888 xfsrestore: media id: 529e47bc-b6fa-427c-a0f5-dcd4c9707adc xfsrestore: using online session inventory xfsrestore: searching media for directory dump xfsrestore: reading directories xfsrestore: 4 directories and 8 entries processed xfsrestore: directory post-processing xfsrestore: restoring non-directory files xfsrestore: project quota information written to '/mnt/scratch/restore//xfsdump_quotas_proj' xfsrestore: use 'xfs_quota' to restore quotas xfsrestore: restore complete: 0 seconds elapsed xfsrestore: Restore Summary: xfsrestore: stream 0 /root/dump-v3-3 OK (success) xfsrestore: Restore Status: SUCCESS And a version 4 xfsrestore with a version 4 dump: ~/xfsdump # xfsrestore -f ~/dump-v4-3 /mnt/scratch/restore2 xfsrestore: using file dump (drive_simple) strategy xfsrestore: version 3.1.0 (dump format 4.0) - type ^C for status and control xfsrestore: searching media for dump xfsrestore: examining media file 0 xfsrestore: dump description: xfsrestore: hostname: foo xfsrestore: mount point: /mnt/scratch xfsrestore: volume: /dev/sdb1 xfsrestore: session time: Tue Sep 18 15:20:18 2012 xfsrestore: level: 0 xfsrestore: session label: "l" xfsrestore: media label: "l" xfsrestore: file system id: 983f85f2-9a11-460d-a276-9aec42fbd8f7 xfsrestore: session id: e5d07daf-3bfc-4ab8-b13c-ad48db813807 xfsrestore: media id: 9d043994-9abb-4fd0-8cc9-eda68c62641c xfsrestore: using online session inventory xfsrestore: searching media for directory dump xfsrestore: reading directories xfsrestore: 4 directories and 8 entries processed xfsrestore: directory post-processing xfsrestore: restoring non-directory files xfsrestore: project quota information written to '/mnt/scratch/restore2/xfsdump_quotas_proj' xfsrestore: use 'xfs_quota' to restore quotas xfsrestore: restore complete: 0 seconds elapsed xfsrestore: Restore Summary: xfsrestore: stream 0 /root/dump-v4-3 OK (success) xfsrestore: Restore Status: SUCCESS Here are the files with project quotas: originals: ~/xfsdump # xfs_io -r -c "lsproj" /mnt/scratch/dumpme/16bit projid = 1234 ~/xfsdump # xfs_io -r -c "lsproj" /mnt/scratch/dumpme/32bit projid = 2123456789 from the v3 dump: ~/xfsdump # xfs_io -r -c "lsproj" /mnt/scratch/restore/dumpme/16bit projid = 1234 ~/xfsdump # xfs_io -r -c "lsproj" /mnt/scratch/restore/dumpme/32bit projid = 24853 <--- note that it is munged just as in test 287 from the v4 dump: ~/xfsdump # xfs_io -r -c "lsproj" /mnt/scratch/restore2/dumpme/16bit projid = 1234 ~/xfsdump # xfs_io -r -c "lsproj" /mnt/scratch/restore2/dumpme/32bit projid = 2123456789 The code looks good, the xfstest 287 looks good, and the above shows that we have the desired behavior with respect to dump versioning. Reviewed-by: Ben Myers Committed to git://oss.sgi.com/xfs/cmds/xfsdump.git, master branch. From david@fromorbit.com Tue Sep 18 15:54:03 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_54 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8IKs3Bw101100 for ; Tue, 18 Sep 2012 15:54:03 -0500 X-ASG-Debug-ID: 1348001712-04cbb07ce3492330001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id qi0E6d0ZsPBDdhWL for ; Tue, 18 Sep 2012 13:55:12 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ArsMALvYWFB5LJUB/2dsb2JhbABFDoUSthoBAoEEgQmCIAEBBAE6HBgLBQsIAw4KLhQlAyETG4dfBbpNFIsHIAdkaIQdYAOVYpAigixMgUkB Received: from ppp121-44-149-1.lns20.syd7.internode.on.net (HELO dastard) ([121.44.149.1]) by ipmail06.adl6.internode.on.net with ESMTP; 19 Sep 2012 06:25:10 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TE4p3-0008GV-0c; Wed, 19 Sep 2012 06:55:09 +1000 Date: Wed, 19 Sep 2012 06:55:08 +1000 From: Dave Chinner To: Richard Neuboeck Cc: xfs@oss.sgi.com Subject: Re: xfs mount fails 'can't read superblock' Message-ID: <20120918205508.GA31501@dastard> X-ASG-Orig-Subj: Re: xfs mount fails 'can't read superblock' References: <50583590.7060702@tbi.univie.ac.at> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50583590.7060702@tbi.univie.ac.at> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1348001712 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108918 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Sep 18, 2012 at 10:49:20AM +0200, Richard Neuboeck wrote: > Hi XFS gurus, > > I've a XFS related problem that boggles my find and I couldn't find a > solution yet. > > I've got a virtual machine (huddle) that gets a ~66TB logical volume > from the host handed as (virtio) block device (/dev/vdb). For ease of > maintenance I didn't partition the device but formatted it directly with > xfs. The system at the time of formatting was Ubuntu Lucid 64bit. virtio configuration? (i.e. cache=none?) > A few days ago I upgraded the virtual machine to Ubuntu LTS 'precise', > Kernel 3.2, and got the following error while trying to mount the device: Upgraded from what? > root@huddle:~# mount /dev/vdb /mnt/storage > mount: /dev/vdb: can't read superblock > > dmesg shows some more info: > root@huddle:~# dmesg | tail > [ 672.774206] end_request: I/O error, dev vdb, sector 0 > [ 672.774393] XFS (vdb): SB buffer read failed > > At first I thought the block device had some error and checked the > virtual machine configuration and host system. > > From the host system (Ubuntu lucid 64bit, Kernel 2.6) I can still mount > the xfs formatted device without problems. I also ran xfs_repair -n that > didn't show any problem. So the filesystem is accesible via direct IO from the host. What's the xfs_info output once it is mounted? > I tried to hand the virual machine a different ext4 formated block > device (also without partition and preformatted). This didn't yield any > mount problems. > > The Ubuntu 'precise' machine has an older kernel (2.6.32-42) too. > Booting this kernel the xfs formatted block device gets mounted without > error. The newer kernel has a different buffer cache implementation, so sector sized IO (such as superblocks) is cached and issued differently. > The curious part is that it is still possible to mount the volume under > Kernel 3.2 without error using the loop option: > > root@huddle:~# mount -v -t xfs -o loop /dev/vdb /mnt/storage/ Turns all IO into pagecache based IO, so 4k aligned. Will avoid any sector size mismatch issues. > Trying xfs_repair also brings up the I/O Error unless I use it with the > -f option under Kernel 3.2. -f can turn direct IO into buffered IO is there is a sector size mismatch between the filesystem and the underlying storage. > Obviously the problem is Kernel 3.2 related. I'm not sure if I'm at the > right place in the XFS Mailinglist but thought it would make a good > starting point since I couldn't find anything related in bugzilla or the > web in general and the problem didn't show up using ext4 (so may not be > a generic kernel problem). Sounds like a sector size based problem to me - direct Io does sector aligned and sized IO, buffered IO does page sized IO. So my initial thought is that you've got a 512 byte sector filesystem on a 4k sector device.... > Running any kernel, blkid still identifies the device correctly as xfs > volume: > root@huddle:~# blkid /dev/vdb > /dev/vdb: UUID="5adcd575-d3f2-48c3-81de-104f125b275e" TYPE="xfs" Buffered IO, again. Cheers, Dave. -- Dave Chinner david@fromorbit.com From stan@hardwarefreak.com Tue Sep 18 16:19:47 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8ILJlP3103767 for ; Tue, 18 Sep 2012 16:19:47 -0500 X-ASG-Debug-ID: 1348003257-04cb6c56873d7fe0001-NocioJ Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id fuZGW3StAzmmySc7 for ; Tue, 18 Sep 2012 14:20:58 -0700 (PDT) X-Barracuda-Envelope-From: stan@hardwarefreak.com X-Barracuda-Apparent-Source-IP: 65.41.216.221 X-Barracuda-User-Whitelist: xfs@oss.sgi.com Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id 96A6D6C058; Tue, 18 Sep 2012 16:20:57 -0500 (CDT) Message-ID: <5058E5B9.8020000@hardwarefreak.com> Date: Tue, 18 Sep 2012 16:20:57 -0500 From: Stan Hoeppner Reply-To: stan@hardwarefreak.com User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:15.0) Gecko/20120907 Thunderbird/15.0.1 MIME-Version: 1.0 To: GuoZhong Han CC: David Brown , linux-raid@vger.kernel.org, "xfs@oss.sgi.com" Subject: Re: make filesystem failed while the capacity of raid5 is big than 16TB References: <505033fe.8aec440a.5d52.ffffe37b@mx.google.com> <50504094.2040302@hesbynett.no> <505059DD.8000108@hesbynett.no> <5051DEC3.9050703@hardwarefreak.com> X-ASG-Orig-Subj: Re: make filesystem failed while the capacity of raid5 is big than 16TB In-Reply-To: Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1348003258 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com I'm copying the XFS list as this discussion has migrated more toward filesystem/workload tuning. On 9/18/2012 4:35 AM, GuoZhong Han wrote: > Hi Stan: > Thanks for your advice. In your last mail, you mentioned XFS > file system. According to your suggestion, I changed the file system > from raid5 (4*2T, chunksize: 128K, strip_catch_size:2048) to XFS. Then > I did a write performance test on XFS. > The test was as follows: > My program used 4 threads to do parallel writing to 30 files > with 1MB/s writing speed on each file. Each thread was bound on a > single core. The estimated total speed should be stable at 30MB/s. I > recorded the total writing speed every second in the test. Compared > with speed of ext4, when the array was going to be full, the > performance of XFS has indeed increased. The time to create the XFS > file system was much less than the cost of ext4. However, I found that > the total speed wasn’t steady. Although most of time the speed can > reach to 30M/s, it fell to only about 10MB/s in rare cases. Writing to > 30 files in parallel was supposed to be easy. Why did this happen? We'll need more details of your test program and the kernel version you're using, as well as the directory/file layout used in testing. Your fstab entry for the filesystem, as well as xfs_info output, are also needed. In general, this type of behavior is due to the disks not being able to seek quickly enough to satisfy all requests, causing latency, and thus the dip in bandwidth. Writing 30 files in parallel to 3x SATA stripe members is going to put a large seek load on the disks. If one of your tests adds some metadata writes to this workload, the extra writes to the journal and directory inodes may be enough to saturate the head actuators. Additionally, write barriers are enabled by default, and so flushing of the drive caches after journal writes may be playing a role here as well. > 2012/9/13 Stan Hoeppner : >> On 9/12/2012 10:21 PM, GuoZhong Han wrote: >> >>> This system has a 36 cores CPU, the frequency of each core is >>> 1.2G. >> >> Obviously not an x86 CPU. 36 cores. Must be a Tilera chip. >> >> GuoZhong, be aware that high core count systems are a poor match for >> Linux md/RAID levels 1/5/6/10. These md/RAID drivers currently utilize >> a single write thread, and thus can only use one CPU core at a time. >> >> To begin to sufficiently scale these md array types across 36x 1.2GHz >> cores you would need something like the following configurations, all >> striped together or concatenated with md or LVM: >> >> 72x md/RAID1 mirror pairs >> 36x 4 disk RAID10 arrays >> 36x 4 disk RAID6 ararys >> 36x 3 disk RAID5 arrays >> >> Patches are currently being developed to increase the parallelism of >> RAID1/5/6/10 but will likely not be ready for production kernels for >> some time. These patches will however still not allow scaling an >> md/RAID driver across such a high core count. You'll still need >> multiple arrays to take advantage of 36 cores. Thus, this 16 drive >> storage appliance would have much better performance with a single/dual >> core CPU with a 2-3GHz clock speed. >> >>> The users can create a raid0, raid10 >>> and raid5 use the disks they designated. >> >> This is a storage appliance. Due to the market you're targeting, the >> RAID level should be chosen by the manufacturer and not selectable by >> the user. Choice is normally a good thing. But with this type of >> product, allowing users the choice of array type will simply cause your >> company may problems. You will constantly field support issues about >> actual performance not meeting expectations, etc. And you don't want to >> allow RAID5 under any circumstances for a storage appliance product. In >> this category, most users won't immediately replace failed drives, so >> you need to "force" the extra protection of RAID6 or RAID10 upon the >> customer. >> >> If I were doing such a product, I'd immediately toss out the 36 core >> logic platform and switch to a low power single/dual core x86 chip. And >> as much as I disdain parity RAID, for such an appliance I'd make RAID6 >> the factory default, not changeable by the user. Since md/RAID doesn't >> scale well across multicore CPUs, and because wide parity arrays yield >> poor performance, I would make 2x 8 drive RAID6 arrays at the factory, >> concatenate them with md/RAID linear, and format the linear device with >> XFS. Manually force a 64KB chunk size for the RAID6 arrays. You don't >> want the 512KB default in a storage appliance. Specify stripe alignment >> when formatting with XFS. In this case, su=64K and sw=6. See "man >> mdadm" and "man mkfs.xfs". >> >>> 1. The system must support parallel write more than 150 >>> files; the speed of each will reach to 1M/s. >> >> For highly parallel write workloads you definitely want XFS. >> >>> If the array is full, >>> wipe its data to re-write. >> >> What do you mean by this? Surely you don't mean to arbitrarily erase >> user date to make room for more user data. >> >>> 2. Necessarily parallel the ability to read multiple files. >> >> Again, XFS best fits this requirement. >> >>> 3. as much as possible to use the storage space >> >> RAID6 is the best option here for space efficiency and resilience to >> array failure. RAID5 is asking for heartache, especially in an >> appliance product, where users tend to neglect the box until it breaks >> to the point of no longer working. >> >>> 4. The system must have certain redundancy, when a disk >>> failed, the users can use other disk instead of the failed disk. >> >> That's what RAID is for, so you're on the right track. ;) >> >>> 5. The system must support disk hot-swap >> >> That up to your hardware design. Lots of pre-built solution already on >> the OEM market. >> >>> I have tested the performance for write of 4*2T raid5 and >>> 8*2T raid5 of which the file system is ext4, the chuck size is 128K >>> and the strip_cache_size is 2048. At the beginning, these two raid5s >>> worked well. But there was a same problem, when the array was going to >>> be full, the speeds of the write performance tend to slower, there >>> were lots of data lost while parallel write 1M/s to 150 files. >> >> You shouldn't have lost data doing this. That suggests some other >> problem. EXT4 is not particularly adept at managing free space >> fragmentation. XFS will do much better here. But even with XFS, >> depending on the workload and the "aging" of the filesystem, even XFS >> will will slow down considerably when the filesystem approaches ~95% >> full. This obviously depends a bit on drive size and total array size >> as well. 5% of a 12TB filesystem is quite less than a 36TB filesystem, >> 600GB vs 1.8TB. And the degradation depends on what types of files >> you're writing and how many in parallel to your nearly full XFS. >> >>> As you said, the performance for write of 16*2T raid5 will be >>> terrible, so what do you think that how many disks to be build to a >>> raid5 will be more appropriate? >> >> Again, do not use RAID5 for a storage appliance. Use RAID6 instead, and >> use multiple RAID6 arrays concatenated together. >> >>> I do not know whether I describe the requirement of the >>> system accurately. I hope I can get your advice. >> >> You described it well, except for the part about wipe data and rewrite >> when array is full. >> >> -- >> Stan >> From bpm@sgi.com Tue Sep 18 16:25:32 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_45, J_CHICKENPOX_47 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8ILPWh7104385 for ; Tue, 18 Sep 2012 16:25:32 -0500 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay2.corp.sgi.com (Postfix) with ESMTP id 4CDEC304051; Tue, 18 Sep 2012 14:26:40 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 1BE214266DC; Tue, 18 Sep 2012 16:26:40 -0500 (CDT) Date: Tue, 18 Sep 2012 16:26:40 -0500 From: Ben Myers To: Jan Kara Cc: Dave Chinner , linux-ext4@vger.kernel.org, dmonakhov@openvz.org, xfs@oss.sgi.com Subject: Re: Test 272 fails for ext3 Message-ID: <20120918212640.GW3274@sgi.com> References: <20120816092808.GA9057@quack.suse.cz> <20120816093757.GA11519@quack.suse.cz> <20120816224858.GY2877@dastard> <20120820162212.GA17354@quack.suse.cz> <20120820210638.GA4591@quack.suse.cz> <20120820224941.GG19235@dastard> <20120821080338.GA7537@quack.suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20120821080338.GA7537@quack.suse.cz> User-Agent: Mutt/1.5.20 (2009-06-14) On Tue, Aug 21, 2012 at 10:03:39AM +0200, Jan Kara wrote: > On Tue 21-08-12 08:49:41, Dave Chinner wrote: > > On Mon, Aug 20, 2012 at 11:06:38PM +0200, Jan Kara wrote: > > .... > > > --- a/272 > > > +++ b/272 > > > @@ -32,15 +32,18 @@ tmp=/tmp/$$ > > > status=1 # failure is the default! > > > trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15 > > > > > > +write_opt_list="iflag=noatime conv=notrunc conv=fsync oflag=direct" > > > +if [ $FSTYP = "ext3" ]; then > > > + # ext3 doesn't support direct IO in journalling mode > > > + write_opt_list="iflag=noatime conv=notrunc conv=fsync" > > > +fi > > > > Seems like asking for trouble duplicating the common options. > > > > # ext3 doesn't support direct IO in journalling mode > > write_opt_list="iflag=noatime conv=notrunc conv=fsync > > [ $FSTYP = "ext4" ] && write_opt_list="$write_opt_list oflag=direct" > > > > Otherwise looks fine. > > > > Reviewed-by: Dave Chinner > OK, I've updated the test as you suggested. Result is attached. Committed to git://oss.sgi.com/xfs/cmds/xfstests.git, master branch. From bpm@oss.sgi.com Tue Sep 18 16:50:59 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=ALL_TRUSTED,BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from oss.sgi.com (localhost [127.0.0.1]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8ILoxYm106541 for ; Tue, 18 Sep 2012 16:50:59 -0500 Received: (from bpm@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id q8ILoxfp106508; Tue, 18 Sep 2012 16:50:59 -0500 Date: Tue, 18 Sep 2012 16:50:59 -0500 Message-Id: <201209182150.q8ILoxfp106508@oss.sgi.com> From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, for-linus, updated. for-linus-v3.6-rc4-2-g0ba6e53 X-Git-Refname: refs/heads/for-linus X-Git-Reftype: branch X-Git-Oldrev: a672e1be30d5bc848cd0067c55ed29b2015b7c17 X-Git-Newrev: 0ba6e5368c302819da7aff537e0d7eff2616c6a6 This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, for-linus has been updated 0ba6e53 xfs: stop the sync worker before xfs_unmountfs 6fb8a90 xfs: fix race while discarding buffers [V4] from a672e1be30d5bc848cd0067c55ed29b2015b7c17 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 0ba6e5368c302819da7aff537e0d7eff2616c6a6 Author: Ben Myers Date: Thu Sep 13 16:18:47 2012 -0500 xfs: stop the sync worker before xfs_unmountfs Cancel work of the xfs_sync_worker before teardown of the log in xfs_unmountfs. This prevents occasional crashes on unmount like so: PID: 21602 TASK: ee9df060 CPU: 0 COMMAND: "kworker/0:3" #0 [c5377d28] crash_kexec at c0292c94 #1 [c5377d80] oops_end at c07090c2 #2 [c5377d98] no_context at c06f614e #3 [c5377dbc] __bad_area_nosemaphore at c06f6281 #4 [c5377df4] bad_area_nosemaphore at c06f629b #5 [c5377e00] do_page_fault at c070b0cb #6 [c5377e7c] error_code (via page_fault) at c070892c EAX: f300c6a8 EBX: f300c6a8 ECX: 000000c0 EDX: 000000c0 EBP: c5377ed0 DS: 007b ESI: 00000000 ES: 007b EDI: 00000001 GS: ffffad20 CS: 0060 EIP: c0481ad0 ERR: ffffffff EFLAGS: 00010246 #7 [c5377eb0] atomic64_read_cx8 at c0481ad0 #8 [c5377ebc] xlog_assign_tail_lsn_locked at f7cc7c6e [xfs] #9 [c5377ed4] xfs_trans_ail_delete_bulk at f7ccd520 [xfs] #10 [c5377f0c] xfs_buf_iodone at f7ccb602 [xfs] #11 [c5377f24] xfs_buf_do_callbacks at f7cca524 [xfs] #12 [c5377f30] xfs_buf_iodone_callbacks at f7cca5da [xfs] #13 [c5377f4c] xfs_buf_iodone_work at f7c718d0 [xfs] #14 [c5377f58] process_one_work at c024ee4c #15 [c5377f98] worker_thread at c024f43d #16 [c5377fbc] kthread at c025326b #17 [c5377fe8] kernel_thread_helper at c070e834 PID: 26653 TASK: e79143b0 CPU: 3 COMMAND: "umount" #0 [cde0fda0] __schedule at c0706595 #1 [cde0fe28] schedule at c0706b89 #2 [cde0fe30] schedule_timeout at c0705600 #3 [cde0fe94] __down_common at c0706098 #4 [cde0fec8] __down at c0706122 #5 [cde0fed0] down at c025936f #6 [cde0fee0] xfs_buf_lock at f7c7131d [xfs] #7 [cde0ff00] xfs_freesb at f7cc2236 [xfs] #8 [cde0ff10] xfs_fs_put_super at f7c80f21 [xfs] #9 [cde0ff1c] generic_shutdown_super at c0333d7a #10 [cde0ff38] kill_block_super at c0333e0f #11 [cde0ff48] deactivate_locked_super at c0334218 #12 [cde0ff58] deactivate_super at c033495d #13 [cde0ff68] mntput_no_expire at c034bc13 #14 [cde0ff7c] sys_umount at c034cc69 #15 [cde0ffa0] sys_oldumount at c034ccd4 #16 [cde0ffb0] system_call at c0707e66 commit 11159a05 added this to xfs_log_unmount and needs to be cleaned up at a later date. Signed-off-by: Ben Myers Reviewed-by: Dave Chinner Reviewed-by: Mark Tinguely commit 6fb8a90aa3f2319a25f3396b1e9273300f8903b8 Author: Carlos Maiolino Date: Fri Aug 10 15:01:51 2012 -0300 xfs: fix race while discarding buffers [V4] While xfs_buftarg_shrink() is freeing buffers from the dispose list (filled with buffers from lru list), there is a possibility to have xfs_buf_stale() racing with it, and removing buffers from dispose list before xfs_buftarg_shrink() does it. This happens because xfs_buftarg_shrink() handle the dispose list without locking and the test condition in xfs_buf_stale() checks for the buffer being in *any* list: if (!list_empty(&bp->b_lru)) If the buffer happens to be on dispose list, this causes the buffer counter of lru list (btp->bt_lru_nr) to be decremented twice (once in xfs_buftarg_shrink() and another in xfs_buf_stale()) causing a wrong account usage of the lru list. This may cause xfs_buftarg_shrink() to return a wrong value to the memory shrinker shrink_slab(), and such account error may also cause an underflowed value to be returned; since the counter is lower than the current number of items in the lru list, a decrement may happen when the counter is 0, causing an underflow on the counter. The fix uses a new flag field (and a new buffer flag) to serialize buffer handling during the shrink process. The new flag field has been designed to use btp->bt_lru_lock/unlock instead of xfs_buf_lock/unlock mechanism. dchinner, sandeen, aquini and aris also deserve credits for this. Signed-off-by: Carlos Maiolino Reviewed-by: Ben Myers Reviewed-by: Dave Chinner Signed-off-by: Ben Myers ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_buf.c | 5 ++++- fs/xfs/xfs_buf.h | 41 ++++++++++++++++++++++++----------------- fs/xfs/xfs_super.c | 1 + 3 files changed, 29 insertions(+), 18 deletions(-) hooks/post-receive -- XFS development tree From david@fromorbit.com Tue Sep 18 18:49:43 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8INngHe116886 for ; Tue, 18 Sep 2012 18:49:43 -0500 X-ASG-Debug-ID: 1348012251-04bdf0067d3c1600001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id qVIdwAG5a4QThBGR for ; Tue, 18 Sep 2012 16:50:52 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ArkMABgIWVB5LJUB/2dsb2JhbABFhSC2GgECgQSBCYIgAQEFOhwjEAgDGC4UJQMhE4d/DLpOFIsHgQtohB1gA5VikCKCeA Received: from ppp121-44-149-1.lns20.syd7.internode.on.net (HELO dastard) ([121.44.149.1]) by ipmail06.adl6.internode.on.net with ESMTP; 19 Sep 2012 09:20:51 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TE7Z3-0000B6-IT; Wed, 19 Sep 2012 09:50:49 +1000 Date: Wed, 19 Sep 2012 09:50:49 +1000 From: Dave Chinner To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: [RFC, PATCH 0/102]: xfs: 3.0.x stable kernel update Message-ID: <20120918235049.GB31501@dastard> X-ASG-Orig-Subj: Re: [RFC, PATCH 0/102]: xfs: 3.0.x stable kernel update References: <1345698180-13612-1-git-send-email-david@fromorbit.com> <50587E28.7090704@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50587E28.7090704@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1348012252 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=COMMA_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108930 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 COMMA_SUBJECT Subject is like 'Re: FDSDS, this is a subject' On Tue, Sep 18, 2012 at 08:59:04AM -0500, Mark Tinguely wrote: > This looks great. Like I said earlier, I did not find Brian Foster's > log patch: > xfs: check for stale inode before acquiring iflock on push > Upstream commit: 9a3a5dab63461b84213052888bf38a962b22d035 > sample implementation listed on: > http://oss.sgi.com/archives/xfs/2012-09/msg00188.html > > Reviewed-by: Mark Tinguely Thatnks for looking over this, Mark. The above patch does not directly apply to the 3.0.x branch because the rework of the log item lock/push logic in the AIL was not included in the series. Hence I'm not sure that backportingthis patch is necessary because the problem only arose after we change the locking/push logic... Cheers, Dave. -- Dave Chinner david@fromorbit.com From xfs-owner@oss.sgi.com Tue Sep 18 20:15:15 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8J1FFaj123809 for ; Tue, 18 Sep 2012 20:15:15 -0500 X-ASG-Debug-ID: 1348017383-04bdf0067c3c5760001-w1Z2WR Received: from notomys.init7.net (notomys.init7.net [77.109.141.5]) by cuda.sgi.com with ESMTP id n4yygQsZErzby81r (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 18 Sep 2012 18:16:24 -0700 (PDT) X-Barracuda-Envelope-From: swinog-bounces@lists.swinog.ch X-Barracuda-Apparent-Source-IP: 77.109.141.5 Received: from localhost ([::1] helo=notomys.init7.net) by notomys.init7.net with esmtp (Exim 4.72) (envelope-from ) id 1TE8tr-000491-4k for linux-xfs@oss.sgi.com; Wed, 19 Sep 2012 03:16:23 +0200 MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Subject: Your message to swinog awaits moderator approval From: swinog-bounces@lists.swinog.ch X-ASG-Orig-Subj: Your message to swinog awaits moderator approval To: linux-xfs@oss.sgi.com Message-ID: Date: Wed, 19 Sep 2012 03:16:16 +0200 Precedence: bulk X-BeenThere: swinog@lists.swinog.ch X-Mailman-Version: 2.1.13 List-Id: "ML for http://www.swinog.ch/" X-List-Administrivia: yes Sender: swinog-bounces@lists.swinog.ch Errors-To: swinog-bounces@lists.swinog.ch X-Barracuda-Connect: notomys.init7.net[77.109.141.5] X-Barracuda-Start-Time: 1348017384 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108934 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name Your mail to 'swinog' with the subject Message could not be delivered Is being held until the list moderator can review it for approval. The reason it is being held: Post by non-member to a members-only list Either the message will get posted to the list, or you will receive notification of the moderator's decision. If you would like to cancel this posting, please visit the following URL: http://lists.swinog.ch/cgi-bin/mailman/confirm/swinog/8f6eeb9349a9c9c0291272fcaf7a031be340bca8 From cmaiolino@redhat.com Wed Sep 19 01:10:04 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8J6A4Vo158664 for ; Wed, 19 Sep 2012 01:10:04 -0500 X-ASG-Debug-ID: 1348035075-04cb6c56863f2bf0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id EiWQ26mrCXAxGalt for ; Tue, 18 Sep 2012 23:11:15 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8J6BEBi031124 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 19 Sep 2012 02:11:15 -0400 Received: from andromeda.usersys.redhat.com (vpn1-7-14.gru2.redhat.com [10.97.7.14]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q8J6BDjV014802 for ; Wed, 19 Sep 2012 02:11:14 -0400 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: [PATCH 0/6 V3] inode32/inode64 allocation changes Date: Wed, 19 Sep 2012 03:10:59 -0300 X-ASG-Orig-Subj: [PATCH 0/6 V3] inode32/inode64 allocation changes Message-Id: <1348035065-6934-1-git-send-email-cmaiolino@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1348035075 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com This patch set adds inode64 as the default allocation mode, but also includes 2 patches to remove duplicated code and another one to make inode32 able to be remounted. NOTE: This patch has as dependency "Make inode64 a remountable option" patch. V3 has a better factoring of each patch goal, including other dchinner's suggestions in V2. Also it contains a fix in how m_agirotor reset is made (patch 01) that I've found while doing tests with these patches. Carlos Maiolino (6): xfs: Fix m_agirotor reset during AG selection xfs: make inode64 as the default allocation mode xfs: reduce code duplication handling inode32/64 options xfs: Fix mp->m_maxagi update during inode64 remount xfs: add inode64->inode32 transition into xfs_set_inode32() xfs: Make inode32 a remountable option fs/xfs/xfs_ialloc.c | 2 +- fs/xfs/xfs_mount.c | 43 +++---------------- fs/xfs/xfs_super.c | 117 ++++++++++++++++++++++++++++++++++++++++------------ fs/xfs/xfs_super.h | 2 + 4 files changed, 99 insertions(+), 65 deletions(-) -- 1.7.11.4 From cmaiolino@redhat.com Wed Sep 19 01:10:09 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8J6A94q158686 for ; Wed, 19 Sep 2012 01:10:09 -0500 X-ASG-Debug-ID: 1348035080-04bdf06cd02dc390001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id okfhjHAhamApxNC1 for ; Tue, 18 Sep 2012 23:11:20 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8J6BKgA020803 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 19 Sep 2012 02:11:20 -0400 Received: from andromeda.usersys.redhat.com (vpn1-7-14.gru2.redhat.com [10.97.7.14]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q8J6BDjW014802 for ; Wed, 19 Sep 2012 02:11:20 -0400 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: [PATCH 1/6] xfs: Fix m_agirotor reset during AG selection Date: Wed, 19 Sep 2012 03:11:00 -0300 X-ASG-Orig-Subj: [PATCH 1/6] xfs: Fix m_agirotor reset during AG selection Message-Id: <1348035065-6934-2-git-send-email-cmaiolino@redhat.com> In-Reply-To: <1348035065-6934-1-git-send-email-cmaiolino@redhat.com> References: <1348035065-6934-1-git-send-email-cmaiolino@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1348035080 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com xfs_ialloc_next_ag() currently resets m_agirotor when it is equal to m_maxagi: if (++mp->m_agirotor == mp->m_maxagi) mp->m_agirotor = 0; But, if for some reason mp->m_maxagi changes to a lower value than current m_agirotor, this condition will never be true, causing m_agirotor to exceed the maximum allowed value (m_maxagi). This implies mainly during lookups for xfs_perag structs in its radix tree, since the agno value used for the lookup is based on m_agirotor. An out-of-range m_agirotor may cause a lookup failure which in case will return NULL. As an example, the value of m_maxagi is decreased during inode64->inode32 remount process, case where I've found this problem. Signed-off-by: Carlos Maiolino --- fs/xfs/xfs_ialloc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c index 5aceb3f..445bf1a 100644 --- a/fs/xfs/xfs_ialloc.c +++ b/fs/xfs/xfs_ialloc.c @@ -431,7 +431,7 @@ xfs_ialloc_next_ag( spin_lock(&mp->m_agirotor_lock); agno = mp->m_agirotor; - if (++mp->m_agirotor == mp->m_maxagi) + if (++mp->m_agirotor >= mp->m_maxagi) mp->m_agirotor = 0; spin_unlock(&mp->m_agirotor_lock); -- 1.7.11.4 From cmaiolino@redhat.com Wed Sep 19 01:10:12 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8J6ACO8158700 for ; Wed, 19 Sep 2012 01:10:12 -0500 X-ASG-Debug-ID: 1348035083-04cbb07ce54b1400001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id v9gi83nsTPdGlGaa for ; Tue, 18 Sep 2012 23:11:24 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8J6BN1W028519 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 19 Sep 2012 02:11:23 -0400 Received: from andromeda.usersys.redhat.com (vpn1-7-14.gru2.redhat.com [10.97.7.14]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q8J6BDjX014802 for ; Wed, 19 Sep 2012 02:11:23 -0400 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: [PATCH 2/6] xfs: make inode64 as the default allocation mode Date: Wed, 19 Sep 2012 03:11:01 -0300 X-ASG-Orig-Subj: [PATCH 2/6] xfs: make inode64 as the default allocation mode Message-Id: <1348035065-6934-3-git-send-email-cmaiolino@redhat.com> In-Reply-To: <1348035065-6934-1-git-send-email-cmaiolino@redhat.com> References: <1348035065-6934-1-git-send-email-cmaiolino@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1348035083 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com since 64-bit inodes can be accessed while using inode32, and these can also be used on 32-bit kernels, there is no reason to still keep inode32 as the default mount option. If the filesystem cannot handle 64bit inode numbers (i.e CONFIG_LBDAF is not enabled and BITS_PER_LONG == 32), XFS_MOUNT_SMALL_INUMS will still be set by default, so inode64 is not an unconditional default value. Signed-off-by: Carlos Maiolino --- fs/xfs/xfs_super.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index f1f2968..7686eee 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -88,6 +88,8 @@ mempool_t *xfs_ioend_pool; * unwritten extent conversion */ #define MNTOPT_NOBARRIER "nobarrier" /* .. disable */ #define MNTOPT_64BITINODE "inode64" /* inodes can be allocated anywhere */ +#define MNTOPT_32BITINODE "inode32" /* inode allocation limited to + * XFS_MAXINUMBER_32 */ #define MNTOPT_IKEEP "ikeep" /* do not free empty inode clusters */ #define MNTOPT_NOIKEEP "noikeep" /* free empty inode clusters */ #define MNTOPT_LARGEIO "largeio" /* report large I/O sizes in stat() */ @@ -198,7 +200,9 @@ xfs_parseargs( */ mp->m_flags |= XFS_MOUNT_BARRIER; mp->m_flags |= XFS_MOUNT_COMPAT_IOSIZE; +#if !XFS_BIG_INUMS mp->m_flags |= XFS_MOUNT_SMALL_INUMS; +#endif /* * These can be overridden by the mount option parsing. @@ -295,6 +299,8 @@ xfs_parseargs( return EINVAL; } dswidth = simple_strtoul(value, &eov, 10); + } else if (!strcmp(this_char, MNTOPT_32BITINODE)) { + mp->m_flags |= XFS_MOUNT_SMALL_INUMS; } else if (!strcmp(this_char, MNTOPT_64BITINODE)) { mp->m_flags &= ~XFS_MOUNT_SMALL_INUMS; #if !XFS_BIG_INUMS @@ -493,6 +499,7 @@ xfs_showargs( { XFS_MOUNT_FILESTREAMS, "," MNTOPT_FILESTREAM }, { XFS_MOUNT_GRPID, "," MNTOPT_GRPID }, { XFS_MOUNT_DISCARD, "," MNTOPT_DISCARD }, + { XFS_MOUNT_SMALL_INUMS, "," MNTOPT_32BITINODE }, { 0, NULL } }; static struct proc_xfs_info xfs_info_unset[] = { -- 1.7.11.4 From cmaiolino@redhat.com Wed Sep 19 01:10:15 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8J6AFPF158714 for ; Wed, 19 Sep 2012 01:10:15 -0500 X-ASG-Debug-ID: 1348035086-04cb6c56853f2c20001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 69lHCXc8HWFPiA3b for ; Tue, 18 Sep 2012 23:11:26 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8J6BQE5020812 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 19 Sep 2012 02:11:26 -0400 Received: from andromeda.usersys.redhat.com (vpn1-7-14.gru2.redhat.com [10.97.7.14]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q8J6BDjY014802 for ; Wed, 19 Sep 2012 02:11:25 -0400 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: [PATCH 3/6] xfs: reduce code duplication handling inode32/64 options Date: Wed, 19 Sep 2012 03:11:02 -0300 X-ASG-Orig-Subj: [PATCH 3/6] xfs: reduce code duplication handling inode32/64 options Message-Id: <1348035065-6934-4-git-send-email-cmaiolino@redhat.com> In-Reply-To: <1348035065-6934-1-git-send-email-cmaiolino@redhat.com> References: <1348035065-6934-1-git-send-email-cmaiolino@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1348035086 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com Add xfs_set_inode32() to be used to enable inode32 allocation mode. this will reduce the amount of duplicated code needed to mount/remount a filesystem with inode32 option. This patch also changes xfs_set_inode64() to return the maximum AG number that inodes can be allocated instead of set mp->m_maxagi by itself, so that the behaviour is the same as xfs_set_inode32(). This simplifies code that calls these functions and needs to know the maximum AG that inodes can be allocated in. Signed-off-by: Carlos Maiolino --- fs/xfs/xfs_mount.c | 43 +++----------------------- fs/xfs/xfs_super.c | 89 +++++++++++++++++++++++++++++++++++++++--------------- fs/xfs/xfs_super.h | 2 ++ 3 files changed, 72 insertions(+), 62 deletions(-) diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 29c2f83..b2bd3a0 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -440,7 +440,7 @@ xfs_initialize_perag( xfs_agnumber_t agcount, xfs_agnumber_t *maxagi) { - xfs_agnumber_t index, max_metadata; + xfs_agnumber_t index; xfs_agnumber_t first_initialised = 0; xfs_perag_t *pag; xfs_agino_t agino; @@ -500,43 +500,10 @@ xfs_initialize_perag( else mp->m_flags &= ~XFS_MOUNT_32BITINODES; - if (mp->m_flags & XFS_MOUNT_32BITINODES) { - /* - * Calculate how much should be reserved for inodes to meet - * the max inode percentage. - */ - if (mp->m_maxicount) { - __uint64_t icount; - - icount = sbp->sb_dblocks * sbp->sb_imax_pct; - do_div(icount, 100); - icount += sbp->sb_agblocks - 1; - do_div(icount, sbp->sb_agblocks); - max_metadata = icount; - } else { - max_metadata = agcount; - } - - for (index = 0; index < agcount; index++) { - ino = XFS_AGINO_TO_INO(mp, index, agino); - if (ino > XFS_MAXINUMBER_32) { - index++; - break; - } - - pag = xfs_perag_get(mp, index); - pag->pagi_inodeok = 1; - if (index < max_metadata) - pag->pagf_metadata = 1; - xfs_perag_put(pag); - } - } else { - for (index = 0; index < agcount; index++) { - pag = xfs_perag_get(mp, index); - pag->pagi_inodeok = 1; - xfs_perag_put(pag); - } - } + if (mp->m_flags & XFS_MOUNT_32BITINODES) + index = xfs_set_inode32(mp); + else + index = xfs_set_inode64(mp); if (maxagi) *maxagi = index; diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 7686eee..0c2e06f 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -599,6 +599,71 @@ xfs_max_file_offset( return (((__uint64_t)pagefactor) << bitshift) - 1; } +xfs_agnumber_t +xfs_set_inode32(struct xfs_mount *mp) +{ + xfs_agnumber_t index = 0; + xfs_sb_t *sbp = &mp->m_sb; + xfs_agnumber_t max_metadata; + xfs_agino_t agino = XFS_OFFBNO_TO_AGINO(mp, sbp->sb_agblocks -1, 0); + xfs_ino_t ino = XFS_AGINO_TO_INO(mp, sbp->sb_agcount -1, agino); + xfs_perag_t *pag; + + /* Calculate how much should be reserved for inodes to meet + * the max inode percentage. + */ + if (mp->m_maxicount) { + __uint64_t icount; + + icount = sbp->sb_dblocks * sbp->sb_imax_pct; + do_div(icount, 100); + icount += sbp->sb_agblocks - 1; + do_div(icount, sbp->sb_agblocks); + max_metadata = icount; + } else { + max_metadata = sbp->sb_agcount; + } + + for (index = 0; index < sbp->sb_agcount; index++) { + ino = XFS_AGINO_TO_INO(mp, index, agino); + if (ino > XFS_MAXINUMBER_32) { + index++; + break; + } + + pag = xfs_perag_get(mp, index); + pag->pagi_inodeok = 1; + if (index < max_metadata) + pag->pagf_metadata = 1; + xfs_perag_put(pag); + } + return index; +} + +xfs_agnumber_t +xfs_set_inode64(struct xfs_mount *mp) +{ + xfs_agnumber_t index = 0; + + for (index = 0; index < mp->m_sb.sb_agcount; index++) { + struct xfs_perag *pag; + + pag = xfs_perag_get(mp, index); + pag->pagi_inodeok = 1; + pag->pagf_metadata = 0; + xfs_perag_put(pag); + } + + /* There is no need for lock protection on m_flags, + * the rw_semaphore of the VFS superblock is locked + * during mount/umount/remount operations, so this is + * enough to avoid concurency on the m_flags field + */ + mp->m_flags &= ~(XFS_MOUNT_32BITINODES | + XFS_MOUNT_SMALL_INUMS); + return index; +} + STATIC int xfs_blkdev_get( xfs_mount_t *mp, @@ -1038,30 +1103,6 @@ xfs_restore_resvblks(struct xfs_mount *mp) xfs_reserve_blocks(mp, &resblks, NULL); } -STATIC void -xfs_set_inode64(struct xfs_mount *mp) -{ - int i = 0; - - for (i = 0; i < mp->m_sb.sb_agcount; i++) { - struct xfs_perag *pag; - - pag = xfs_perag_get(mp, i); - pag->pagi_inodeok = 1; - pag->pagf_metadata = 0; - xfs_perag_put(pag); - } - - /* There is no need for lock protection on m_flags, - * the rw_semaphore of the VFS superblock is locked - * during mount/umount/remount operations, so this is - * enough to avoid concurency on the m_flags field - */ - mp->m_flags &= ~(XFS_MOUNT_32BITINODES | - XFS_MOUNT_SMALL_INUMS); - mp->m_maxagi = i; -} - STATIC int xfs_fs_remount( struct super_block *sb, diff --git a/fs/xfs/xfs_super.h b/fs/xfs/xfs_super.h index 09b0c26..9de4a92 100644 --- a/fs/xfs/xfs_super.h +++ b/fs/xfs/xfs_super.h @@ -75,6 +75,8 @@ struct block_device; extern __uint64_t xfs_max_file_offset(unsigned int); extern void xfs_blkdev_issue_flush(struct xfs_buftarg *); +extern xfs_agnumber_t xfs_set_inode32(struct xfs_mount *); +extern xfs_agnumber_t xfs_set_inode64(struct xfs_mount *); extern const struct export_operations xfs_export_operations; extern const struct xattr_handler *xfs_xattr_handlers[]; -- 1.7.11.4 From cmaiolino@redhat.com Wed Sep 19 01:10:20 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8J6AKoZ158729 for ; Wed, 19 Sep 2012 01:10:20 -0500 X-ASG-Debug-ID: 1348035091-04bdf0067e3d4380001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id VGcPML11SYrbrmDM for ; Tue, 18 Sep 2012 23:11:31 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8J6BVKW009412 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 19 Sep 2012 02:11:31 -0400 Received: from andromeda.usersys.redhat.com (vpn1-7-14.gru2.redhat.com [10.97.7.14]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q8J6BDjZ014802 for ; Wed, 19 Sep 2012 02:11:30 -0400 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: [PATCH 4/6] xfs: Fix mp->m_maxagi update during inode64 remount Date: Wed, 19 Sep 2012 03:11:03 -0300 X-ASG-Orig-Subj: [PATCH 4/6] xfs: Fix mp->m_maxagi update during inode64 remount Message-Id: <1348035065-6934-5-git-send-email-cmaiolino@redhat.com> In-Reply-To: <1348035065-6934-1-git-send-email-cmaiolino@redhat.com> References: <1348035065-6934-1-git-send-email-cmaiolino@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1348035091 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com With the changes made on xfs_set_inode64(), to make it behave as xfs_set_inode32() (now leaving to the caller the responsibility to update mp->m_maxagi), we use the return value of xfs_set_inode64() to update mp->m_maxagi during remount. Signed-off-by: Carlos Maiolino --- fs/xfs/xfs_super.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 0c2e06f..966f56c 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -1129,7 +1129,7 @@ xfs_fs_remount( mp->m_flags &= ~XFS_MOUNT_BARRIER; break; case Opt_inode64: - xfs_set_inode64(mp); + mp->m_maxagi = xfs_set_inode64(mp); break; default: /* -- 1.7.11.4 From cmaiolino@redhat.com Wed Sep 19 01:10:25 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8J6APxr158744 for ; Wed, 19 Sep 2012 01:10:25 -0500 X-ASG-Debug-ID: 1348035096-04cbb07ce54b1450001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id cMVz9iLH7qrOPFdX for ; Tue, 18 Sep 2012 23:11:37 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8J6BadK028537 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 19 Sep 2012 02:11:36 -0400 Received: from andromeda.usersys.redhat.com (vpn1-7-14.gru2.redhat.com [10.97.7.14]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q8J6BDja014802 for ; Wed, 19 Sep 2012 02:11:36 -0400 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: [PATCH 5/6] xfs: add inode64->inode32 transition into xfs_set_inode32() Date: Wed, 19 Sep 2012 03:11:04 -0300 X-ASG-Orig-Subj: [PATCH 5/6] xfs: add inode64->inode32 transition into xfs_set_inode32() Message-Id: <1348035065-6934-6-git-send-email-cmaiolino@redhat.com> In-Reply-To: <1348035065-6934-1-git-send-email-cmaiolino@redhat.com> References: <1348035065-6934-1-git-send-email-cmaiolino@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1348035096 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com To make inode32 a remountable option, xfs_set_inode32() should be able to make a transition from inode64 option, disabling inode allocation on higher AGs. Signed-off-by: Carlos Maiolino --- fs/xfs/xfs_super.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 966f56c..40984912 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -603,6 +603,7 @@ xfs_agnumber_t xfs_set_inode32(struct xfs_mount *mp) { xfs_agnumber_t index = 0; + xfs_agnumber_t maxagi = 0; xfs_sb_t *sbp = &mp->m_sb; xfs_agnumber_t max_metadata; xfs_agino_t agino = XFS_OFFBNO_TO_AGINO(mp, sbp->sb_agblocks -1, 0); @@ -626,18 +627,26 @@ xfs_set_inode32(struct xfs_mount *mp) for (index = 0; index < sbp->sb_agcount; index++) { ino = XFS_AGINO_TO_INO(mp, index, agino); + if (ino > XFS_MAXINUMBER_32) { - index++; - break; + pag = xfs_perag_get(mp, index); + pag->pagi_inodeok = 0; + pag->pagf_metadata = 1; + xfs_perag_put(pag); + continue; } pag = xfs_perag_get(mp, index); pag->pagi_inodeok = 1; + maxagi++; if (index < max_metadata) pag->pagf_metadata = 1; xfs_perag_put(pag); } - return index; + mp->m_flags |= (XFS_MOUNT_32BITINODES | + XFS_MOUNT_SMALL_INUMS); + + return maxagi; } xfs_agnumber_t -- 1.7.11.4 From cmaiolino@redhat.com Wed Sep 19 01:10:27 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8J6ARr4158756 for ; Wed, 19 Sep 2012 01:10:27 -0500 X-ASG-Debug-ID: 1348035098-04cb6c56853f2c70001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Pyt7g5GSvgQlK6gU for ; Tue, 18 Sep 2012 23:11:39 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8J6BcHN020832 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 19 Sep 2012 02:11:38 -0400 Received: from andromeda.usersys.redhat.com (vpn1-7-14.gru2.redhat.com [10.97.7.14]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q8J6BDjb014802 for ; Wed, 19 Sep 2012 02:11:37 -0400 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: [PATCH 6/6] xfs: Make inode32 a remountable option Date: Wed, 19 Sep 2012 03:11:05 -0300 X-ASG-Orig-Subj: [PATCH 6/6] xfs: Make inode32 a remountable option Message-Id: <1348035065-6934-7-git-send-email-cmaiolino@redhat.com> In-Reply-To: <1348035065-6934-1-git-send-email-cmaiolino@redhat.com> References: <1348035065-6934-1-git-send-email-cmaiolino@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1348035098 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com As inode64 is the default option now, and was also made remountable previously, inode32 can also be remounted on-the-fly when it is needed. Signed-off-by: Carlos Maiolino --- fs/xfs/xfs_super.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 40984912..324bb9b 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -122,13 +122,18 @@ mempool_t *xfs_ioend_pool; * in the future, too. */ enum { - Opt_barrier, Opt_nobarrier, Opt_inode64, Opt_err + Opt_barrier, + Opt_nobarrier, + Opt_inode64, + Opt_inode32, + Opt_err }; static const match_table_t tokens = { {Opt_barrier, "barrier"}, {Opt_nobarrier, "nobarrier"}, {Opt_inode64, "inode64"}, + {Opt_inode32, "inode32"}, {Opt_err, NULL} }; @@ -1140,6 +1145,9 @@ xfs_fs_remount( case Opt_inode64: mp->m_maxagi = xfs_set_inode64(mp); break; + case Opt_inode32: + mp->m_maxagi = xfs_set_inode32(mp); + break; default: /* * Logically we would return an error here to prevent -- 1.7.11.4 From tinguely@sgi.com Wed Sep 19 08:13:36 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8JDDaT4202705 for ; Wed, 19 Sep 2012 08:13:36 -0500 Received: from [128.162.232.125] (eagdhcp-232-125.americas.sgi.com [128.162.232.125]) by relay2.corp.sgi.com (Postfix) with ESMTP id ED4963040B2; Wed, 19 Sep 2012 06:14:45 -0700 (PDT) Message-ID: <5059C541.7090202@sgi.com> Date: Wed, 19 Sep 2012 08:14:41 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [RFC, PATCH 0/102]: xfs: 3.0.x stable kernel update References: <1345698180-13612-1-git-send-email-david@fromorbit.com> <50587E28.7090704@sgi.com> <20120918235049.GB31501@dastard> In-Reply-To: <20120918235049.GB31501@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/18/12 18:50, Dave Chinner wrote: > On Tue, Sep 18, 2012 at 08:59:04AM -0500, Mark Tinguely wrote: >> This looks great. Like I said earlier, I did not find Brian Foster's >> log patch: >> xfs: check for stale inode before acquiring iflock on push >> Upstream commit: 9a3a5dab63461b84213052888bf38a962b22d035 >> sample implementation listed on: >> http://oss.sgi.com/archives/xfs/2012-09/msg00188.html >> >> Reviewed-by: Mark Tinguely > > Thatnks for looking over this, Mark. > > The above patch does not directly apply to the 3.0.x branch because > the rework of the log item lock/push logic in the AIL was not > included in the series. Hence I'm not sure that backportingthis > patch is necessary because the problem only arose after we change > the locking/push logic... > > Cheers, > > Dave. Hi Dave. The original problem was in Linux 2.6.X. The patch in the above link is a 3.0.42 port of Brian's top of tree patch. This version places the tests in AIL trylock routine. We have been using it on Linux 3.0.x for a couple months and it has avoided the hangs that we used to get before. Thank-you again for the work. --Mark T. From tinguely@sgi.com Wed Sep 19 08:35:35 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8JDZZVc204527 for ; Wed, 19 Sep 2012 08:35:35 -0500 Received: from [128.162.232.125] (eagdhcp-232-125.americas.sgi.com [128.162.232.125]) by relay2.corp.sgi.com (Postfix) with ESMTP id B794830409A; Wed, 19 Sep 2012 06:36:47 -0700 (PDT) Message-ID: <5059CA6B.8090609@sgi.com> Date: Wed, 19 Sep 2012 08:36:43 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: jeff.liu@oracle.com CC: xfs@oss.sgi.com Subject: Re: [PATCH] xfstests: fix a compile warning at seek_sanity_test.c References: <4FCA2422.90804@oracle.com> In-Reply-To: <4FCA2422.90804@oracle.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 06/02/12 09:33, Jeff Liu wrote: > Hello, > > Compiler report warning at seek_sanity_test.c: > seek_sanity_test.c:46:3: warning: format '%lx' expects type 'long unsigned int', but argument 3 has type 'int' > > Below patch can fix it. > > Signed-off-by: Jie Liu Sorry, looks like this clean-up patch has not been committed yet. Looks good. Reviewed-by: Mark Tinguely From eflorac@intellique.com Wed Sep 19 08:56:40 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_53 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8JDueaF206466 for ; Wed, 19 Sep 2012 08:56:40 -0500 X-ASG-Debug-ID: 1348063069-04cbb07ce44c5520001-NocioJ Received: from smtp4-g21.free.fr (smtp4-g21.free.fr [212.27.42.4]) by cuda.sgi.com with ESMTP id YObAX89fccgdTHf2 for ; Wed, 19 Sep 2012 06:57:50 -0700 (PDT) X-Barracuda-Envelope-From: eflorac@intellique.com X-Barracuda-Apparent-Source-IP: 212.27.42.4 Received: from harpe.intellique.com (unknown [82.225.196.72]) by smtp4-g21.free.fr (Postfix) with ESMTP id 488014C8070 for ; Wed, 19 Sep 2012 15:57:46 +0200 (CEST) Date: Wed, 19 Sep 2012 15:57:48 +0200 From: Emmanuel Florac To: xfs@oss.sgi.com Subject: XFS corruption with rsync Message-ID: <20120919155748.620e9230@harpe.intellique.com> X-ASG-Orig-Subj: XFS corruption with rsync Organization: Intellique X-Mailer: Claws Mail 3.7.9 (GTK+ 2.24.4; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Barracuda-Connect: smtp4-g21.free.fr[212.27.42.4] X-Barracuda-Start-Time: 1348063069 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108986 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- I'"ve seen this error showing up on the list previously: while rsync'ing a large volume (66 TB copied to a 114 TB filesystem), I've got this error showing up: Pid: 2069, comm: rsync Not tainted 3.2.28-storiq64-opteron #1 Call Trace: [] ? xfs_alloc_fixup_trees+0x22f/0x370 [] ? xfs_btree_get_rec+0x53/0x90 [] ? xfs_alloc_ag_vextent_near+0x83e/0xbe0 [] ? xfs_alloc_fix_freelist+0x3cb/0x460 [] ? xfs_alloc_ag_vextent+0xc5/0xf0 [] ? xfs_alloc_vextent+0x3aa/0x5f0 [] ? xfs_trans_read_buf+0x22a/0x420 [] ? xfs_ialloc_ag_alloc+0x3c7/0x4d0 [] ? xfs_dialloc+0xcb/0x870 [] ? up+0xd/0x40 [] ? xfs_ialloc+0x75/0x760 [] ? kmem_zone_alloc+0x66/0xe0 [] ? xfs_dir_ialloc+0x93/0x330 [] ? xfs_trans_reserve+0x9d/0x210 [] ? xfs_create+0x455/0x670 [] ? xfs_vn_mknod+0xa6/0x1b0 [] ? vfs_create+0x89/0xc0 [] ? do_last+0x550/0x750 [] ? path_openat+0xdb/0x3d0 [] ? do_sync_write+0xc7/0x100 [] ? handle_mm_fault+0x226/0x270 [] ? do_filp_open+0x4d/0xc0 [] ? alloc_fd+0x43/0x130 [] ? do_sys_open+0x105/0x1e0 [] ? system_call_fastpath+0x16/0x1b Rsync logs says that "structure needs cleaning". After running xfs_repair, there's a few files making reference to a free block. This machine has had serious filesystem failure previously, but the RAID array and filesystem have been rebuild from the ground up, so it should be OK; however I'd like to be really sure there's no hidden hardware glitch waiting to bite us again... -- ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From jeff.liu@oracle.com Wed Sep 19 09:04:23 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8JE4NE8207110 for ; Wed, 19 Sep 2012 09:04:23 -0500 X-ASG-Debug-ID: 1348063534-04cb6c5685429300001-NocioJ Received: from rcsinet15.oracle.com (rcsinet15.oracle.com [148.87.113.117]) by cuda.sgi.com with ESMTP id Dv5E8ZlT1m0iVOlq (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO); Wed, 19 Sep 2012 07:05:34 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 148.87.113.117 X-Barracuda-IPDD: Level2 [oracle.com/148.87.113.117] X-Barracuda-IPDD: Level2 [oracle.com/148.87.113.117] Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238]) by rcsinet15.oracle.com (Sentrion-MTA-4.2.2/Sentrion-MTA-4.2.2) with ESMTP id q8JE5WXf032589 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 19 Sep 2012 14:05:34 GMT X-Barracuda-IPDD: Level2 [oracle.com/148.87.113.117] X-Barracuda-IPDD: Level2 [oracle.com/148.87.113.117] X-Barracuda-IPDD: Level2 [oracle.com/148.87.113.117] X-Barracuda-IPDD: Level2 [oracle.com/148.87.113.117] X-Barracuda-IPDD: Level2 [oracle.com/148.87.113.117] X-Barracuda-IPDD: Level2 [oracle.com/148.87.113.117] X-Barracuda-IPDD: Level2 [oracle.com/148.87.113.117] X-Barracuda-IPDD: Level2 [oracle.com/148.87.113.117] Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156]) by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id q8JE5VR0014332 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Wed, 19 Sep 2012 14:05:32 GMT Received: from abhmt116.oracle.com (abhmt116.oracle.com [141.146.116.68]) by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id q8JE5V1N012955; Wed, 19 Sep 2012 09:05:31 -0500 Received: from [10.191.3.180] (/10.191.3.180) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 19 Sep 2012 07:05:31 -0700 Message-ID: <5059D0D5.9050205@oracle.com> Date: Wed, 19 Sep 2012 22:04:05 +0800 From: Jeff Liu Reply-To: jeff.liu@oracle.com Organization: Oracle User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.28) Gecko/20120313 Thunderbird/3.1.20 MIME-Version: 1.0 To: Mark Tinguely CC: xfs@oss.sgi.com Subject: Re: [PATCH] xfstests: fix a compile warning at seek_sanity_test.c References: <4FCA2422.90804@oracle.com> <5059CA6B.8090609@sgi.com> X-ASG-Orig-Subj: Re: [PATCH] xfstests: fix a compile warning at seek_sanity_test.c In-Reply-To: <5059CA6B.8090609@sgi.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Source-IP: acsinet22.oracle.com [141.146.126.238] X-Barracuda-Connect: rcsinet15.oracle.com[148.87.113.117] X-Barracuda-Start-Time: 1348063534 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com On 09/19/2012 09:36 PM, Mark Tinguely wrote: > On 06/02/12 09:33, Jeff Liu wrote: >> Hello, >> >> Compiler report warning at seek_sanity_test.c: >> seek_sanity_test.c:46:3: warning: format '%lx' expects type 'long >> unsigned int', but argument 3 has type 'int' >> >> Below patch can fix it. >> >> Signed-off-by: Jie Liu > > Sorry, looks like this clean-up patch has not been committed yet. > > Looks good. > > Reviewed-by: Mark Tinguely Could you please also consider another patch for 286 improvements at: http://patchwork.xfs.org/patch/3731 Thanks, -Jeff > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From tinguely@sgi.com Wed Sep 19 09:10:25 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8JEAPZF207637 for ; Wed, 19 Sep 2012 09:10:25 -0500 Received: from [128.162.232.125] (eagdhcp-232-125.americas.sgi.com [128.162.232.125]) by relay1.corp.sgi.com (Postfix) with ESMTP id C02218F8081; Wed, 19 Sep 2012 07:11:34 -0700 (PDT) Message-ID: <5059D292.1080500@sgi.com> Date: Wed, 19 Sep 2012 09:11:30 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: jeff.liu@oracle.com CC: xfs@oss.sgi.com Subject: Re: [PATCH] xfstests: fix a compile warning at seek_sanity_test.c References: <4FCA2422.90804@oracle.com> <5059CA6B.8090609@sgi.com> <5059D0D5.9050205@oracle.com> In-Reply-To: <5059D0D5.9050205@oracle.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/19/12 09:04, Jeff Liu wrote: > On 09/19/2012 09:36 PM, Mark Tinguely wrote: > >> On 06/02/12 09:33, Jeff Liu wrote: >>> Hello, >>> >>> Compiler report warning at seek_sanity_test.c: >>> seek_sanity_test.c:46:3: warning: format '%lx' expects type 'long >>> unsigned int', but argument 3 has type 'int' >>> >>> Below patch can fix it. >>> >>> Signed-off-by: Jie Liu >> >> Sorry, looks like this clean-up patch has not been committed yet. >> >> Looks good. >> >> Reviewed-by: Mark Tinguely > > > Could you please also consider another patch for 286 improvements at: > http://patchwork.xfs.org/patch/3731 > > Thanks, > -Jeff > Yes, I will make sure it gets committed; it has been already reviewed. Did I remember correctly that there is plans for another test for the latest kernel features? --Mark. From mail@blafoo.org Wed Sep 19 09:10:58 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8JEAwZT207737 for ; Wed, 19 Sep 2012 09:10:58 -0500 X-ASG-Debug-ID: 1348063928-04bdf0067d3ee1e0001-NocioJ Received: from vwp1161.webpack.hosteurope.de (vwp1161.webpack.hosteurope.de [87.230.104.173]) by cuda.sgi.com with ESMTP id HQrtSq2GnhONi1V8 for ; Wed, 19 Sep 2012 07:12:08 -0700 (PDT) X-Barracuda-Envelope-From: mail@blafoo.org X-Barracuda-Apparent-Source-IP: 87.230.104.173 Received: from [2a01:488:d00d::2003:39] (helo=vs.bk.hosteurope.de); authenticated by vwp1161.webpack.hosteurope.de running ExIM with esmtpsa (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) id 1TEL0Y-0001ZE-1b; Wed, 19 Sep 2012 16:12:06 +0200 Message-ID: <5059D2B4.8010300@blafoo.org> Date: Wed, 19 Sep 2012 16:12:04 +0200 From: blafoo User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:15.0) Gecko/20120907 Thunderbird/15.0.1 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: OOM on quotacheck (again?) Content-Type: text/plain; charset=ISO-8859-1 X-ASG-Orig-Subj: OOM on quotacheck (again?) Content-Transfer-Encoding: 7bit X-bounce-key: webpack.hosteurope.de;mail@blafoo.org;1348063928;b7d0dfaa; X-Barracuda-Connect: vwp1161.webpack.hosteurope.de[87.230.104.173] X-Barracuda-Start-Time: 1348063928 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.108986 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi all, for the last couple of days i've been trying to compile a new kernel for our webserver-platform which is based on debian-squeeze. Hardware: a mix of Dell PE2850, 2950, R710 - raid-10 with 4 disks (old setup, PE2850) - raid-1 system, raid-10 content (current setup) - currently running linux-2.6.37 custom built, vmalloc set to default (128MB) All systems have an xfs-filesystem as their content-partition and have group-quota enabled (no other xfs-settings active). the content-partition varies in size between 250GB and 1TB and contains between 3 and 10 million files. Every time i try to mount the xfs-file-system and a quota-check is needed, the server goes out of memory (oom). I can easily reproduce this by rebooting the server, resetting the quota-flags with xfs_db -x -c 'sb 0' -c 'write qflags 0' and rerun the quota-check. This is true for various kernels but not all. What i've tried so far: 2.6.37.x - fails with OOM 2.6.39.4 - suprisingly works (see below why) 3.2.29 - fails with OOM 3.4.10 - fails with OOM 3.6.0rc5 - fails with vmalloc error (XFS (sda7): xfs_buf_get_map: failed to map pages), with vmalloc=256 the systems hangs on mount infitly. Some more infos from my test-system are available here: http://pastebin.com/2DkDyH4R I found a couple of references regarding this problem but no final solution so far. Please correct the following if i misunderstood anything: 1. There was an OOM problem with quota-checks which was fixed in 2.6.39.4 which is mentioned here: a) http://permalink.gmane.org/gmane.comp.file-systems.xfs.general/43565 and fixed here: b) http://patchwork.xfs.org/patch/3337/ That is why 2.6.39.4 works for me. 2. That fix was later replaced (not extended) with a nicer patch which is mentioned/published here: c) http://oss.sgi.com/archives/xfs/2011-03/msg00240.html I checked all kernel-versions above for the patch mentioned in 2. and can confirm its presence in each kernel-tree. Still our servers fail to check quota successfully. Am i missing something here? PS: As a side-note: we've been running xfs for years without any problems. But after we activated the gquota-feature, we've been having problems in a couple of places. One is the OOM on quota-check, another is xfs-errors on high-io volumes with gquota enabled. But since the high-io-problem problem might be connected to the OOM-problem, we'll try to fix the latter first :-) best regards Volker From jeff.liu@oracle.com Wed Sep 19 09:17:09 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8JEH9pD208309 for ; Wed, 19 Sep 2012 09:17:09 -0500 X-ASG-Debug-ID: 1348064300-04bdf06cd02f6780001-NocioJ Received: from rcsinet15.oracle.com (rcsinet15.oracle.com [148.87.113.117]) by cuda.sgi.com with ESMTP id fAzvP4OfRCmKtdcL (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO); Wed, 19 Sep 2012 07:18:20 -0700 (PDT) X-Barracuda-Envelope-From: jeff.liu@oracle.com X-Barracuda-Apparent-Source-IP: 148.87.113.117 X-Barracuda-IPDD: Level2 [oracle.com/148.87.113.117] X-Barracuda-IPDD: Level2 [oracle.com/148.87.113.117] Received: from ucsinet22.oracle.com (ucsinet22.oracle.com [156.151.31.94]) by rcsinet15.oracle.com (Sentrion-MTA-4.2.2/Sentrion-MTA-4.2.2) with ESMTP id q8JEIJrj020279 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 19 Sep 2012 14:18:19 GMT X-Barracuda-IPDD: Level2 [oracle.com/148.87.113.117] X-Barracuda-IPDD: Level2 [oracle.com/148.87.113.117] X-Barracuda-IPDD: Level2 [oracle.com/148.87.113.117] X-Barracuda-IPDD: Level2 [oracle.com/148.87.113.117] X-Barracuda-IPDD: Level2 [oracle.com/148.87.113.117] X-Barracuda-IPDD: Level2 [oracle.com/148.87.113.117] X-Barracuda-IPDD: Level2 [oracle.com/148.87.113.117] X-Barracuda-IPDD: Level2 [oracle.com/148.87.113.117] Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156]) by ucsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id q8JEIIUJ000307 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Wed, 19 Sep 2012 14:18:18 GMT Received: from abhmt109.oracle.com (abhmt109.oracle.com [141.146.116.61]) by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id q8JEII5U023971; Wed, 19 Sep 2012 09:18:18 -0500 Received: from [10.191.3.180] (/10.191.3.180) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 19 Sep 2012 07:18:17 -0700 Message-ID: <5059D3DE.9020006@oracle.com> Date: Wed, 19 Sep 2012 22:17:02 +0800 From: Jeff Liu Reply-To: jeff.liu@oracle.com Organization: Oracle User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.28) Gecko/20120313 Thunderbird/3.1.20 MIME-Version: 1.0 To: Mark Tinguely CC: xfs@oss.sgi.com Subject: Re: [PATCH] xfstests: fix a compile warning at seek_sanity_test.c References: <4FCA2422.90804@oracle.com> <5059CA6B.8090609@sgi.com> <5059D0D5.9050205@oracle.com> <5059D292.1080500@sgi.com> X-ASG-Orig-Subj: Re: [PATCH] xfstests: fix a compile warning at seek_sanity_test.c In-Reply-To: <5059D292.1080500@sgi.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Source-IP: ucsinet22.oracle.com [156.151.31.94] X-Barracuda-Connect: rcsinet15.oracle.com[148.87.113.117] X-Barracuda-Start-Time: 1348064300 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com On 09/19/2012 10:11 PM, Mark Tinguely wrote: > On 09/19/12 09:04, Jeff Liu wrote: >> On 09/19/2012 09:36 PM, Mark Tinguely wrote: >> >>> On 06/02/12 09:33, Jeff Liu wrote: >>>> Hello, >>>> >>>> Compiler report warning at seek_sanity_test.c: >>>> seek_sanity_test.c:46:3: warning: format '%lx' expects type 'long >>>> unsigned int', but argument 3 has type 'int' >>>> >>>> Below patch can fix it. >>>> >>>> Signed-off-by: Jie Liu >>> >>> Sorry, looks like this clean-up patch has not been committed yet. >>> >>> Looks good. >>> >>> Reviewed-by: Mark Tinguely >> >> >> Could you please also consider another patch for 286 improvements at: >> http://patchwork.xfs.org/patch/3731 >> >> Thanks, >> -Jeff >> > > Yes, I will make sure it gets committed; it has been already reviewed. > > Did I remember correctly that there is plans for another test for the > latest kernel features? Yes, we have discussed that before, however, I thought it was your idea so I have not work it out. :) I'll write if you have no time to do it. -Jeff > > --Mark. > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bpm@sgi.com Wed Sep 19 10:14:04 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8JFE4gZ213234 for ; Wed, 19 Sep 2012 10:14:04 -0500 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay3.corp.sgi.com (Postfix) with ESMTP id 198BAAC00E; Wed, 19 Sep 2012 08:15:12 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 6F01E426BF4; Wed, 19 Sep 2012 10:15:12 -0500 (CDT) Date: Wed, 19 Sep 2012 10:15:12 -0500 From: Ben Myers To: Chris Friesen , Dave Chinner Cc: Alex Elder , xfs@oss.sgi.com Subject: Re: given a pointer to xfs_inode_t, how to determine path? Message-ID: <20120919151512.GY3274@sgi.com> References: <50574709.9000301@genband.com> <20120917162120.GG25175@sgi.com> <20120917224957.GI13691@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20120917224957.GI13691@dastard> User-Agent: Mutt/1.5.20 (2009-06-14) Hey, On Tue, Sep 18, 2012 at 08:49:57AM +1000, Dave Chinner wrote: > On Mon, Sep 17, 2012 at 11:21:20AM -0500, Ben Myers wrote: > > Hi Chris, > > > > On Mon, Sep 17, 2012 at 09:51:37AM -0600, Chris Friesen wrote: > > > We're running 2.6.27 (upgrading not currently possible, embedded product). > > > > > > We had a situation arise where we could see in stack traces that a > > > number of tasks were stuck in vn_iowait(). That function takes a > > > pointer to xfs_inode_t. Given that, would it be possible to work > > > backwards to determine a filesystem path corresponding to that > > > inode? I realize it would likely only go back to the head of the > > > filesystem, but that would be fine. > > > > Yep, it's possible. > > > > echo t > /proc/sysrq-trigger won't give you the full stack, but you may be able > > to get an idea of what is going on, well enough to make some guesses as to the > > culprit. That's probably your best first step. > > Doesn't give you the path of the inode, or anything that can tell > you what the inode number is so you could run "find -inum > " after the system has recovered. > > > If you have crash installed: > > > > 1) disassemble vn_iowait and find out which register the xfs_inode_t pointer is in. > > 2) print out the full stacks of all the processes in the system. 'bt -f', I think. > > 'bt -F ' tells you what entries on the stack are of a > particular symbol. i.e. they'll show up as [xfs_inode] instead of a > number for all addresses from inside the xfs inode slab cache. > comapring the output of 'bt -F' and 'bt -f' will get you the inode > address without needing to be able to read x86-64 assembly > language... > > > 3) grep for the xfs_inode_t pointer on those stacks. > > Which doesn't get you the path, either. From there, follow to the > struct inode, and from there to the struct dentry and grab the file > name, then walk the d_parent dentry links back up to the root and > construct the path that way. > > Alternatively, I think you can walk from the top down by looking > that the open files that a given process has and working down to the > xfs_inode, but it's been a long time since I've had to come from > that direction. Indeed, you might even be able to use lsof to do > this and get an idea from userspace what files are currently > open on the hung processes. Yep, I misunderstood the question. I didn't mean to mislead you Chris! Really! ;) -Ben From bpm@sgi.com Wed Sep 19 10:48:58 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8JFmwMU215859 for ; Wed, 19 Sep 2012 10:48:58 -0500 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay2.corp.sgi.com (Postfix) with ESMTP id 92C7930409A; Wed, 19 Sep 2012 08:50:07 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 43ABE426BF4; Wed, 19 Sep 2012 10:50:07 -0500 (CDT) Date: Wed, 19 Sep 2012 10:50:07 -0500 From: Ben Myers To: Stefan Ring Cc: Linux fs XFS , Nathan Scott Subject: Re: [PATCH] German translation for xfsdump Message-ID: <20120919155007.GZ3274@sgi.com> References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.20 (2009-06-14) On Tue, Aug 28, 2012 at 11:10:21AM +0200, Stefan Ring wrote: > On Sat, Aug 4, 2012 at 1:50 AM, Nathan Scott wrote: > > Please send a follow-up patch, thanks! The initial German translation and this followup patch have been committed to git://oss.sgi.com/xfs/cmds/xfsdump.git, master branch. From tinguely@sgi.com Wed Sep 19 11:33:55 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.3 required=5.0 tests=BAYES_00,J_CHICKENPOX_43, J_CHICKENPOX_44,J_CHICKENPOX_45,J_CHICKENPOX_46,J_CHICKENPOX_47, J_CHICKENPOX_48 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8JGXtrj220171 for ; Wed, 19 Sep 2012 11:33:55 -0500 Received: from gulag1.americas.sgi.com (gulag1.americas.sgi.com [128.162.236.41]) by relay1.corp.sgi.com (Postfix) with ESMTP id 660D88F80CB for ; Wed, 19 Sep 2012 09:35:04 -0700 (PDT) Received: by gulag1.americas.sgi.com (Postfix, from userid 48133) id 584F4B02F150; Wed, 19 Sep 2012 11:35:04 -0500 (CDT) Message-Id: <20120919163145.587098223@sgi.com> User-Agent: quilt/0.51-1 Date: Wed, 19 Sep 2012 11:31:36 -0500 From: tinguely@sgi.com To: xfs@oss.sgi.com Subject: [PATCH 3/3] xfs: zero allocation_args on the kernel stack References: <20120919163133.097340199@sgi.com> Content-Disposition: inline; filename=3-3-xfs-zero_allocation_args.patch The allocation argument structures is created on the kernel stack space. This patch makes sure the userdata variable is always initialized. The better solution is always memset to 0 or "= { 0 }" the xfs_alloc_arg and xfs_bmalloca structures. I believe there will only be 4 places that need this memset change. Signed-off-by: Mark Tinguely --- fs/xfs/xfs_bmap.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) Index: b/fs/xfs/xfs_bmap.c =================================================================== --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -3096,7 +3096,7 @@ xfs_bmap_extents_to_btree( } args.minlen = args.maxlen = args.prod = 1; args.total = args.minleft = args.alignment = args.mod = args.isfl = - args.minalignslop = 0; + args.minalignslop = args.userdata = 0; args.wasdel = wasdel; *logflagsp = 0; if ((error = xfs_alloc_vextent(&args))) { @@ -3254,7 +3254,7 @@ xfs_bmap_local_to_extents( } args.total = total; args.mod = args.minleft = args.alignment = args.wasdel = - args.isfl = args.minalignslop = 0; + args.isfl = args.minalignslop = args.userdata = 0; args.minlen = args.maxlen = args.prod = 1; if ((error = xfs_alloc_vextent(&args))) goto done; From tinguely@sgi.com Wed Sep 19 11:33:55 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8JGXt09220172 for ; Wed, 19 Sep 2012 11:33:55 -0500 Received: from gulag1.americas.sgi.com (gulag1.americas.sgi.com [128.162.236.41]) by relay2.corp.sgi.com (Postfix) with ESMTP id 5DF33304082 for ; Wed, 19 Sep 2012 09:35:04 -0700 (PDT) Received: by gulag1.americas.sgi.com (Postfix, from userid 48133) id 3D6158563187; Wed, 19 Sep 2012 11:35:04 -0500 (CDT) Message-Id: <20120919163133.097340199@sgi.com> User-Agent: quilt/0.51-1 Date: Wed, 19 Sep 2012 11:31:33 -0500 From: tinguely@sgi.com To: xfs@oss.sgi.com Subject: [PATCH 0/3] xfs: allocation worker causes freelist buffer lock hang We have experience file system hangs on the IA64, X86_32 and X86_64 environments caused by a deadlock on AGF buffers. The below stack frames is a simple example of the deadlock. This example was taken from the current OSS Linux 3.6 sources on a x86_32 machine that was suffering from a daemon storm at the time: The holder of the lock: PID: 11601 TASK: d29dadb0 CPU: 3 COMMAND: "kworker/3:3" #0 [c8ea57bc] __schedule at c068a7e8 #1 [c8ea5844] schedule at c068abd9 #2 [c8ea584c] schedule_timeout at c0689808 #3 [c8ea58b0] wait_for_common at c068a436 #4 [c8ea58e8] wait_for_completion at c068a54d #5 [c8ea58f0] xfs_alloc_vextent at e1ed8f63 [xfs] #6 [c8ea590c] xfs_bmap_btalloc at e1ee4124 [xfs] #7 [c8ea59dc] xfs_bmap_alloc at e1ee42f5 [xfs] #8 [c8ea59e4] xfs_bmapi_allocate at e1ef0ae9 [xfs] #9 [c8ea5a14] xfs_bmapi_write at e1ef13a7 [xfs] #10 [c8ea5b18] xfs_iomap_write_allocate at e1ec7e93 [xfs] #11 [c8ea5bac] xfs_map_blocks at e1eb795d [xfs] #12 [c8ea5c08] xfs_vm_writepage at e1eb88d9 [xfs] #13 [c8ea5c64] find_get_pages_tag at c02df2a2 #14 [c8ea5c9c] __writepage at c02e6769 #15 [c8ea5ca8] write_cache_pages at c02e6f8c #16 [c8ea5d48] generic_writepages at c02e7212 #17 [c8ea5d78] xfs_vm_writepages at e1eb6c5a [xfs] #18 [c8ea5d8c] do_writepages at c02e7f4a #19 [c8ea5d98] __filemap_fdatawrite_range at c02e046a #20 [c8ea5dc4] filemap_fdatawrite_range at c02e0fb1 #21 [c8ea5de0] xfs_flush_pages at e1ec32e9 [xfs] #22 [c8ea5e0c] xfs_sync_inode_data at e1ecdd73 [xfs] #23 [c8ea5e34] xfs_inode_ag_walk at e1ece0d6 [xfs] #24 [c8ea5f00] xfs_inode_ag_iterator at e1ece23f [xfs] #25 [c8ea5f28] xfs_sync_data at e1ece2ce [xfs] #26 [c8ea5f38] xfs_flush_worker at e1ece31d [xfs] #27 [c8ea5f44] process_one_work at c024e39d #28 [c8ea5f88] process_scheduled_works at c024e6ad #29 [c8ea5f98] worker_thread at c024f6cb #30 [c8ea5fbc] kthread at c0253c1b #31 [c8ea5fe8] kernel_thread_helper at c0692af4 The worker that is blocked waiting for the lock: PID: 30223 TASK: dfb86cb0 CPU: 3 COMMAND: "xfsalloc" #0 [d4a45b9c] __schedule at c068a7e8 #1 [d4a45c24] schedule at c068abd9 #2 [d4a45c2c] schedule_timeout at c0689808 #3 [d4a45c90] __down_common at c068a1d4 #4 [d4a45cc0] __down at c068a25e #5 [d4a45cc8] down at c02598ff #6 [d4a45cd8] xfs_buf_lock at e1ebaa6d [xfs] #7 [d4a45cf8] _xfs_buf_find at e1ebad0e [xfs] #8 [d4a45d2c] xfs_buf_get_map at e1ebaf00 [xfs] #9 [d4a45d58] xfs_buf_read_map at e1ebbce3 [xfs] #10 [d4a45d7c] xfs_trans_read_buf_map at e1f2974e [xfs] #11 [d4a45dac] xfs_read_agf at e1ed7d2c [xfs] #12 [d4a45dec] xfs_alloc_read_agf at e1ed7f2d [xfs] #13 [d4a45e0c] xfs_alloc_fix_freelist at e1ed84f6 [xfs] #14 [d4a45e4c] check_preempt_curr at c0261c47 #15 [d4a45e60] ttwu_do_wakeup at c0261c7e #16 [d4a45e8c] radix_tree_lookup at c0465ab5 #17 [d4a45e94] xfs_perag_get at e1f19a36 [xfs] #18 [d4a45ec8] __xfs_alloc_vextent at e1ed899d [xfs] #19 [d4a45f1c] xfs_alloc_vextent_worker at e1ed8edb [xfs] #20 [d4a45f30] process_one_work at c024e39d #21 [d4a45f74] process_scheduled_works at c024e6ad #22 [d4a45f84] rescuer_thread at c024e7f0 #23 [d4a45fbc] kthread at c0253c1b #24 [d4a45fe8] kernel_thread_helper at c0692af The AGF buffer can be locked across multiple calls to xfs_alloc_vextent(). This buffer must remained locked until the transaction is either committed or canceled. The deadlock occurs when other callers of xfs_alloc_vextent() block waiting for the AGF buffer lock and the workqueue manager cannot create another allocate worker to service the allocation request for the process that holds the lock, The default limit for the allocation worker is 256 workers and that limit can be increased to 512, but lack of resources before this limit is the real reason the workqueue manager cannot create another worker. It is very easy to have a more than one AG hung in this manner simultaneously. The locked AGF buffer and possibly the calling inode can be in the AIL. Since they are locked, these items cannot be pushed. This prevents the tail from moving; eventually the log space is depleted causing the whole filesystem to hang. Tests 109 and 119 seem to trigger this condition the easiest. To recreate the problem, eat up the spare RAM (above hang was caused during a daemon storm) or simply limit the number of allocation workers when running xfstests. The solution to this problem is to move the allocation worker so that the loops over xfs_alloc_vextent() for a single transaction, on non-metadata paths will happen in a single worker. I traced the callers of xfs_alloc_vextent(), noting transaction creation, commits and cancels; I noted loops in the callers and which were marked as metadata/userdata. I can send this document to reviewers. Patch 1: limits the allocation worker to the X86_64 architectures. Patch 2: moves the allocation worker so that loops to xfs_alloc_vextent() for a transaction is contained in one worker. I have a document that lists the callers of xfs_alloc_vextent() noting loops, transaction allocations/commits and metadata callers. Patch 3: zeros 2 uninitialized userdata variables. --Mark. From tinguely@sgi.com Wed Sep 19 11:33:55 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.4 required=5.0 tests=BAYES_00,J_CHICKENPOX_210, J_CHICKENPOX_22,J_CHICKENPOX_23,J_CHICKENPOX_24,J_CHICKENPOX_25 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8JGXtLA220174 for ; Wed, 19 Sep 2012 11:33:55 -0500 Received: from gulag1.americas.sgi.com (gulag1.americas.sgi.com [128.162.236.41]) by relay2.corp.sgi.com (Postfix) with ESMTP id 6E1013040CA for ; Wed, 19 Sep 2012 09:35:04 -0700 (PDT) Received: by gulag1.americas.sgi.com (Postfix, from userid 48133) id 522FAB02F14F; Wed, 19 Sep 2012 11:35:04 -0500 (CDT) Message-Id: <20120919163145.485656298@sgi.com> User-Agent: quilt/0.51-1 Date: Wed, 19 Sep 2012 11:31:35 -0500 From: tinguely@sgi.com To: xfs@oss.sgi.com Subject: [PATCH 2/3] xfs: move allocate worker References: <20120919163133.097340199@sgi.com> Content-Disposition: inline; filename=2-3-xfs-move_allocate_worker.patch Move the allocation worker call so that any loops on xfs_alloc_vextent() calls for a particular transaction are contained within a single worker. This prevents a filesystem hang that can occur because the holder of AGF buffer lock cannot allocate a worker. Signed-off-by: Mark Tinguely --- fs/xfs/xfs_alloc.c | 53 ------------------------------------------- fs/xfs/xfs_alloc.h | 3 -- fs/xfs/xfs_bmap.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++- fs/xfs/xfs_bmap.h | 16 +++++++++++++ 4 files changed, 80 insertions(+), 56 deletions(-) Index: b/fs/xfs/xfs_alloc.c =================================================================== --- a/fs/xfs/xfs_alloc.c +++ b/fs/xfs/xfs_alloc.c @@ -2207,7 +2207,7 @@ xfs_alloc_read_agf( * group or loop over the allocation groups to find the result. */ int /* error */ -__xfs_alloc_vextent( +xfs_alloc_vextent( xfs_alloc_arg_t *args) /* allocation argument structure */ { xfs_agblock_t agsize; /* allocation group size */ @@ -2417,57 +2417,6 @@ error0: return error; } -#if defined(CONFIG_X86_64) -static void -xfs_alloc_vextent_worker( - struct work_struct *work) -{ - struct xfs_alloc_arg *args = container_of(work, - struct xfs_alloc_arg, work); - unsigned long pflags; - - /* we are in a transaction context here */ - current_set_flags_nested(&pflags, PF_FSTRANS); - - args->result = __xfs_alloc_vextent(args); - complete(args->done); - - current_restore_flags_nested(&pflags, PF_FSTRANS); -} -#endif - -/* - * Data allocation requests often come in with little stack to work on. Push - * them off to a worker thread so there is lots of stack to use. Metadata - * requests, OTOH, are generally from low stack usage paths, so avoid the - * context switch overhead here. - */ -int -xfs_alloc_vextent( - struct xfs_alloc_arg *args) -{ -#if defined(CONFIG_X86_64) - DECLARE_COMPLETION_ONSTACK(done); - - if (!args->userdata) - return __xfs_alloc_vextent(args); - - - args->done = &done; - INIT_WORK_ONSTACK(&args->work, xfs_alloc_vextent_worker); - queue_work(xfs_alloc_wq, &args->work); - wait_for_completion(&done); - return args->result; -#else - /* The allocation worker is needed by the i386_64. - * Do not use the worker for other platforms. This will - * allow those platforms avoid the performance hit and - * the potential AGF buffer deadlock issue. - */ - return __xfs_alloc_vextent(args); -#endif -} - /* * Free an extent. * Just break up the extent address and hand off to xfs_free_ag_extent Index: b/fs/xfs/xfs_alloc.h =================================================================== --- a/fs/xfs/xfs_alloc.h +++ b/fs/xfs/xfs_alloc.h @@ -120,9 +120,6 @@ typedef struct xfs_alloc_arg { char isfl; /* set if is freelist blocks - !acctg */ char userdata; /* set if this is user data */ xfs_fsblock_t firstblock; /* io first block allocated */ - struct completion *done; - struct work_struct work; - int result; } xfs_alloc_arg_t; /* Index: b/fs/xfs/xfs_bmap.c =================================================================== --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -48,7 +48,6 @@ #include "xfs_vnodeops.h" #include "xfs_trace.h" - kmem_zone_t *xfs_bmap_free_item_zone; /* @@ -4807,7 +4806,11 @@ xfs_bmapi_convert_unwritten( * blocks then the call will fail (return NULLFSBLOCK in "firstblock"). */ int +#if defined(CONFIG_X86_64) +__xfs_bmapi_write( +#else xfs_bmapi_write( +#endif struct xfs_trans *tp, /* transaction pointer */ struct xfs_inode *ip, /* incore inode */ xfs_fileoff_t bno, /* starting file offs. mapped */ @@ -5031,6 +5034,65 @@ error0: return error; } +#if defined(CONFIG_X86_64) +static void +xfs_bmapi_write_worker( + struct work_struct *work) +{ + struct xfs_bmw_wkr *bw = container_of(work, + struct xfs_bmw_wkr, work); + unsigned long pflags; + + /* we are in a transaction context here */ + current_set_flags_nested(&pflags, PF_FSTRANS); + + bw->result = __xfs_bmapi_write(bw->tp, bw->ip, bw->bno, bw->len, + bw->flags, bw->firstblock, bw->total, + bw->mval, bw->nmap, bw->flist); + complete(bw->done); + + current_restore_flags_nested(&pflags, PF_FSTRANS); +} + +int +xfs_bmapi_write( + struct xfs_trans *tp, /* transaction pointer */ + struct xfs_inode *ip, /* incore inode */ + xfs_fileoff_t bno, /* starting file offs. mapped */ + xfs_filblks_t len, /* length to map in file */ + int flags, /* XFS_BMAPI_... */ + xfs_fsblock_t *firstblock, /* first allocated block + controls a.g. for allocs */ + xfs_extlen_t total, /* total blocks needed */ + struct xfs_bmbt_irec *mval, /* output: map values */ + int *nmap, /* i/o: mval size/count */ + struct xfs_bmap_free *flist) /* i/o: list extents to free */ +{ + struct xfs_bmw_wkr bw; + DECLARE_COMPLETION_ONSTACK(done); + + if (flags & XFS_BMAPI_METADATA) + return __xfs_bmapi_write(tp, ip, bno, len, flags, firstblock, + total, mval, nmap, flist); + /* initialize the worker argument list structure */ + bw.tp = tp; + bw.ip = ip; + bw.bno = bno; + bw.len = len; + bw.flags = flags; + bw.firstblock = firstblock; + bw.total = total; + bw.mval = mval; + bw.nmap = nmap; + bw.flist = flist; + bw.done = &done; + INIT_WORK_ONSTACK(&bw.work, xfs_bmapi_write_worker); + queue_work(xfs_alloc_wq, &bw.work); + wait_for_completion(&done); + return bw.result; +} +#endif + /* * Unmap (remove) blocks from a file. * If nexts is nonzero then the number of extents to remove is limited to Index: b/fs/xfs/xfs_bmap.h =================================================================== --- a/fs/xfs/xfs_bmap.h +++ b/fs/xfs/xfs_bmap.h @@ -135,6 +135,22 @@ typedef struct xfs_bmalloca { char conv; /* overwriting unwritten extents */ } xfs_bmalloca_t; +struct xfs_bmw_wkr { + struct xfs_trans *tp; /* transaction pointer */ + struct xfs_inode *ip; /* incore inode */ + xfs_fileoff_t bno; /* starting file offs. mapped */ + xfs_filblks_t len; /* length to map in file */ + int flags; /* XFS_BMAPI_... */ + xfs_fsblock_t *firstblock; /* first allocblock controls */ + xfs_extlen_t total; /* total blocks needed */ + struct xfs_bmbt_irec *mval; /* output: map values */ + int *nmap; /* i/o: mval size/count */ + struct xfs_bmap_free *flist; /* bmap freelist */ + struct completion *done; /* worker completion ptr */ + struct work_struct work; /* worker */ + int result; /* worker function result */ +} ; + /* * Flags for xfs_bmap_add_extent*. */ From tinguely@sgi.com Wed Sep 19 11:33:56 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8JGXtws220192 for ; Wed, 19 Sep 2012 11:33:55 -0500 Received: from gulag1.americas.sgi.com (gulag1.americas.sgi.com [128.162.236.41]) by relay3.corp.sgi.com (Postfix) with ESMTP id 99B69AC00D for ; Wed, 19 Sep 2012 09:35:04 -0700 (PDT) Received: by gulag1.americas.sgi.com (Postfix, from userid 48133) id 47FD4B02F13C; Wed, 19 Sep 2012 11:35:04 -0500 (CDT) Message-Id: <20120919163145.367256258@sgi.com> User-Agent: quilt/0.51-1 Date: Wed, 19 Sep 2012 11:31:34 -0500 From: tinguely@sgi.com To: xfs@oss.sgi.com Subject: [PATCH 1/3] xfs: restrict allocate worker to x86_64 References: <20120919163133.097340199@sgi.com> Content-Disposition: inline; filename=1-3-xfs-restrict_allocate_worker.patch Restrict the allocation worker to X86_64 machines. This will improve performance on non-X86-64 machines and avoid the AGF buffer hang. Signed-off-by: Mark Tinguely --- fs/xfs/xfs_alloc.c | 11 +++++++++++ 1 file changed, 11 insertions(+) Index: b/fs/xfs/xfs_alloc.c =================================================================== --- a/fs/xfs/xfs_alloc.c +++ b/fs/xfs/xfs_alloc.c @@ -2417,6 +2417,7 @@ error0: return error; } +#if defined(CONFIG_X86_64) static void xfs_alloc_vextent_worker( struct work_struct *work) @@ -2433,6 +2434,7 @@ xfs_alloc_vextent_worker( current_restore_flags_nested(&pflags, PF_FSTRANS); } +#endif /* * Data allocation requests often come in with little stack to work on. Push @@ -2444,6 +2446,7 @@ int xfs_alloc_vextent( struct xfs_alloc_arg *args) { +#if defined(CONFIG_X86_64) DECLARE_COMPLETION_ONSTACK(done); if (!args->userdata) @@ -2455,6 +2458,14 @@ xfs_alloc_vextent( queue_work(xfs_alloc_wq, &args->work); wait_for_completion(&done); return args->result; +#else + /* The allocation worker is needed by the i386_64. + * Do not use the worker for other platforms. This will + * allow those platforms avoid the performance hit and + * the potential AGF buffer deadlock issue. + */ + return __xfs_alloc_vextent(args); +#endif } /* From sandeen@sandeen.net Wed Sep 19 12:38:42 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_53 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8JHcgNs224420 for ; Wed, 19 Sep 2012 12:38:42 -0500 X-ASG-Debug-ID: 1348076393-04bdf0067e3fa5c0001-NocioJ Received: from mail.sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id f2PIL6dEUXNI9Ug1 for ; Wed, 19 Sep 2012 10:39:53 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) (Authenticated sender: sandeen) by mail.sandeen.net (Postfix) with ESMTP id 41F284964602; Wed, 19 Sep 2012 12:39:53 -0500 (CDT) Message-ID: <505A0369.3020708@sandeen.net> Date: Wed, 19 Sep 2012 12:39:53 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20120907 Thunderbird/15.0.1 MIME-Version: 1.0 To: Emmanuel Florac CC: xfs@oss.sgi.com Subject: Re: XFS corruption with rsync References: <20120919155748.620e9230@harpe.intellique.com> X-ASG-Orig-Subj: Re: XFS corruption with rsync In-Reply-To: <20120919155748.620e9230@harpe.intellique.com> X-Enigmail-Version: 1.4.4 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1348076393 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109000 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 9/19/12 8:57 AM, Emmanuel Florac wrote: > > I'"ve seen this error showing up on the list previously: while > rsync'ing a large volume (66 TB copied to a 114 TB filesystem), I've got > this error showing up: I think you trimmed some relevant lines before these, what actual error did it hit, there's probably a file & line number? > Pid: 2069, comm: rsync Not tainted 3.2.28-storiq64-opteron #1 > Call Trace: > [] ? xfs_alloc_fixup_trees+0x22f/0x370 > [] ? xfs_btree_get_rec+0x53/0x90 > [] ? xfs_alloc_ag_vextent_near+0x83e/0xbe0 > [] ? xfs_alloc_fix_freelist+0x3cb/0x460 > [] ? xfs_alloc_ag_vextent+0xc5/0xf0 > [] ? xfs_alloc_vextent+0x3aa/0x5f0 > [] ? xfs_trans_read_buf+0x22a/0x420 > [] ? xfs_ialloc_ag_alloc+0x3c7/0x4d0 > [] ? xfs_dialloc+0xcb/0x870 > [] ? up+0xd/0x40 > [] ? xfs_ialloc+0x75/0x760 > [] ? kmem_zone_alloc+0x66/0xe0 > [] ? xfs_dir_ialloc+0x93/0x330 > [] ? xfs_trans_reserve+0x9d/0x210 > [] ? xfs_create+0x455/0x670 > [] ? xfs_vn_mknod+0xa6/0x1b0 > [] ? vfs_create+0x89/0xc0 > [] ? do_last+0x550/0x750 > [] ? path_openat+0xdb/0x3d0 > [] ? do_sync_write+0xc7/0x100 > [] ? handle_mm_fault+0x226/0x270 > [] ? do_filp_open+0x4d/0xc0 > [] ? alloc_fd+0x43/0x130 > [] ? do_sys_open+0x105/0x1e0 > [] ? system_call_fastpath+0x16/0x1b > > > Rsync logs says that "structure needs cleaning". After running > xfs_repair, there's a few files making reference to a free block. Including the xfs_repair output would be helpful too. > This machine has had serious filesystem failure previously, but the > RAID array and filesystem have been rebuild from the ground up, so it > should be OK; however I'd like to be really sure there's no hidden > hardware glitch waiting to bite us again... -Eric From stockhausen@collogia.de Wed Sep 19 13:35:04 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.8 required=5.0 tests=BAYES_50 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8JIZ4x2229968 for ; Wed, 19 Sep 2012 13:35:04 -0500 X-ASG-Debug-ID: 1348079774-04cb6c5685449250001-NocioJ Received: from mailrelay.collogia.de (mailrelay.collogia.de [62.40.12.196]) by cuda.sgi.com with SMTP id 93bdr9l3nSyEN1ci for ; Wed, 19 Sep 2012 11:36:14 -0700 (PDT) X-Barracuda-Envelope-From: stockhausen@collogia.de X-Barracuda-Apparent-Source-IP: 62.40.12.196 Received: from EXCHANGE.collogia.de (192.168.10.9) by edge.collogia.de (62.40.12.197) with Microsoft SMTP Server (TLS) id 14.2.283.3; Wed, 19 Sep 2012 20:36:13 +0200 Received: from EXCHANGE.collogia.de ([192.168.10.9]) by EXCHANGE.collogia.de ([192.168.10.9]) with mapi id 14.02.0283.003; Wed, 19 Sep 2012 20:36:13 +0200 From: Markus Stockhausen To: "xfs@oss.sgi.com" Subject: Writeback Stalls Thread-Topic: Writeback Stalls X-ASG-Orig-Subj: Writeback Stalls Thread-Index: Ac2Wj1HT6pr2HR9YR5m1/8HFWskN8g== Date: Wed, 19 Sep 2012 18:36:11 +0000 Message-ID: <12EF8D94C6F8734FB2FF37B9FBEDD1735831B7A3@EXCHANGE.collogia.de> Accept-Language: de-DE, en-US Content-Language: de-DE X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [62.40.12.200] Content-Type: multipart/mixed; boundary="----=_NextPartTM-000-1b29904f-a9d6-4f79-a1d7-476e12f9fcdc" MIME-Version: 1.0 X-TM-AS-Product-Ver: ISVW-7.00.0.1353-6.8.0.1017-19194001 X-TM-AS-Result: No X-TM-AS-Category-Info: 31:0,000000 X-TM-AS-MatchedID: 147015-706891-703747-700826-702150-121124-710467-702638-7 09850-704983-702898-701735-700398-708712-700970-703399-705901-705450-701005 -701019-701464-703731-702113-701450-105040-702626-106390-704645-710718-7048 59-709584-106640-700274-160005-148035-148050-23116-29102-30060-42003 X-Barracuda-Connect: mailrelay.collogia.de[62.40.12.196] X-Barracuda-Start-Time: 1348079774 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.02 X-Barracuda-Spam-Status: No, SCORE=0.02 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109003 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... This is a multi-part message in MIME format. ------=_NextPartTM-000-1b29904f-a9d6-4f79-a1d7-476e12f9fcdc Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Hello,=0A= =0A= I'm not sure if you can help me with the following problem but I must start= somewhere.=0A= =0A= We have an small sized VMWare infrastructure. 8 hosts with round about 50 V= Ms. =0A= Their images are hosted on 2 Ubuntu 12.04 NFS storage servers with each of = them=0A= having a 14 disk RAID 6 array. On top of the array runs a single XFS filesy= stem with =0A= round about 10TB of disk space.=0A= =0A= >From time to time we see stalls in the infrastructure. The machines become = unresponsive=0A= and hang for a few seconds. The controller was the first item to be under s= uspect. =0A= But after a lot examination we created a very artifical setup that shows th= e real reasons=0A= for the stalls: Writeback handling. The parameters are:=0A= =0A= - set NFS to async=0A= - disable controller and disk writeback cache=0A= - enable cgroup=0A= - set dirty_background_bytes to some very high value (4GB)=0A= - set dirty_bytes to some very high value (4GB)=0A= - set dirty_expire_centisecs to to some very high value (60 secs)=0A= - set blkio.throttle.write_bps_device to a very low value (2MB/sek)=0A= =0A= Now generate some write load on a Windows VM. During the test we observe wh= at=0A= is happening on the storage and the VM. The result is:=0A= =0A= - dirty pages are increasing=0A= - writeback is constantly 0=0A= - VM is working well=0A= =0A= At some point writeback is kicking in and all of a sudden the VM stalls. Du= ring=0A= this time the setup shows=0A= =0A= - most of the dirty pages are transfered to writeback pages=0A= - writeback is done at the above set limit (2MB/sek)=0A= - VM is not responding =0A= =0A= After writeback has finished everything goes back to normal. Additional rem= ark:=0A= VMs DO NOT hang if I create heavy writes on the XFS into non-VM related fil= es.=0A= =0A= We are interested in this kind of setup for several reasons:=0A= =0A= 1. Keep VMs reponsive=0A= =0A= 2. Allow VMs to generate short spikes of write I/Os at a higher rate than t= he =0A= disk subsystem is capable of. =0A= =0A= 3. Write this data back to the disk in the background over a longer period= =0A= of time. Ensure that a limited writeback rate keeps enough headroom so that= =0A= read I/Os are not delayed too much.=0A= =0A= Can you explain me if there is some blocking going on in XFS in the time=0A= between start and end of writeback? If yes what can I do to achieve my=0A= goals and stop the writeback stalls. =0A= =0A= For you help I thank you in advance.=0A= =0A= Markus=0A= =0A= =0A= =0A= =0A= =0A= =0A= =0A= =0A= =0A= =0A= ------=_NextPartTM-000-1b29904f-a9d6-4f79-a1d7-476e12f9fcdc Content-Type: text/plain; name="InterScan_Disclaimer.txt" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="InterScan_Disclaimer.txt" **************************************************************************** Diese E-Mail enthält vertrauliche und/oder rechtlich geschützte Informationen. Wenn Sie nicht der richtige Adressat sind oder diese E-Mail irrtümlich erhalten haben, informieren Sie bitte sofort den Absender und vernichten Sie diese Mail. Das unerlaubte Kopieren sowie die unbefugte Weitergabe dieser Mail ist nicht gestattet. Über das Internet versandte E-Mails können unter fremden Namen erstellt oder manipuliert werden. Deshalb ist diese als E-Mail verschickte Nachricht keine rechtsverbindliche Willenserklärung. Collogia Unternehmensberatung AG Ubierring 11 D-50678 Köln Vorstand: Kadir Akin Dr. Michael Höhnerbach Vorsitzender des Aufsichtsrates: Hans Kristian Langva Registergericht: Amtsgericht Köln Registernummer: HRB 52 497 This e-mail may contain confidential and/or privileged information. If you are not the intended recipient (or have received this e-mail in error) please notify the sender immediately and destroy this e-mail. Any unauthorized copying, disclosure or distribution of the material in this e-mail is strictly forbidden. e-mails sent over the internet may have been written under a wrong name or been manipulated. That is why this message sent as an e-mail is not a legally binding declaration of intention. Collogia Unternehmensberatung AG Ubierring 11 D-50678 Köln executive board: Kadir Akin Dr. Michael Höhnerbach President of the supervisory board: Hans Kristian Langva Registry office: district court Cologne Register number: HRB 52 497 **************************************************************************** ------=_NextPartTM-000-1b29904f-a9d6-4f79-a1d7-476e12f9fcdc-- From eflorac@intellique.com Wed Sep 19 14:57:28 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_45, J_CHICKENPOX_53 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8JJvSYc239504 for ; Wed, 19 Sep 2012 14:57:28 -0500 X-ASG-Debug-ID: 1348084717-04cbb07ce34eff00001-NocioJ Received: from smtp3-g21.free.fr (smtp3-g21.free.fr [212.27.42.3]) by cuda.sgi.com with ESMTP id UVkhove1TlEEyfHq for ; Wed, 19 Sep 2012 12:58:38 -0700 (PDT) X-Barracuda-Envelope-From: eflorac@intellique.com X-Barracuda-Apparent-Source-IP: 212.27.42.3 Received: from galadriel.home (unknown [82.235.234.79]) by smtp3-g21.free.fr (Postfix) with ESMTP id D3ACEA61E6; Wed, 19 Sep 2012 21:58:33 +0200 (CEST) Date: Wed, 19 Sep 2012 21:58:20 +0200 From: Emmanuel Florac To: Eric Sandeen Cc: xfs@oss.sgi.com Subject: Re: XFS corruption with rsync Message-ID: <20120919215820.44e83ac4@galadriel.home> X-ASG-Orig-Subj: Re: XFS corruption with rsync In-Reply-To: <505A0369.3020708@sandeen.net> References: <20120919155748.620e9230@harpe.intellique.com> <505A0369.3020708@sandeen.net> Organization: Intellique X-Mailer: Claws Mail 3.7.8 (GTK+ 2.24.4; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp3-g21.free.fr[212.27.42.3] X-Barracuda-Start-Time: 1348084718 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109010 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Le Wed, 19 Sep 2012 12:39:53 -0500 vous =C3=A9criviez: > On 9/19/12 8:57 AM, Emmanuel Florac wrote: > >=20 > > I'"ve seen this error showing up on the list previously: while > > rsync'ing a large volume (66 TB copied to a 114 TB filesystem), > > I've got this error showing up: >=20 > I think you trimmed some relevant lines before these, what actual > error did it hit, there's probably a file & line number? Nothing else in dmesg but this error repeated many times. I'll check through the /var/log/messages if there is more information. > > Rsync logs says that "structure needs cleaning". After running > > xfs_repair, there's a few files making reference to a free block.=20 >=20 > Including the xfs_repair output would be helpful too. Unfortunately I forgot that all of xfs_repair output is to STDERR, so I lost it... It said a lot of lines like "data fork in inode XXX claims free block YYY". However no data was dropped to lost+found, and apparently all is OK. --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From david@fromorbit.com Wed Sep 19 15:58:16 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8JKwGGv249553 for ; Wed, 19 Sep 2012 15:58:16 -0500 X-ASG-Debug-ID: 1348088366-04cbb07ce54fa800001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id Yr8plY5d8Vh84pOK for ; Wed, 19 Sep 2012 13:59:27 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AnMRAK8wWlB5LC9S/2dsb2JhbABFhSG2HwEBAX+BCYIgAQEEATocIwULCAMYLhQlAyETh30FumEUiwgUCGlPbIMhYAOVY5AigniBSAE Received: from ppp121-44-47-82.lns20.syd6.internode.on.net (HELO dastard) ([121.44.47.82]) by ipmail06.adl6.internode.on.net with ESMTP; 20 Sep 2012 06:29:25 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TERMi-0002WO-5Z; Thu, 20 Sep 2012 06:59:24 +1000 Date: Thu, 20 Sep 2012 06:59:24 +1000 From: Dave Chinner To: blafoo Cc: xfs@oss.sgi.com Subject: Re: OOM on quotacheck (again?) Message-ID: <20120919205924.GC31501@dastard> X-ASG-Orig-Subj: Re: OOM on quotacheck (again?) References: <5059D2B4.8010300@blafoo.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5059D2B4.8010300@blafoo.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1348088366 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109014 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Sep 19, 2012 at 04:12:04PM +0200, blafoo wrote: > Hi all, > > for the last couple of days i've been trying to compile a new kernel for > our webserver-platform which is based on debian-squeeze. > > Hardware: a mix of Dell PE2850, 2950, R710 > - raid-10 with 4 disks (old setup, PE2850) > - raid-1 system, raid-10 content (current setup) > - currently running linux-2.6.37 custom built, vmalloc set to default > (128MB) Which implies you are running a 32 bit kernel even on 64 bit CPUs (e.g. R710). > > All systems have an xfs-filesystem as their content-partition and have > group-quota enabled (no other xfs-settings active). the > content-partition varies in size between 250GB and 1TB and contains > between 3 and 10 million files. > > Every time i try to mount the xfs-file-system and a quota-check is > needed, the server goes out of memory (oom). I can easily reproduce this > by rebooting the server, resetting the quota-flags with No surprise if you are running an i686 kernel (32 bit). You've got way more inodes than can fit in the kernel memory segment. > xfs_db -x -c 'sb 0' -c 'write qflags 0' > > and rerun the quota-check. > > This is true for various kernels but not all. What i've tried so far: > > 2.6.37.x - fails with OOM > 2.6.39.4 - suprisingly works (see below why) > 3.2.29 - fails with OOM > 3.4.10 - fails with OOM 8a00ebe xfs: Ensure inode reclaim can run during quotacheck $ git describe --contains 8a00ebe v3.5-rc1~91^2~54 So the OOM problem was fixed in 3.5. > 3.6.0rc5 - fails with vmalloc error (XFS (sda7): xfs_buf_get_map: failed > to map pages), with vmalloc=256 the systems hangs on mount infitly. Running on a x86-64 kernel will make the vmalloc problem go away. There's very little we can do about the limited vmalloc address space on i686 kernels. As it is, the known recent regression in this space: bcf62ab xfs: Fix overallocation in xfs_buf_allocate_memory() $ git describe --contains bcf62ab v3.6-rc1~42^2~35 was fixed in 3.6-rc1, so I'm not really that sure why you'd be running out of vmalloc space as there shouldn't be any metadata that is vmalloc'd in your given filesystem configuration... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Sep 19 16:33:28 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8JLXSbS252397 for ; Wed, 19 Sep 2012 16:33:28 -0500 X-ASG-Debug-ID: 1348090479-04cbb07ce25012c0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id bnVuFuyzuouPQHy5 for ; Wed, 19 Sep 2012 14:34:39 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AnQRAIQ5WlB5LC9S/2dsb2JhbABFhSG2IAEBAYEAgQmCIAEBBAE6HCMFCwgDGC4UJQMNARMKCYd9BbpBFIsIFAELZU9sgyFgA5VjkCKCeIFIAQ Received: from ppp121-44-47-82.lns20.syd6.internode.on.net (HELO dastard) ([121.44.47.82]) by ipmail06.adl6.internode.on.net with ESMTP; 20 Sep 2012 07:04:39 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TERue-0002al-1E; Thu, 20 Sep 2012 07:34:28 +1000 Date: Thu, 20 Sep 2012 07:34:28 +1000 From: Dave Chinner To: Markus Stockhausen Cc: "xfs@oss.sgi.com" Subject: Re: Writeback Stalls Message-ID: <20120919213427.GD31501@dastard> X-ASG-Orig-Subj: Re: Writeback Stalls References: <12EF8D94C6F8734FB2FF37B9FBEDD1735831B7A3@EXCHANGE.collogia.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <12EF8D94C6F8734FB2FF37B9FBEDD1735831B7A3@EXCHANGE.collogia.de> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1348090479 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109016 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Sep 19, 2012 at 06:36:11PM +0000, Markus Stockhausen wrote: > Hello, > > I'm not sure if you can help me with the following problem but I must start somewhere. > > We have an small sized VMWare infrastructure. 8 hosts with round about 50 VMs. > Their images are hosted on 2 Ubuntu 12.04 NFS storage servers with each of them > having a 14 disk RAID 6 array. On top of the array runs a single XFS filesystem with > round about 10TB of disk space. > > From time to time we see stalls in the infrastructure. The machines become unresponsive > and hang for a few seconds. The controller was the first item to be under suspect. > But after a lot examination we created a very artifical setup that shows the real reasons > for the stalls: Writeback handling. The parameters are: > So: > - set NFS to async Disable the NFS server-client writeback throttling control loop (i.e. commits block until data is synced to disk). Also, data loss on NFS server crash. > - disable controller and disk writeback cache IO is exceedingly slow. > - enable cgroup > - set dirty_background_bytes to some very high value (4GB) > - set dirty_bytes to some very high value (4GB) > - set dirty_expire_centisecs to to some very high value (60 secs) Allow lots of dirty data in memory before writeback starts > - set blkio.throttle.write_bps_device to a very low value (2MB/sek) And throttle writeback to 2MB/s. Gun. Foot. Point. Shoot. > Now generate some write load on a Windows VM. During the test we observe what > is happening on the storage and the VM. The result is: > > - dirty pages are increasing > - writeback is constantly 0 > - VM is working well The VM is not "working well" with this configuration - it's building up a large cache of dirty pages that you've limited to draining at a very slow rate. IOWs, on an NFS server, having a writeback value of 0 is exactly the problem, and disabling the client-server throttling feedback loop only makes it worse. You want writeback on the server to start early, not delay it until you run out of memory. > At some point writeback is kicking in and all of a sudden the VM stalls. During > this time the setup shows > > - most of the dirty pages are transfered to writeback pages > - writeback is done at the above set limit (2MB/sek) > - VM is not responding Because you ran out of clean pages and it takes forever to write 4GB of dirty data @ 2MB/s. > After writeback has finished everything goes back to normal. Additional remark: > VMs DO NOT hang if I create heavy writes on the XFS into non-VM related files. Probably because they are not in the throttled cgroup that the NFS daemons are in. > We are interested in this kind of setup for several reasons: > > 1. Keep VMs reponsive > > 2. Allow VMs to generate short spikes of write I/Os at a higher rate than the > disk subsystem is capable of. > > 3. Write this data back to the disk in the background over a longer period > of time. Ensure that a limited writeback rate keeps enough headroom so that > read I/Os are not delayed too much. Fundamentally, you are doing it all wrong. High throughput, low latency NFS servers write dirty data to disk fast, not leave it memory until you run out of clean memory because that causes everything to block waiting for writeback IO completion to be ale to free memory... This really isn't an XFS problem. Cheers, Dave. -- Dave Chinner david@fromorbit.com From bpm@sgi.com Wed Sep 19 16:34:33 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8JLYXW5252512 for ; Wed, 19 Sep 2012 16:34:33 -0500 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay3.corp.sgi.com (Postfix) with ESMTP id 75826AC010; Wed, 19 Sep 2012 14:35:42 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 0E11F426BF4; Wed, 19 Sep 2012 16:35:42 -0500 (CDT) To: torvalds@linux-foundation.org Subject: [GIT PULL] XFS update for 3.6-rc7 Cc: akpm@linux-foundation.org, linux-kernel@vger.kernel.org, xfs@oss.sgi.com Message-Id: <20120919213542.0E11F426BF4@whiskey.americas.sgi.com> Date: Wed, 19 Sep 2012 16:35:42 -0500 (CDT) From: bpm@sgi.com (Ben Myers) Hi Linus, Please pull these 2 bugfixes for XFS. There is a fix for crashes on unmount and a fix for a race when discarding xfs_bufs. Thanks, Ben The following changes since commit a672e1be30d5bc848cd0067c55ed29b2015b7c17: xfs: check for possible overflow in xfs_ioc_trim (2012-08-23 14:48:44 -0500) are available in the git repository at: git://oss.sgi.com/xfs/xfs tags/for-linus-v3.6-rc7 for you to fetch changes up to 0ba6e5368c302819da7aff537e0d7eff2616c6a6: xfs: stop the sync worker before xfs_unmountfs (2012-09-18 16:51:26 -0500) ---------------------------------------------------------------- xfs: bugfixes for 3.6-rc7 - fix a regression related to xfs_sync_worker racing with unmount. - fix a race while discarding xfs buffers. ---------------------------------------------------------------- Ben Myers (1): xfs: stop the sync worker before xfs_unmountfs Carlos Maiolino (1): xfs: fix race while discarding buffers [V4] fs/xfs/xfs_buf.c | 5 ++++- fs/xfs/xfs_buf.h | 41 ++++++++++++++++++++++++----------------- fs/xfs/xfs_super.c | 1 + 3 files changed, 29 insertions(+), 18 deletions(-) From david@fromorbit.com Wed Sep 19 16:52:57 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8JLqvf2253941 for ; Wed, 19 Sep 2012 16:52:57 -0500 X-ASG-Debug-ID: 1348091647-04bdf0067c4106d0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id eo2p3GZIKo8R9Gtk for ; Wed, 19 Sep 2012 14:54:08 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AnIRAKg9WlB5LC9S/2dsb2JhbABFhSG2KgEBAYEAgQmCIAEBBTocIxAIAxguFCUDNIgCukAUiwgUcU9sYoI/YAOVY4k2hmyCeIFI Received: from ppp121-44-47-82.lns20.syd6.internode.on.net (HELO dastard) ([121.44.47.82]) by ipmail06.adl6.internode.on.net with ESMTP; 20 Sep 2012 07:24:06 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TESDd-0002fj-Va; Thu, 20 Sep 2012 07:54:06 +1000 Date: Thu, 20 Sep 2012 07:54:05 +1000 From: Dave Chinner To: tinguely@sgi.com Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/3] xfs: restrict allocate worker to x86_64 Message-ID: <20120919215405.GE31501@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/3] xfs: restrict allocate worker to x86_64 References: <20120919163133.097340199@sgi.com> <20120919163145.367256258@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20120919163145.367256258@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1348091647 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109018 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed, Sep 19, 2012 at 11:31:34AM -0500, tinguely@sgi.com wrote: > Restrict the allocation worker to X86_64 machines. This will improve > performance on non-X86-64 machines and avoid the AGF buffer hang. > > Signed-off-by: Mark Tinguely NACK. The stack overflow problems that this works around are not limited to x86-64. In the past we've seen overflows on i686 (even with 8k stacks), s390 and other platforms, so it's not an isolated issue. It either works or it doesn't - let's not start down the rathole of having different code paths and behaviours for different platforms. Cheers, Dave. -- Dave Chinner david@fromorbit.com From sandeen@redhat.com Wed Sep 19 17:52:46 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8JMqkDU258801 for ; Wed, 19 Sep 2012 17:52:46 -0500 X-ASG-Debug-ID: 1348095238-04cbb07ce350e720001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id wDVtX2UW49MMTcEL for ; Wed, 19 Sep 2012 15:53:58 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8JMrvGH031098 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 19 Sep 2012 18:53:57 -0400 Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id q8JMrurE003393 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Wed, 19 Sep 2012 18:53:57 -0400 Message-ID: <505A4D04.2080105@redhat.com> Date: Wed, 19 Sep 2012 17:53:56 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20120907 Thunderbird/15.0.1 MIME-Version: 1.0 To: xfs-oss Subject: [PATCH] xfstests: add _require_freeze and minor cleanups X-Enigmail-Version: 1.4.4 X-ASG-Orig-Subj: [PATCH] xfstests: add _require_freeze and minor cleanups Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1348095238 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com More filesystems have grown freeze capability, so rather than hardcoding several in _supported_fs, make tests 068 and 280 generic and then add a new _require_freeze() which checks whether the fs under test can be frozen before beginning the test. Minor other cleanups to 280: - remove extra _supported_fs line - clear $seq.full before beginning Signed-off-by: Eric Sandeen --- diff --git a/068 b/068 index b595d1d..617420c 100755 --- a/068 +++ b/068 @@ -51,10 +51,11 @@ trap "_cleanup" 0 1 2 3 15 . ./common.filter # real QA test starts here -_supported_fs btrfs ext3 ext4 xfs +_supported_fs generic _supported_os Linux IRIX _require_scratch +_require_freeze echo "*** init FS" diff --git a/280 b/280 index 55849ed..5e26173 100755 --- a/280 +++ b/280 @@ -45,13 +45,15 @@ _cleanup() _require_scratch _require_quota +_require_freeze # real QA test starts here # Modify as appropriate. -_supported_fs generic _supported_os Linux -_supported_fs ext3 ext4 xfs +_supported_fs generic + +rm -f $seq.full umount $SCRATCH_DEV 2>/dev/null _scratch_mkfs >> $seq.full 2>&1 diff --git a/common.rc b/common.rc index 602513a..0e8a306 100644 --- a/common.rc +++ b/common.rc @@ -1758,6 +1758,15 @@ _require_btrfs() [ $? -eq 0 ] || _notrun "$BTRFS_UTIL_PROG too old (must support $cmd)" } +# Does freeze work on this fs? +_require_freeze() +{ + xfs_freeze -f "$TEST_DIR" >/dev/null 2>&1 + result=$? + xfs_freeze -u "$TEST_DIR" >/dev/null 2>&1 + [ $result -eq 0 ] || _notrun "$FSTYP does not support freezing" +} + # arg 1 is dev to remove and is output of the below eg. # ls -l /sys/class/block/sdd | rev | cut -d "/" -f 3 | rev _devmgt_remove() From nscott@redhat.com Wed Sep 19 18:14:22 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8JNEMcU261107 for ; Wed, 19 Sep 2012 18:14:22 -0500 X-ASG-Debug-ID: 1348096533-04bdf0067c415e10001-NocioJ Received: from mx3-phx2.redhat.com (mx3-phx2.redhat.com [209.132.183.24]) by cuda.sgi.com with ESMTP id alDKH86mWGoPx4P8; Wed, 19 Sep 2012 16:15:33 -0700 (PDT) X-Barracuda-Envelope-From: nscott@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.24 Received: from zmail20.collab.prod.int.phx2.redhat.com (zmail20.collab.prod.int.phx2.redhat.com [10.5.83.23]) by mx3-phx2.redhat.com (8.13.8/8.13.8) with ESMTP id q8JNFVlc028429; Wed, 19 Sep 2012 19:15:31 -0400 Date: Wed, 19 Sep 2012 19:15:31 -0400 (EDT) From: Nathan Scott Reply-To: Nathan Scott To: Ben Myers Cc: Linux fs XFS , Stefan Ring Message-ID: <299455910.2330174.1348096531357.JavaMail.root@redhat.com> In-Reply-To: <20120919155007.GZ3274@sgi.com> Subject: Re: [PATCH] German translation for xfsdump MIME-Version: 1.0 X-ASG-Orig-Subj: Re: [PATCH] German translation for xfsdump Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-Originating-IP: [10.64.48.182] X-Mailer: Zimbra 7.2.0_GA_2669 (ZimbraWebClient - FF3.0 (Linux)/7.2.0_GA_2669) X-Barracuda-Connect: mx3-phx2.redhat.com[209.132.183.24] X-Barracuda-Start-Time: 1348096533 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109022 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- ----- Original Message ----- > On Tue, Aug 28, 2012 at 11:10:21AM +0200, Stefan Ring wrote: > > On Sat, Aug 4, 2012 at 1:50 AM, Nathan Scott > > wrote: > > > Please send a follow-up patch, thanks! > > The initial German translation and this followup patch have been > committed to > git://oss.sgi.com/xfs/cmds/xfsdump.git, master branch. > Thanks Ben, I've let the Debian translation people know. cheers. -- Nathan From david@fromorbit.com Wed Sep 19 18:33:59 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8JNXxH2001000 for ; Wed, 19 Sep 2012 18:33:59 -0500 X-ASG-Debug-ID: 1348097707-04cbb07ce2513d00001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id onWIEl1dYEr6IJMa for ; Wed, 19 Sep 2012 16:35:08 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AnMRAB9WWlB5LC9S/2dsb2JhbAA9CIUhtkUBAQGBAIEJgiABAQQBOhwjBQsIAxguFCUDNBuHYgW6KxSLCBUBb09sgyFgA5VjkCKCeIFIAQM Received: from ppp121-44-47-82.lns20.syd6.internode.on.net (HELO dastard) ([121.44.47.82]) by ipmail06.adl6.internode.on.net with ESMTP; 20 Sep 2012 09:04:40 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TETmt-0002q6-EI; Thu, 20 Sep 2012 09:34:35 +1000 Date: Thu, 20 Sep 2012 09:34:35 +1000 From: Dave Chinner To: tinguely@sgi.com Cc: xfs@oss.sgi.com Subject: Re: [PATCH 0/3] xfs: allocation worker causes freelist buffer lock hang Message-ID: <20120919233435.GF31501@dastard> X-ASG-Orig-Subj: Re: [PATCH 0/3] xfs: allocation worker causes freelist buffer lock hang References: <20120919163133.097340199@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20120919163133.097340199@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1348097707 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109023 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed, Sep 19, 2012 at 11:31:33AM -0500, tinguely@sgi.com wrote: > We have experience file system hangs on the IA64, X86_32 and X86_64 > environments caused by a deadlock on AGF buffers. > > The below stack frames is a simple example of the deadlock. This example > was taken from the current OSS Linux 3.6 sources on a x86_32 machine that > was suffering from a daemon storm at the time: I hit it last night via test 113 on a RHEL6 backport that has the old workqueue implementation and so only has one worker per CPU. > The holder of the lock: .... > The worker that is blocked waiting for the lock: > > PID: 30223 TASK: dfb86cb0 CPU: 3 COMMAND: "xfsalloc" > #0 [d4a45b9c] __schedule at c068a7e8 > #1 [d4a45c24] schedule at c068abd9 > #2 [d4a45c2c] schedule_timeout at c0689808 > #3 [d4a45c90] __down_common at c068a1d4 > #4 [d4a45cc0] __down at c068a25e > #5 [d4a45cc8] down at c02598ff > #6 [d4a45cd8] xfs_buf_lock at e1ebaa6d [xfs] > #7 [d4a45cf8] _xfs_buf_find at e1ebad0e [xfs] > #8 [d4a45d2c] xfs_buf_get_map at e1ebaf00 [xfs] > #9 [d4a45d58] xfs_buf_read_map at e1ebbce3 [xfs] > #10 [d4a45d7c] xfs_trans_read_buf_map at e1f2974e [xfs] > #11 [d4a45dac] xfs_read_agf at e1ed7d2c [xfs] > #12 [d4a45dec] xfs_alloc_read_agf at e1ed7f2d [xfs] > #13 [d4a45e0c] xfs_alloc_fix_freelist at e1ed84f6 [xfs] So this has to be the first time we've tried to use this AG for allocation in the transaction, otherwise we would have found it attached to the transaction. I'll come back to this. > #14 [d4a45e4c] check_preempt_curr at c0261c47 > #15 [d4a45e60] ttwu_do_wakeup at c0261c7e > #16 [d4a45e8c] radix_tree_lookup at c0465ab5 > #17 [d4a45e94] xfs_perag_get at e1f19a36 [xfs] > #18 [d4a45ec8] __xfs_alloc_vextent at e1ed899d [xfs] > #19 [d4a45f1c] xfs_alloc_vextent_worker at e1ed8edb [xfs] > #20 [d4a45f30] process_one_work at c024e39d > #21 [d4a45f74] process_scheduled_works at c024e6ad > #22 [d4a45f84] rescuer_thread at c024e7f0 > #23 [d4a45fbc] kthread at c0253c1b > #24 [d4a45fe8] kernel_thread_helper at c0692af > > The AGF buffer can be locked across multiple calls to xfs_alloc_vextent(). > This buffer must remained locked until the transaction is either committed or > canceled. The deadlock occurs when other callers of xfs_alloc_vextent() block > waiting for the AGF buffer lock and the workqueue manager cannot create another > allocate worker to service the allocation request for the process that holds > the lock, The default limit for the allocation worker is 256 workers and that > limit can be increased to 512, but lack of resources before this limit is the > real reason the workqueue manager cannot create another worker. IOWs, the problem is that a worker thread that holds a resource cannot get scheduled to make progress. > The solution to this problem is to move the allocation worker so that the > loops over xfs_alloc_vextent() for a single transaction, on non-metadata > paths will happen in a single worker. That just moves the problem. e.g. to unwritten extent conversion. Say we only have 3 worker threads maximum: kworker 1 kworker 2 kworker 3 end io endio end io ilock_excl ilock_excl ilock_excl (block) (blocks) (blocks) (gets lock) bmapi_write(convert) queue work wait for work So now we are stuck again. > I traced the callers of xfs_alloc_vextent(), noting transaction creation, > commits and cancels; I noted loops in the callers and which were marked > as metadata/userdata. I can send this document to reviewers. No need, I can see the (generic) problem now that it has been pointed out. Basically, this is what the rescuer thread is kind of for - it works around the inability to allocate a new worker thread due to a OOM situation. This doesn't help us here because that rescuer would simply block like the others. Hence a rescuer thread concept doesn't solve the problem at all. So lets go back to the case at hand. We block because this is the first attempt to lock the AGF in an allocation, and the XFS_ALLOC_FLAG_TRYLOCK flag is not set. This indicates we are asking for allocation in a specific AG from __xfs_alloc_vextent(), and we can't do that until some other allocation completes. Given that AGF locking orders are strictly enforced, we know that the holder of the AGF will not deadlock as long as it can be scheduled to run. IOWs, it is not safe to block forever on a lock in a worker thread when there are outside dependencies on that lock being released to make progress. To me that's not really a deadlock in the traditional sense - it's more akin to a priority inversion that prevents the resource holder from making progress. i.e. blocked threads hold the worker resources, which prevent the lock holder from being able to run and release the lock. Hmmm. I think there are other ways to trigger this as well. Anything that holds the AGF locked for a period of time is going to cause allocations to back up like this, regardless of whether we queue at xfs_alloc_vexent() or xfs_bmapi_write(). For example, FITRIM holds the AGF locked for as long as it takes to issue all the discard operations. That could stall enough allocations to run us out of worker threads and hence effectively stop data allocations from being run for some period of time. It won't deadlock, but it certainly is sub-optimal behaviour. I suspect the only way to fix this is to re-use the old workqueue method of avoiding blocking on the workqueue indefinitely. That is, if we fail to get the lock in this case, we return with EGAIN and requeue the work. __xfs_alloc_vextent() and xfs_alloc_fix_freelist() already have trylock support, so this should be fairly easy to do. If I also convert the work to delayed work, I can easily add a backoff that will prevent busy looping on the workqueue. I'll have a quick look at this and see what falls out.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Sep 19 18:39:52 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8JNdqJ5001939 for ; Wed, 19 Sep 2012 18:39:52 -0500 X-ASG-Debug-ID: 1348098063-04bdf06cd031f180001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id F5eR5aLHbxaJuFWf for ; Wed, 19 Sep 2012 16:41:03 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AnMRAB9WWlB5LC9S/2dsb2JhbABFhSG2RQEBAYEAgQmCIAEBBAE6HCMFCwgDGC4UJQM0G4diBborFIsIgQVPbGKDHwOVY4k2hmyCeA Received: from ppp121-44-47-82.lns20.syd6.internode.on.net (HELO dastard) ([121.44.47.82]) by ipmail06.adl6.internode.on.net with ESMTP; 20 Sep 2012 09:11:02 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TETt8-0002qv-Hc; Thu, 20 Sep 2012 09:41:02 +1000 Date: Thu, 20 Sep 2012 09:41:02 +1000 From: Dave Chinner To: tinguely@sgi.com Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/3] xfs: zero allocation_args on the kernel stack Message-ID: <20120919234102.GG31501@dastard> X-ASG-Orig-Subj: Re: [PATCH 3/3] xfs: zero allocation_args on the kernel stack References: <20120919163133.097340199@sgi.com> <20120919163145.587098223@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20120919163145.587098223@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1348098063 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109023 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Wed, Sep 19, 2012 at 11:31:36AM -0500, tinguely@sgi.com wrote: > The allocation argument structures is created on the kernel stack space. This > patch makes sure the userdata variable is always initialized. > > The better solution is always memset to 0 or "= { 0 }" the xfs_alloc_arg Yes, please do that and remove all the initialisations to zero instead. It's much easier to maintain in future if new additions to structures are automaticlly zeroed by the code that uses it... > and xfs_bmalloca structures. I believe there will only be 4 places that need > this memset change. The only definition of xfs_bmalloca (in xfs_bmapi_write) is already zeroed: struct xfs_bmalloca bma = { 0 }; /* args for xfs_bmap_alloc */ Cheers, Dave. -- Dave Chinner david@fromorbit.com From stockhausen@collogia.de Wed Sep 19 23:32:03 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8K4W20M028203 for ; Wed, 19 Sep 2012 23:32:02 -0500 X-ASG-Debug-ID: 1348115593-04cb6c5687471ac0001-NocioJ Received: from mailrelay.collogia.de (mailrelay.collogia.de [62.40.12.196]) by cuda.sgi.com with SMTP id zhyQ4e0ieZ0beeJM for ; Wed, 19 Sep 2012 21:33:14 -0700 (PDT) X-Barracuda-Envelope-From: stockhausen@collogia.de X-Barracuda-Apparent-Source-IP: 62.40.12.196 Received: from EXCHANGE.collogia.de (192.168.10.9) by edge.collogia.de (62.40.12.197) with Microsoft SMTP Server (TLS) id 14.2.283.3; Thu, 20 Sep 2012 06:33:10 +0200 Received: from EXCHANGE.collogia.de ([192.168.10.9]) by EXCHANGE.collogia.de ([192.168.10.9]) with mapi id 14.02.0283.003; Thu, 20 Sep 2012 06:33:10 +0200 From: Markus Stockhausen To: Dave Chinner CC: "xfs@oss.sgi.com" Subject: RE: Writeback Stalls Thread-Topic: Writeback Stalls X-ASG-Orig-Subj: RE: Writeback Stalls Thread-Index: Ac2Wj1HT6pr2HR9YR5m1/8HFWskN8gADnaUAABKdJM0= Date: Thu, 20 Sep 2012 04:33:09 +0000 Message-ID: <12EF8D94C6F8734FB2FF37B9FBEDD1735831B7C9@EXCHANGE.collogia.de> References: <12EF8D94C6F8734FB2FF37B9FBEDD1735831B7A3@EXCHANGE.collogia.de>,<20120919213427.GD31501@dastard> In-Reply-To: <20120919213427.GD31501@dastard> Accept-Language: de-DE, en-US Content-Language: de-DE X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [62.40.12.200] Content-Type: multipart/mixed; boundary="----=_NextPartTM-000-2807fa22-003f-46c4-b67a-5f240b473b31" MIME-Version: 1.0 X-TM-AS-Product-Ver: ISVW-7.00.0.1353-6.8.0.1017-19194004 X-TM-AS-Result: No X-TM-AS-Category-Info: 31:0,000000 X-TM-AS-MatchedID: 150567-147015-139010-703283-121124-700398-702474-703267-7 06249-105630-188019-703454-701005-710802-703747-701502-101091-139702-853842 -710467-700133-705375-700107-160005-148035-148050-23116-29102-30060-41000-4 2003 X-Barracuda-Connect: mailrelay.collogia.de[62.40.12.196] X-Barracuda-Start-Time: 1348115593 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.02 X-Barracuda-Spam-Status: No, SCORE=0.02 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=THREAD_INDEX, THREAD_TOPIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109043 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.01 THREAD_TOPIC Thread-Topic: ...(Japanese Subject)... This is a multi-part message in MIME format. ------=_NextPartTM-000-2807fa22-003f-46c4-b67a-5f240b473b31 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable > Fundamentally, you are doing it all wrong. High throughput, low=0A= > latency NFS servers write dirty data to disk fast, not leave it=0A= > memory until you run out of clean memory because that causes=0A= > everything to block waiting for writeback IO completion to be ale to=0A= > free memory...=0A= =0A= Maybe I did not make it clear enough. The above setup is only=0A= for demonstration purposes. To expose the problem better. In=0A= real life we can see stalls tat thange from 0.5-1 seconds. Even=0A= with all caches active, small dirty writeback settings and unlimited=0A= bandwidth.=0A= =0A= In between I found others complaining about the same problem:=0A= =0A= http://lwn.net/Articles/486313/=0A= http://oss.sgi.com/archives/xfs/2011-09/msg00189.html=0A= =0A= So just one last question: Can I savely revert the the mentioned =0A= commit d76ee18a8551e33ad7dbd55cac38bc7b094f3abb if I only =0A= write data to a battery backed up hardware raid controller on a =0A= server that is attached to an UPS?=0A= =0A= Thanks in advance.=0A= =0A= Markus= ------=_NextPartTM-000-2807fa22-003f-46c4-b67a-5f240b473b31 Content-Type: text/plain; name="InterScan_Disclaimer.txt" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="InterScan_Disclaimer.txt" **************************************************************************** Diese E-Mail enthält vertrauliche und/oder rechtlich geschützte Informationen. Wenn Sie nicht der richtige Adressat sind oder diese E-Mail irrtümlich erhalten haben, informieren Sie bitte sofort den Absender und vernichten Sie diese Mail. Das unerlaubte Kopieren sowie die unbefugte Weitergabe dieser Mail ist nicht gestattet. Über das Internet versandte E-Mails können unter fremden Namen erstellt oder manipuliert werden. Deshalb ist diese als E-Mail verschickte Nachricht keine rechtsverbindliche Willenserklärung. Collogia Unternehmensberatung AG Ubierring 11 D-50678 Köln Vorstand: Kadir Akin Dr. Michael Höhnerbach Vorsitzender des Aufsichtsrates: Hans Kristian Langva Registergericht: Amtsgericht Köln Registernummer: HRB 52 497 This e-mail may contain confidential and/or privileged information. If you are not the intended recipient (or have received this e-mail in error) please notify the sender immediately and destroy this e-mail. Any unauthorized copying, disclosure or distribution of the material in this e-mail is strictly forbidden. e-mails sent over the internet may have been written under a wrong name or been manipulated. That is why this message sent as an e-mail is not a legally binding declaration of intention. Collogia Unternehmensberatung AG Ubierring 11 D-50678 Köln executive board: Kadir Akin Dr. Michael Höhnerbach President of the supervisory board: Hans Kristian Langva Registry office: district court Cologne Register number: HRB 52 497 **************************************************************************** ------=_NextPartTM-000-2807fa22-003f-46c4-b67a-5f240b473b31-- From david@fromorbit.com Thu Sep 20 01:05:01 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8K650uJ040398 for ; Thu, 20 Sep 2012 01:05:01 -0500 X-ASG-Debug-ID: 1348121171-04cbb07ce5541c20001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id V0PYKRS8aTlIAcP6 for ; Wed, 19 Sep 2012 23:06:11 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AswSAG+xWlB5LC9S/2dsb2JhbAArGoUhtmIBAQEBgQGBCYIgAQEEATocIwULCAMYLhQlAyETGYdkBQwsuUsUiwgFTDRPbIQBA5VjkCKCeA Received: from ppp121-44-47-82.lns20.syd6.internode.on.net (HELO dastard) ([121.44.47.82]) by ipmail04.adl6.internode.on.net with ESMTP; 20 Sep 2012 15:35:50 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TEZtP-0003V1-RK; Thu, 20 Sep 2012 16:05:43 +1000 Date: Thu, 20 Sep 2012 16:05:43 +1000 From: Dave Chinner To: Markus Stockhausen Cc: "xfs@oss.sgi.com" Subject: Re: Writeback Stalls Message-ID: <20120920060543.GH31501@dastard> X-ASG-Orig-Subj: Re: Writeback Stalls References: <12EF8D94C6F8734FB2FF37B9FBEDD1735831B7A3@EXCHANGE.collogia.de> <20120919213427.GD31501@dastard> <12EF8D94C6F8734FB2FF37B9FBEDD1735831B7C9@EXCHANGE.collogia.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <12EF8D94C6F8734FB2FF37B9FBEDD1735831B7C9@EXCHANGE.collogia.de> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1348121171 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA085 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109049 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 BSF_SC0_SA085 Custom Rule SA085 On Thu, Sep 20, 2012 at 04:33:09AM +0000, Markus Stockhausen wrote: > > Fundamentally, you are doing it all wrong. High throughput, low > > latency NFS servers write dirty data to disk fast, not leave it > > memory until you run out of clean memory because that causes > > everything to block waiting for writeback IO completion to be ale to > > free memory... > > Maybe I did not make it clear enough. Plenty clear enough. Maybe I did not make it clear enough: Nobody has the time to try to diagnose a problem on a configuration that is obviously broken and pessimal for writeback behaviour. The first step is to report your actual problem, not an artificial behaviour you *think* demonstrates the same problem.... > The above setup is only > for demonstration purposes. To expose the problem better. In > real life we can see stalls tat thange from 0.5-1 seconds. Even > with all caches active, small dirty writeback settings and unlimited > bandwidth. So describe the application, etc that you see this problem. Start with: http://xfs.org/index.php/XFS_FAQ#Q:_What_information_should_I_include_when_reporting_a_problem.3F and we can go from there. > In between I found others complaining about the same problem: > > http://lwn.net/Articles/486313/ > http://oss.sgi.com/archives/xfs/2011-09/msg00189.html How do you know they are the same problem? Indeed, they aren't even writeback problems - they are application IO latency issues caused by the introduction of stable pages during writeback. > So just one last question: Can I savely revert the the mentioned > commit d76ee18a8551e33ad7dbd55cac38bc7b094f3abb if I only > write data to a battery backed up hardware raid controller on a > server that is attached to an UPS? NFS servers don't use mmap, so that patch is not causing your writeback problems. Cheers, Dave. -- Dave Chinner david@fromorbit.com From eflorac@intellique.com Thu Sep 20 02:11:55 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8K7Btjq048599 for ; Thu, 20 Sep 2012 02:11:55 -0500 X-ASG-Debug-ID: 1348125185-04cbb07ce35443e0001-NocioJ Received: from smtp3-g21.free.fr (smtp3-g21.free.fr [212.27.42.3]) by cuda.sgi.com with ESMTP id 1YWYfqVP2vZuZFEo for ; Thu, 20 Sep 2012 00:13:06 -0700 (PDT) X-Barracuda-Envelope-From: eflorac@intellique.com X-Barracuda-Apparent-Source-IP: 212.27.42.3 Received: from galadriel.home (unknown [82.235.234.79]) by smtp3-g21.free.fr (Postfix) with ESMTP id 6F79DA6240; Thu, 20 Sep 2012 09:13:01 +0200 (CEST) Date: Thu, 20 Sep 2012 09:12:46 +0200 From: Emmanuel Florac To: Markus Stockhausen Cc: "xfs@oss.sgi.com" Subject: Re: Writeback Stalls Message-ID: <20120920091246.21db5857@galadriel.home> X-ASG-Orig-Subj: Re: Writeback Stalls In-Reply-To: <12EF8D94C6F8734FB2FF37B9FBEDD1735831B7A3@EXCHANGE.collogia.de> References: <12EF8D94C6F8734FB2FF37B9FBEDD1735831B7A3@EXCHANGE.collogia.de> Organization: Intellique X-Mailer: Claws Mail 3.7.8 (GTK+ 2.24.4; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp3-g21.free.fr[212.27.42.3] X-Barracuda-Start-Time: 1348125185 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109053 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Le Wed, 19 Sep 2012 18:36:11 +0000 vous =C3=A9criviez: > We have an small sized VMWare infrastructure. 8 hosts with round > about 50 VMs. Their images are hosted on 2 Ubuntu 12.04 NFS storage > servers with each of them having a 14 disk RAID 6 array. On top of > the array runs a single XFS filesystem with round about 10TB of disk > space. You didn't mention the type of disks and controllers you're using, it makes a very important difference. Typically in VM environment RAID-6 on 7200RPM drives behaves quite poorly because of very poor random IO write performance.=20 You should also look at the iostat -mx output on the NFS server. You'll probably see a 100% disk usage with lots of small read and write IOs. --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From mail@blafoo.org Thu Sep 20 04:31:08 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=BAYES_00,MISSING_HEADERS autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8K9V8jc063970 for ; Thu, 20 Sep 2012 04:31:08 -0500 X-ASG-Debug-ID: 1348133539-04cb6c568747dd10001-NocioJ Received: from vwp1161.webpack.hosteurope.de (vwp1161.webpack.hosteurope.de [87.230.104.173]) by cuda.sgi.com with ESMTP id QglUBGERLNuCVxez for ; Thu, 20 Sep 2012 02:32:19 -0700 (PDT) X-Barracuda-Envelope-From: mail@blafoo.org X-Barracuda-Apparent-Source-IP: 87.230.104.173 Received: from vs.bk.hosteurope.de ([10.20.3.39]); authenticated by vwp1161.webpack.hosteurope.de running ExIM with esmtpsa (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) id 1TEd7J-0007sA-Us; Thu, 20 Sep 2012 11:32:17 +0200 Message-ID: <505AE2A1.5060703@blafoo.org> Date: Thu, 20 Sep 2012 11:32:17 +0200 From: Volker User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:15.0) Gecko/20120907 Thunderbird/15.0.1 MIME-Version: 1.0 CC: xfs@oss.sgi.com Subject: Re: OOM on quotacheck (again?) References: <5059D2B4.8010300@blafoo.org> <20120919205924.GC31501@dastard> X-ASG-Orig-Subj: Re: OOM on quotacheck (again?) In-Reply-To: <20120919205924.GC31501@dastard> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-bounce-key: webpack.hosteurope.de;mail@blafoo.org;1348133540;176a35a3; X-Barracuda-Connect: vwp1161.webpack.hosteurope.de[87.230.104.173] X-Barracuda-Start-Time: 1348133539 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 1.21 X-Barracuda-Spam-Status: No, SCORE=1.21 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MISSING_HEADERS X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109063 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.21 MISSING_HEADERS Missing To: header Hi, > Which implies you are running a 32 bit kernel even on 64 bit CPUs > (e.g. R710). My mistake. That is not yet the case, but the plan for the future. Thanks for pointing that out. > No surprise if you are running an i686 kernel (32 bit). You've got > way more inodes than can fit in the kernel memory segment. Could you slightly elaborate on that or give me a link or two which explain the matter? If a 32bit kernel is not supposed to work because of the number of inodes, why does the 2.6.39.4-kernel work flawlessy on quota-checks on the same filesystem a 3.6.0-rc5 32bit (which is supposed to work) fails on? Doesn't that imply, that the fix submitted for 2.6.39.4 fixed a problem which was "reinvented" by the later patch, which is now being worked around by using a 64bit kernel for more memory? > Running on a x86-64 kernel will make the vmalloc problem go away. > There's very little we can do about the limited vmalloc address > space on i686 kernels. As it is, the known recent regression in this > space: > > bcf62ab xfs: Fix overallocation in xfs_buf_allocate_memory() > > $ git describe --contains bcf62ab > v3.6-rc1~42^2~35 > > was fixed in 3.6-rc1, Confirmed. The current 3.6.0-rc5 in 64bit works doing the quota-check. I'll do some more testing with xfs_fsr etc. and report back. best regards volker From spelic@shiftmail.org Thu Sep 20 06:10:26 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8KBAQWt071462 for ; Thu, 20 Sep 2012 06:10:26 -0500 X-ASG-Debug-ID: 1348139498-04cbb07ce5551520001-NocioJ Received: from srv2.trombetti.net (srv2.trombetti.net [65.254.53.252]) by cuda.sgi.com with ESMTP id Y43bB3woemPFuKWY for ; Thu, 20 Sep 2012 04:11:38 -0700 (PDT) X-Barracuda-Envelope-From: spelic@shiftmail.org X-Barracuda-Apparent-Source-IP: 65.254.53.252 Received: from localhost (localhost [127.0.0.1]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) (Authenticated sender: SASL) by srv2.trombetti.net (Postfix) with ESMTPSA id DFBF3543B7 for ; Thu, 20 Sep 2012 07:11:37 -0400 (EDT) Message-ID: <505AF9EA.7030603@shiftmail.org> Date: Thu, 20 Sep 2012 13:11:38 +0200 From: Spelic User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:14.0) Gecko/20120714 Thunderbird/14.0 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: Questions on RAID alignment Content-Type: text/plain; charset=UTF-8; format=flowed X-ASG-Orig-Subj: Questions on RAID alignment Content-Transfer-Encoding: 7bit X-Barracuda-Connect: srv2.trombetti.net[65.254.53.252] X-Barracuda-Start-Time: 1348139498 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109069 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hello list a few questions 1- Does XFS support alignment to concatenation RAIDs (e.g. linear over raid1) similarly to striped ones? I am guessing probably su and sw should not be specified and the agcount should be multiple of the number of the concatenated devices, is that correct? 2- Can mkfs parameters be altered after creation, e.g. after growing a RAID and then growing the XFS fs, can I also alter su, sw, agcount somehow? 3- I seem to remember there was an xattr that one could attach to /home (if /home was under XFS) so that every user (subdir of /home) would get a different AG in a different RAID device. I cannot find that information anymore on the internet; could you refresh my mind? Thank you Spelic From eflorac@intellique.com Thu Sep 20 07:04:29 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_43 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8KC4TXT077508 for ; Thu, 20 Sep 2012 07:04:29 -0500 X-ASG-Debug-ID: 1348142739-04cbb07ce3556210001-NocioJ Received: from smtp4-g21.free.fr (smtp4-g21.free.fr [212.27.42.4]) by cuda.sgi.com with ESMTP id ubhZsJejWrQYrhQB for ; Thu, 20 Sep 2012 05:05:40 -0700 (PDT) X-Barracuda-Envelope-From: eflorac@intellique.com X-Barracuda-Apparent-Source-IP: 212.27.42.4 Received: from harpe.intellique.com (unknown [82.225.196.72]) by smtp4-g21.free.fr (Postfix) with ESMTP id 61E154C8066; Thu, 20 Sep 2012 14:05:35 +0200 (CEST) Date: Thu, 20 Sep 2012 14:05:37 +0200 From: Emmanuel Florac To: Spelic Cc: xfs@oss.sgi.com Subject: Re: Questions on RAID alignment Message-ID: <20120920140537.11a50638@harpe.intellique.com> X-ASG-Orig-Subj: Re: Questions on RAID alignment In-Reply-To: <505AF9EA.7030603@shiftmail.org> References: <505AF9EA.7030603@shiftmail.org> Organization: Intellique X-Mailer: Claws Mail 3.7.9 (GTK+ 2.24.4; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-Barracuda-Connect: smtp4-g21.free.fr[212.27.42.4] X-Barracuda-Start-Time: 1348142739 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109073 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Le Thu, 20 Sep 2012 13:11:38 +0200 Spelic =E9crivait: > 1- Does XFS support alignment to concatenation RAIDs (e.g. linear > over raid1) similarly to striped ones? I am guessing probably su and > sw should not be specified and the agcount should be multiple of the > number of the concatenated devices, is that correct? No, it's better to set your sw/su accordingly to your RAID setup (example: 8 drives RAID-10 256k stripe -> su=3D256k,sw=3D4) and let mkfs.xfs determine itself how many ag it wants, to adapt it both to the striping and filesystem size.=20 > 2- Can mkfs parameters be altered after creation, e.g. after growing > a RAID and then growing the XFS fs, can I also alter su, sw, agcount > somehow? agcount will be adjusted by xfs_growfs AFAIK. For the other parameters, not so much. =20 > 3- I seem to remember there was an xattr that one could attach > to /home (if /home was under XFS) so that every user (subdir > of /home) would get a different AG in a different RAID device. I > cannot find that information anymore on the internet; could you > refresh my mind? >=20 I really have no idea on this. --=20 ------------------------------------------------------------------------ Emmanuel Florac | Direction technique | Intellique | | +33 1 78 94 84 02 ------------------------------------------------------------------------ From cmaiolino@redhat.com Thu Sep 20 08:32:18 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8KDWItr088882 for ; Thu, 20 Sep 2012 08:32:18 -0500 X-ASG-Debug-ID: 1348148010-04cb6c5687490f30001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 8BH3K5FyYnIRY43R for ; Thu, 20 Sep 2012 06:33:30 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8KDXUt4020074 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 20 Sep 2012 09:33:30 -0400 Received: from andromeda.usersys.redhat.com (ovpn-113-73.phx2.redhat.com [10.3.113.73]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q8KDXRt2019074 for ; Thu, 20 Sep 2012 09:33:29 -0400 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: [PATCH 0/6 V4] inode32/inode64 allocation changes Date: Thu, 20 Sep 2012 10:32:35 -0300 X-ASG-Orig-Subj: [PATCH 0/6 V4] inode32/inode64 allocation changes Message-Id: <1348147961-7520-1-git-send-email-cmaiolino@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1348148010 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com This patch set adds inode64 as the default allocation mode, but also includes 2 patches to remove duplicated code and another one to make inode32 able to be remounted. NOTE: This patch has as dependency "Make inode64 a remountable option" patch. V4 properly set pagf_metadata in patch 5 V3 has a better factoring of each patch goal, including other dchinner's suggestions in V2. Also it contains a fix in how m_agirotor reset is made (patch 01) that I've found while doing tests with these patches. Carlos Maiolino (6): xfs: Fix m_agirotor reset during AG selection xfs: make inode64 as the default allocation mode xfs: reduce code duplication handling inode32/64 options xfs: Fix mp->m_maxagi update during inode64 remount xfs: add inode64->inode32 transition into xfs_set_inode32() xfs: Make inode32 a remountable option fs/xfs/xfs_ialloc.c | 2 +- fs/xfs/xfs_mount.c | 43 +++---------------- fs/xfs/xfs_super.c | 117 ++++++++++++++++++++++++++++++++++++++++------------ fs/xfs/xfs_super.h | 2 + 4 files changed, 99 insertions(+), 65 deletions(-) -- 1.7.11.4 From cmaiolino@redhat.com Thu Sep 20 08:32:18 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8KDWI97088889 for ; Thu, 20 Sep 2012 08:32:18 -0500 X-ASG-Debug-ID: 1348148011-04cbb07ce555d260001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id Dm9SSmAlGzhFdIoX for ; Thu, 20 Sep 2012 06:33:31 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8KDXVO1023582 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 20 Sep 2012 09:33:31 -0400 Received: from andromeda.usersys.redhat.com (ovpn-113-73.phx2.redhat.com [10.3.113.73]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q8KDXRt3019074 for ; Thu, 20 Sep 2012 09:33:30 -0400 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: [PATCH 1/6] xfs: Fix m_agirotor reset during AG selection Date: Thu, 20 Sep 2012 10:32:36 -0300 X-ASG-Orig-Subj: [PATCH 1/6] xfs: Fix m_agirotor reset during AG selection Message-Id: <1348147961-7520-2-git-send-email-cmaiolino@redhat.com> In-Reply-To: <1348147961-7520-1-git-send-email-cmaiolino@redhat.com> References: <1348147961-7520-1-git-send-email-cmaiolino@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1348148011 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com xfs_ialloc_next_ag() currently resets m_agirotor when it is equal to m_maxagi: if (++mp->m_agirotor == mp->m_maxagi) mp->m_agirotor = 0; But, if for some reason mp->m_maxagi changes to a lower value than current m_agirotor, this condition will never be true, causing m_agirotor to exceed the maximum allowed value (m_maxagi). This implies mainly during lookups for xfs_perag structs in its radix tree, since the agno value used for the lookup is based on m_agirotor. An out-of-range m_agirotor may cause a lookup failure which in case will return NULL. As an example, the value of m_maxagi is decreased during inode64->inode32 remount process, case where I've found this problem. Signed-off-by: Carlos Maiolino --- fs/xfs/xfs_ialloc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c index 5aceb3f..445bf1a 100644 --- a/fs/xfs/xfs_ialloc.c +++ b/fs/xfs/xfs_ialloc.c @@ -431,7 +431,7 @@ xfs_ialloc_next_ag( spin_lock(&mp->m_agirotor_lock); agno = mp->m_agirotor; - if (++mp->m_agirotor == mp->m_maxagi) + if (++mp->m_agirotor >= mp->m_maxagi) mp->m_agirotor = 0; spin_unlock(&mp->m_agirotor_lock); -- 1.7.11.4 From cmaiolino@redhat.com Thu Sep 20 08:32:20 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8KDWJQu088896 for ; Thu, 20 Sep 2012 08:32:19 -0500 X-ASG-Debug-ID: 1348148012-04bdf0067d460d50001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id PH1BtwtAgBLznFP9 for ; Thu, 20 Sep 2012 06:33:32 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8KDXWEB016389 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 20 Sep 2012 09:33:32 -0400 Received: from andromeda.usersys.redhat.com (ovpn-113-73.phx2.redhat.com [10.3.113.73]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q8KDXRt4019074 for ; Thu, 20 Sep 2012 09:33:31 -0400 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: [PATCH 2/6] xfs: make inode64 as the default allocation mode Date: Thu, 20 Sep 2012 10:32:37 -0300 X-ASG-Orig-Subj: [PATCH 2/6] xfs: make inode64 as the default allocation mode Message-Id: <1348147961-7520-3-git-send-email-cmaiolino@redhat.com> In-Reply-To: <1348147961-7520-1-git-send-email-cmaiolino@redhat.com> References: <1348147961-7520-1-git-send-email-cmaiolino@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1348148012 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com since 64-bit inodes can be accessed while using inode32, and these can also be used on 32-bit kernels, there is no reason to still keep inode32 as the default mount option. If the filesystem cannot handle 64bit inode numbers (i.e CONFIG_LBDAF is not enabled and BITS_PER_LONG == 32), XFS_MOUNT_SMALL_INUMS will still be set by default, so inode64 is not an unconditional default value. Signed-off-by: Carlos Maiolino --- fs/xfs/xfs_super.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index f1f2968..7686eee 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -88,6 +88,8 @@ mempool_t *xfs_ioend_pool; * unwritten extent conversion */ #define MNTOPT_NOBARRIER "nobarrier" /* .. disable */ #define MNTOPT_64BITINODE "inode64" /* inodes can be allocated anywhere */ +#define MNTOPT_32BITINODE "inode32" /* inode allocation limited to + * XFS_MAXINUMBER_32 */ #define MNTOPT_IKEEP "ikeep" /* do not free empty inode clusters */ #define MNTOPT_NOIKEEP "noikeep" /* free empty inode clusters */ #define MNTOPT_LARGEIO "largeio" /* report large I/O sizes in stat() */ @@ -198,7 +200,9 @@ xfs_parseargs( */ mp->m_flags |= XFS_MOUNT_BARRIER; mp->m_flags |= XFS_MOUNT_COMPAT_IOSIZE; +#if !XFS_BIG_INUMS mp->m_flags |= XFS_MOUNT_SMALL_INUMS; +#endif /* * These can be overridden by the mount option parsing. @@ -295,6 +299,8 @@ xfs_parseargs( return EINVAL; } dswidth = simple_strtoul(value, &eov, 10); + } else if (!strcmp(this_char, MNTOPT_32BITINODE)) { + mp->m_flags |= XFS_MOUNT_SMALL_INUMS; } else if (!strcmp(this_char, MNTOPT_64BITINODE)) { mp->m_flags &= ~XFS_MOUNT_SMALL_INUMS; #if !XFS_BIG_INUMS @@ -493,6 +499,7 @@ xfs_showargs( { XFS_MOUNT_FILESTREAMS, "," MNTOPT_FILESTREAM }, { XFS_MOUNT_GRPID, "," MNTOPT_GRPID }, { XFS_MOUNT_DISCARD, "," MNTOPT_DISCARD }, + { XFS_MOUNT_SMALL_INUMS, "," MNTOPT_32BITINODE }, { 0, NULL } }; static struct proc_xfs_info xfs_info_unset[] = { -- 1.7.11.4 From cmaiolino@redhat.com Thu Sep 20 08:32:21 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8KDWLuT088916 for ; Thu, 20 Sep 2012 08:32:21 -0500 X-ASG-Debug-ID: 1348148013-04cb6c5687490f70001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id bnqqPYM6oeoM7SD0 for ; Thu, 20 Sep 2012 06:33:33 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8KDXXV5016404 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 20 Sep 2012 09:33:33 -0400 Received: from andromeda.usersys.redhat.com (ovpn-113-73.phx2.redhat.com [10.3.113.73]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q8KDXRt5019074 for ; Thu, 20 Sep 2012 09:33:32 -0400 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: [PATCH 3/6] xfs: reduce code duplication handling inode32/64 options Date: Thu, 20 Sep 2012 10:32:38 -0300 X-ASG-Orig-Subj: [PATCH 3/6] xfs: reduce code duplication handling inode32/64 options Message-Id: <1348147961-7520-4-git-send-email-cmaiolino@redhat.com> In-Reply-To: <1348147961-7520-1-git-send-email-cmaiolino@redhat.com> References: <1348147961-7520-1-git-send-email-cmaiolino@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1348148013 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com Add xfs_set_inode32() to be used to enable inode32 allocation mode. this will reduce the amount of duplicated code needed to mount/remount a filesystem with inode32 option. This patch also changes xfs_set_inode64() to return the maximum AG number that inodes can be allocated instead of set mp->m_maxagi by itself, so that the behaviour is the same as xfs_set_inode32(). This simplifies code that calls these functions and needs to know the maximum AG that inodes can be allocated in. Signed-off-by: Carlos Maiolino --- fs/xfs/xfs_mount.c | 43 +++----------------------- fs/xfs/xfs_super.c | 89 +++++++++++++++++++++++++++++++++++++++--------------- fs/xfs/xfs_super.h | 2 ++ 3 files changed, 72 insertions(+), 62 deletions(-) diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 29c2f83..b2bd3a0 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -440,7 +440,7 @@ xfs_initialize_perag( xfs_agnumber_t agcount, xfs_agnumber_t *maxagi) { - xfs_agnumber_t index, max_metadata; + xfs_agnumber_t index; xfs_agnumber_t first_initialised = 0; xfs_perag_t *pag; xfs_agino_t agino; @@ -500,43 +500,10 @@ xfs_initialize_perag( else mp->m_flags &= ~XFS_MOUNT_32BITINODES; - if (mp->m_flags & XFS_MOUNT_32BITINODES) { - /* - * Calculate how much should be reserved for inodes to meet - * the max inode percentage. - */ - if (mp->m_maxicount) { - __uint64_t icount; - - icount = sbp->sb_dblocks * sbp->sb_imax_pct; - do_div(icount, 100); - icount += sbp->sb_agblocks - 1; - do_div(icount, sbp->sb_agblocks); - max_metadata = icount; - } else { - max_metadata = agcount; - } - - for (index = 0; index < agcount; index++) { - ino = XFS_AGINO_TO_INO(mp, index, agino); - if (ino > XFS_MAXINUMBER_32) { - index++; - break; - } - - pag = xfs_perag_get(mp, index); - pag->pagi_inodeok = 1; - if (index < max_metadata) - pag->pagf_metadata = 1; - xfs_perag_put(pag); - } - } else { - for (index = 0; index < agcount; index++) { - pag = xfs_perag_get(mp, index); - pag->pagi_inodeok = 1; - xfs_perag_put(pag); - } - } + if (mp->m_flags & XFS_MOUNT_32BITINODES) + index = xfs_set_inode32(mp); + else + index = xfs_set_inode64(mp); if (maxagi) *maxagi = index; diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 7686eee..0c2e06f 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -599,6 +599,71 @@ xfs_max_file_offset( return (((__uint64_t)pagefactor) << bitshift) - 1; } +xfs_agnumber_t +xfs_set_inode32(struct xfs_mount *mp) +{ + xfs_agnumber_t index = 0; + xfs_sb_t *sbp = &mp->m_sb; + xfs_agnumber_t max_metadata; + xfs_agino_t agino = XFS_OFFBNO_TO_AGINO(mp, sbp->sb_agblocks -1, 0); + xfs_ino_t ino = XFS_AGINO_TO_INO(mp, sbp->sb_agcount -1, agino); + xfs_perag_t *pag; + + /* Calculate how much should be reserved for inodes to meet + * the max inode percentage. + */ + if (mp->m_maxicount) { + __uint64_t icount; + + icount = sbp->sb_dblocks * sbp->sb_imax_pct; + do_div(icount, 100); + icount += sbp->sb_agblocks - 1; + do_div(icount, sbp->sb_agblocks); + max_metadata = icount; + } else { + max_metadata = sbp->sb_agcount; + } + + for (index = 0; index < sbp->sb_agcount; index++) { + ino = XFS_AGINO_TO_INO(mp, index, agino); + if (ino > XFS_MAXINUMBER_32) { + index++; + break; + } + + pag = xfs_perag_get(mp, index); + pag->pagi_inodeok = 1; + if (index < max_metadata) + pag->pagf_metadata = 1; + xfs_perag_put(pag); + } + return index; +} + +xfs_agnumber_t +xfs_set_inode64(struct xfs_mount *mp) +{ + xfs_agnumber_t index = 0; + + for (index = 0; index < mp->m_sb.sb_agcount; index++) { + struct xfs_perag *pag; + + pag = xfs_perag_get(mp, index); + pag->pagi_inodeok = 1; + pag->pagf_metadata = 0; + xfs_perag_put(pag); + } + + /* There is no need for lock protection on m_flags, + * the rw_semaphore of the VFS superblock is locked + * during mount/umount/remount operations, so this is + * enough to avoid concurency on the m_flags field + */ + mp->m_flags &= ~(XFS_MOUNT_32BITINODES | + XFS_MOUNT_SMALL_INUMS); + return index; +} + STATIC int xfs_blkdev_get( xfs_mount_t *mp, @@ -1038,30 +1103,6 @@ xfs_restore_resvblks(struct xfs_mount *mp) xfs_reserve_blocks(mp, &resblks, NULL); } -STATIC void -xfs_set_inode64(struct xfs_mount *mp) -{ - int i = 0; - - for (i = 0; i < mp->m_sb.sb_agcount; i++) { - struct xfs_perag *pag; - - pag = xfs_perag_get(mp, i); - pag->pagi_inodeok = 1; - pag->pagf_metadata = 0; - xfs_perag_put(pag); - } - - /* There is no need for lock protection on m_flags, - * the rw_semaphore of the VFS superblock is locked - * during mount/umount/remount operations, so this is - * enough to avoid concurency on the m_flags field - */ - mp->m_flags &= ~(XFS_MOUNT_32BITINODES | - XFS_MOUNT_SMALL_INUMS); - mp->m_maxagi = i; -} - STATIC int xfs_fs_remount( struct super_block *sb, diff --git a/fs/xfs/xfs_super.h b/fs/xfs/xfs_super.h index 09b0c26..9de4a92 100644 --- a/fs/xfs/xfs_super.h +++ b/fs/xfs/xfs_super.h @@ -75,6 +75,8 @@ struct block_device; extern __uint64_t xfs_max_file_offset(unsigned int); extern void xfs_blkdev_issue_flush(struct xfs_buftarg *); +extern xfs_agnumber_t xfs_set_inode32(struct xfs_mount *); +extern xfs_agnumber_t xfs_set_inode64(struct xfs_mount *); extern const struct export_operations xfs_export_operations; extern const struct xattr_handler *xfs_xattr_handlers[]; -- 1.7.11.4 From cmaiolino@redhat.com Thu Sep 20 08:32:22 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8KDWMdQ088933 for ; Thu, 20 Sep 2012 08:32:22 -0500 X-ASG-Debug-ID: 1348148014-04cbb07ce355d2c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id VbswWVpnWUvzDB9R for ; Thu, 20 Sep 2012 06:33:34 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8KDXY9l016416 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 20 Sep 2012 09:33:34 -0400 Received: from andromeda.usersys.redhat.com (ovpn-113-73.phx2.redhat.com [10.3.113.73]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q8KDXRt6019074 for ; Thu, 20 Sep 2012 09:33:33 -0400 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: [PATCH 4/6] xfs: Fix mp->m_maxagi update during inode64 remount Date: Thu, 20 Sep 2012 10:32:39 -0300 X-ASG-Orig-Subj: [PATCH 4/6] xfs: Fix mp->m_maxagi update during inode64 remount Message-Id: <1348147961-7520-5-git-send-email-cmaiolino@redhat.com> In-Reply-To: <1348147961-7520-1-git-send-email-cmaiolino@redhat.com> References: <1348147961-7520-1-git-send-email-cmaiolino@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1348148014 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com With the changes made on xfs_set_inode64(), to make it behave as xfs_set_inode32() (now leaving to the caller the responsibility to update mp->m_maxagi), we use the return value of xfs_set_inode64() to update mp->m_maxagi during remount. Signed-off-by: Carlos Maiolino --- fs/xfs/xfs_super.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 0c2e06f..966f56c 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -1129,7 +1129,7 @@ xfs_fs_remount( mp->m_flags &= ~XFS_MOUNT_BARRIER; break; case Opt_inode64: - xfs_set_inode64(mp); + mp->m_maxagi = xfs_set_inode64(mp); break; default: /* -- 1.7.11.4 From cmaiolino@redhat.com Thu Sep 20 08:32:23 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8KDWM78088940 for ; Thu, 20 Sep 2012 08:32:22 -0500 X-ASG-Debug-ID: 1348148015-04bdf0067e460db0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id NOab9anxY9pl213E for ; Thu, 20 Sep 2012 06:33:35 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8KDXZT4016429 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 20 Sep 2012 09:33:35 -0400 Received: from andromeda.usersys.redhat.com (ovpn-113-73.phx2.redhat.com [10.3.113.73]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q8KDXRt7019074 for ; Thu, 20 Sep 2012 09:33:34 -0400 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: [PATCH 5/6] xfs: add inode64->inode32 transition into xfs_set_inode32() Date: Thu, 20 Sep 2012 10:32:40 -0300 X-ASG-Orig-Subj: [PATCH 5/6] xfs: add inode64->inode32 transition into xfs_set_inode32() Message-Id: <1348147961-7520-6-git-send-email-cmaiolino@redhat.com> In-Reply-To: <1348147961-7520-1-git-send-email-cmaiolino@redhat.com> References: <1348147961-7520-1-git-send-email-cmaiolino@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1348148015 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com To make inode32 a remountable option, xfs_set_inode32() should be able to make a transition from inode64 option, disabling inode allocation on higher AGs. Signed-off-by: Carlos Maiolino --- fs/xfs/xfs_super.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 966f56c..3329296 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -603,6 +603,7 @@ xfs_agnumber_t xfs_set_inode32(struct xfs_mount *mp) { xfs_agnumber_t index = 0; + xfs_agnumber_t maxagi = 0; xfs_sb_t *sbp = &mp->m_sb; xfs_agnumber_t max_metadata; xfs_agino_t agino = XFS_OFFBNO_TO_AGINO(mp, sbp->sb_agblocks -1, 0); @@ -626,18 +627,26 @@ xfs_set_inode32(struct xfs_mount *mp) for (index = 0; index < sbp->sb_agcount; index++) { ino = XFS_AGINO_TO_INO(mp, index, agino); + if (ino > XFS_MAXINUMBER_32) { - index++; - break; + pag = xfs_perag_get(mp, index); + pag->pagi_inodeok = 0; + pag->pagf_metadata = 0; + xfs_perag_put(pag); + continue; } pag = xfs_perag_get(mp, index); pag->pagi_inodeok = 1; + maxagi++; if (index < max_metadata) pag->pagf_metadata = 1; xfs_perag_put(pag); } - return index; + mp->m_flags |= (XFS_MOUNT_32BITINODES | + XFS_MOUNT_SMALL_INUMS); + + return maxagi; } xfs_agnumber_t -- 1.7.11.4 From cmaiolino@redhat.com Thu Sep 20 08:32:24 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8KDWO2B088957 for ; Thu, 20 Sep 2012 08:32:24 -0500 X-ASG-Debug-ID: 1348148016-04cb6c5688490fa0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 5tgQZ7rQgtZQPSxT for ; Thu, 20 Sep 2012 06:33:36 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8KDXat9016440 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 20 Sep 2012 09:33:36 -0400 Received: from andromeda.usersys.redhat.com (ovpn-113-73.phx2.redhat.com [10.3.113.73]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q8KDXRt8019074 for ; Thu, 20 Sep 2012 09:33:35 -0400 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: [PATCH 6/6] xfs: Make inode32 a remountable option Date: Thu, 20 Sep 2012 10:32:41 -0300 X-ASG-Orig-Subj: [PATCH 6/6] xfs: Make inode32 a remountable option Message-Id: <1348147961-7520-7-git-send-email-cmaiolino@redhat.com> In-Reply-To: <1348147961-7520-1-git-send-email-cmaiolino@redhat.com> References: <1348147961-7520-1-git-send-email-cmaiolino@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1348148016 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com As inode64 is the default option now, and was also made remountable previously, inode32 can also be remounted on-the-fly when it is needed. Signed-off-by: Carlos Maiolino --- fs/xfs/xfs_super.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 3329296..545ab6f 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -122,13 +122,18 @@ mempool_t *xfs_ioend_pool; * in the future, too. */ enum { - Opt_barrier, Opt_nobarrier, Opt_inode64, Opt_err + Opt_barrier, + Opt_nobarrier, + Opt_inode64, + Opt_inode32, + Opt_err }; static const match_table_t tokens = { {Opt_barrier, "barrier"}, {Opt_nobarrier, "nobarrier"}, {Opt_inode64, "inode64"}, + {Opt_inode32, "inode32"}, {Opt_err, NULL} }; @@ -1140,6 +1145,9 @@ xfs_fs_remount( case Opt_inode64: mp->m_maxagi = xfs_set_inode64(mp); break; + case Opt_inode32: + mp->m_maxagi = xfs_set_inode32(mp); + break; default: /* * Logically we would return an error here to prevent -- 1.7.11.4 From tinguely@sgi.com Thu Sep 20 08:48:52 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8KDmpHp090996 for ; Thu, 20 Sep 2012 08:48:51 -0500 Received: from [128.162.232.125] (eagdhcp-232-125.americas.sgi.com [128.162.232.125]) by relay2.corp.sgi.com (Postfix) with ESMTP id 280B1304043; Thu, 20 Sep 2012 06:50:02 -0700 (PDT) Message-ID: <505B1F03.4070004@sgi.com> Date: Thu, 20 Sep 2012 08:49:55 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 0/3] xfs: allocation worker causes freelist buffer lock hang References: <20120919163133.097340199@sgi.com> <20120919233435.GF31501@dastard> In-Reply-To: <20120919233435.GF31501@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/19/12 18:34, Dave Chinner wrote: > I suspect the only way to fix this is to re-use the old workqueue > method of avoiding blocking on the workqueue indefinitely. That is, > if we fail to get the lock in this case, we return with EGAIN and > requeue the work. __xfs_alloc_vextent() and xfs_alloc_fix_freelist() > already have trylock support, so this should be fairly easy to do. > If I also convert the work to delayed work, I can easily add a > backoff that will prevent busy looping on the workqueue. > > I'll have a quick look at this and see what falls out.... Okay. Many of these paths are not using an allocator worker (userdata==0) and/or the loops are done within a new transaction. --Mark. From bfoster@redhat.com Thu Sep 20 08:49:57 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8KDnvTp091203 for ; Thu, 20 Sep 2012 08:49:57 -0500 X-ASG-Debug-ID: 1348149069-04bdf06cd036ca10001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id t3ACvieab6etwZX5 for ; Thu, 20 Sep 2012 06:51:09 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8KDp99G028246 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 20 Sep 2012 09:51:09 -0400 Received: from bfoster.bfoster ([10.16.225.83]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q8KDp826026189; Thu, 20 Sep 2012 09:51:08 -0400 Message-ID: <505B1F62.30105@redhat.com> Date: Thu, 20 Sep 2012 09:51:30 -0400 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:15.0) Gecko/20120827 Thunderbird/15.0 MIME-Version: 1.0 To: Carlos Maiolino CC: xfs@oss.sgi.com Subject: Re: [PATCH 0/6 V4] inode32/inode64 allocation changes References: <1348147961-7520-1-git-send-email-cmaiolino@redhat.com> X-ASG-Orig-Subj: Re: [PATCH 0/6 V4] inode32/inode64 allocation changes In-Reply-To: <1348147961-7520-1-git-send-email-cmaiolino@redhat.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1348149069 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com On 09/20/2012 09:32 AM, Carlos Maiolino wrote: > This patch set adds inode64 as the default allocation mode, but also includes 2 > patches to remove duplicated code and another one to make inode32 able to be > remounted. > > NOTE: This patch has as dependency "Make inode64 a remountable option" patch. > > V4 properly set pagf_metadata in patch 5 > Hi Carlos, With that fix, this patchset looks good to me, thanks. Reviewed-by: Brian Foster Brian > V3 has a better factoring of each patch goal, including other dchinner's > suggestions in V2. > Also it contains a fix in how m_agirotor reset is made (patch 01) that I've > found while doing tests with these patches. > > Carlos Maiolino (6): > xfs: Fix m_agirotor reset during AG selection > xfs: make inode64 as the default allocation mode > xfs: reduce code duplication handling inode32/64 options > xfs: Fix mp->m_maxagi update during inode64 remount > xfs: add inode64->inode32 transition into xfs_set_inode32() > xfs: Make inode32 a remountable option > > fs/xfs/xfs_ialloc.c | 2 +- > fs/xfs/xfs_mount.c | 43 +++---------------- > fs/xfs/xfs_super.c | 117 ++++++++++++++++++++++++++++++++++++++++------------ > fs/xfs/xfs_super.h | 2 + > 4 files changed, 99 insertions(+), 65 deletions(-) > From tinguely@sgi.com Thu Sep 20 12:36:42 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8KHagra117431 for ; Thu, 20 Sep 2012 12:36:42 -0500 Received: from [128.162.232.125] (eagdhcp-232-125.americas.sgi.com [128.162.232.125]) by relay1.corp.sgi.com (Postfix) with ESMTP id C5B958F8059; Thu, 20 Sep 2012 10:37:52 -0700 (PDT) Message-ID: <505B546A.6070105@sgi.com> Date: Thu, 20 Sep 2012 12:37:46 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 1/3] xfs: restrict allocate worker to x86_64 References: <20120919163133.097340199@sgi.com> <20120919163145.367256258@sgi.com> <20120919215405.GE31501@dastard> In-Reply-To: <20120919215405.GE31501@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/19/12 16:54, Dave Chinner wrote: > On Wed, Sep 19, 2012 at 11:31:34AM -0500, tinguely@sgi.com wrote: >> Restrict the allocation worker to X86_64 machines. This will improve >> performance on non-X86-64 machines and avoid the AGF buffer hang. >> >> Signed-off-by: Mark Tinguely > > NACK. > > The stack overflow problems that this works around are not limited > to x86-64. In the past we've seen overflows on i686 (even with 8k > stacks), s390 and other platforms, so it's not an isolated issue. > > It either works or it doesn't - let's not start down the rathole of > having different code paths and behaviours for different platforms. > > Cheers, > > Dave. Well, I was expecting a 4 letter word from Dave on this patch and "NACK" was surprisingly mild. When the allocation worker was placed into XFS, even Christoph wanted a kernel configure switch to be able turn it off. Dave has already placed a switch in the code that turns it off for over half of the direct callers xfs_alloc_vextent() because a performance issue. We are just finding places where it causes serious issues. This is worker is an "necessary evil" (I think those were Christoph's review comment). We should limit the evil to where it is necessary. --Mark. From tinguely@sgi.com Thu Sep 20 13:21:05 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.5 required=5.0 tests=BAYES_00,J_CHICKENPOX_42, J_CHICKENPOX_45,J_CHICKENPOX_52,J_CHICKENPOX_54 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8KIL5Lm121041 for ; Thu, 20 Sep 2012 13:21:05 -0500 Received: from eagdhcp-232-125.americas.sgi.com (eagdhcp-232-125.americas.sgi.com [128.162.232.125]) by relay2.corp.sgi.com (Postfix) with ESMTP id DD7C6304062 for ; Thu, 20 Sep 2012 11:22:15 -0700 (PDT) Received: from eagdhcp-232-125.americas.sgi.com (localhost [127.0.0.1]) by eagdhcp-232-125.americas.sgi.com (8.14.5/8.14.5) with ESMTP id q8KIM9At013398 for ; Thu, 20 Sep 2012 13:22:09 -0500 (CDT) (envelope-from tinguely@sgi.com) Received: (from tinguely@localhost) by eagdhcp-232-125.americas.sgi.com (8.14.5/8.14.5/Submit) id q8KIM9gq013397 for xfs@oss.sgi.com; Thu, 20 Sep 2012 13:22:09 -0500 (CDT) (envelope-from tinguely@sgi.com) X-Authentication-Warning: eagdhcp-232-125.americas.sgi.com: tinguely set sender to tinguely@sgi.com using -f Message-Id: <20120920181650.041917183@sgi.com> User-Agent: quilt/0.51-1 Date: Thu, 20 Sep 2012 13:16:45 -0500 From: Mark Tinguely To: xfs@oss.sgi.com Subject: [PATCH 3/3 v2] xfs: zero allocation_args on the kernel stack References: <20120919163133.097340199@sgi.com> <20120919163145.587098223@sgi.com> Content-Disposition: inline; filename=3-3-v2_xfs-zero_allocation_args.patch Zero the kernel stack space that makes up the xfs_alloc_arg structures. Signed-off-by: Mark Tinguely --- fs/xfs/xfs_alloc.c | 1 + fs/xfs/xfs_bmap.c | 3 +++ fs/xfs/xfs_ialloc.c | 1 + 3 files changed, 5 insertions(+) Index: b/fs/xfs/xfs_alloc.c =================================================================== --- a/fs/xfs/xfs_alloc.c +++ b/fs/xfs/xfs_alloc.c @@ -1866,6 +1866,7 @@ xfs_alloc_fix_freelist( /* * Initialize the args structure. */ + memset(&targs, 0, sizeof(targs)); targs.tp = tp; targs.mp = mp; targs.agbp = agbp; Index: b/fs/xfs/xfs_bmap.c =================================================================== --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c @@ -2437,6 +2437,7 @@ xfs_bmap_btalloc( * Normal allocation, done through xfs_alloc_vextent. */ tryagain = isaligned = 0; + memset(&args, 0, sizeof(args)); args.tp = ap->tp; args.mp = mp; args.fsbno = ap->blkno; @@ -3082,6 +3083,7 @@ xfs_bmap_extents_to_btree( * Convert to a btree with two levels, one record in root. */ XFS_IFORK_FMT_SET(ip, whichfork, XFS_DINODE_FMT_BTREE); + memset(&args, 0, sizeof(args)); args.tp = tp; args.mp = mp; args.firstblock = *firstblock; @@ -3237,6 +3239,7 @@ xfs_bmap_local_to_extents( xfs_buf_t *bp; /* buffer for extent block */ xfs_bmbt_rec_host_t *ep;/* extent record pointer */ + memset(&args, 0, sizeof(args)); args.tp = tp; args.mp = ip->i_mount; args.firstblock = *firstblock; Index: b/fs/xfs/xfs_ialloc.c =================================================================== --- a/fs/xfs/xfs_ialloc.c +++ b/fs/xfs/xfs_ialloc.c @@ -250,6 +250,7 @@ xfs_ialloc_ag_alloc( /* boundary */ struct xfs_perag *pag; + memset(&args, 0, sizeof(args)); args.tp = tp; args.mp = tp->t_mountp; From david@fromorbit.com Thu Sep 20 17:37:45 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8KMbiF0142679 for ; Thu, 20 Sep 2012 17:37:45 -0500 X-ASG-Debug-ID: 1348180735-04bdf06cd03b7090001-NocioJ Received: from ipmail06.adl2.internode.on.net (ipmail06.adl2.internode.on.net [150.101.137.129]) by cuda.sgi.com with ESMTP id NMbxkNtwwFhV4LHs for ; Thu, 20 Sep 2012 15:38:56 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.129 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AmIRAIaYW1B5LC9S/2dsb2JhbABFhSK3HQEBAYECgQmCIAEBBAE6HCMFCwgDGC4UJQMhE4d9BbogFIsIgQVPbIQCA5VjkCKCeQ Received: from ppp121-44-47-82.lns20.syd6.internode.on.net (HELO dastard) ([121.44.47.82]) by ipmail06.adl2.internode.on.net with ESMTP; 21 Sep 2012 08:08:54 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TEpOW-0005Rs-CD; Fri, 21 Sep 2012 08:38:52 +1000 Date: Fri, 21 Sep 2012 08:38:52 +1000 From: Dave Chinner To: Spelic Cc: xfs@oss.sgi.com Subject: Re: Questions on RAID alignment Message-ID: <20120920223852.GI31501@dastard> X-ASG-Orig-Subj: Re: Questions on RAID alignment References: <505AF9EA.7030603@shiftmail.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <505AF9EA.7030603@shiftmail.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl2.internode.on.net[150.101.137.129] X-Barracuda-Start-Time: 1348180735 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109115 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Sep 20, 2012 at 01:11:38PM +0200, Spelic wrote: > Hello list > a few questions > > 1- Does XFS support alignment to concatenation RAIDs (e.g. linear > over raid1) similarly to striped ones? No. It's being considered and I know how to do it, but it's lower priority than other stuff I'm working on at the moment. > I am guessing probably su and > sw should not be specified and the agcount should be multiple of the > number of the concatenated devices, is that correct? If you are concatenating RAID0/5/6, then you shoul duse su/sw as per the alignment of the volumes being concatenated. > 2- Can mkfs parameters be altered after creation, e.g. after growing > a RAID and then growing the XFS fs, can I also alter su, sw, agcount > somehow? You can alter su/sw as a mount option if the filesystem was made with them initially. > 3- I seem to remember there was an xattr that one could attach to > /home (if /home was under XFS) so that every user (subdir of /home) > would get a different AG in a different RAID device. I cannot find > that information anymore on the internet; could you refresh my mind? Nothing of the sort. if you are using the inode64 allocator, then each new directory is placed i a different AG. That's as good as it gets right now. Cheers, Dave. -- Dave Chinner david@fromorbit.com From stan@hardwarefreak.com Thu Sep 20 18:10:42 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_43 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8KNAf7j146277 for ; Thu, 20 Sep 2012 18:10:42 -0500 X-ASG-Debug-ID: 1348182714-04cb6c56864b75c0001-NocioJ Received: from greer.hardwarefreak.com (mo-65-41-216-221.sta.embarqhsd.net [65.41.216.221]) by cuda.sgi.com with ESMTP id gTKXwrfrzd9ytH4i for ; Thu, 20 Sep 2012 16:11:54 -0700 (PDT) X-Barracuda-Envelope-From: stan@hardwarefreak.com X-Barracuda-Apparent-Source-IP: 65.41.216.221 X-Barracuda-User-Whitelist: xfs@oss.sgi.com Received: from [192.168.100.53] (gffx.hardwarefreak.com [192.168.100.53]) by greer.hardwarefreak.com (Postfix) with ESMTP id 442F26C058; Thu, 20 Sep 2012 18:11:54 -0500 (CDT) Message-ID: <505BA2B8.6030303@hardwarefreak.com> Date: Thu, 20 Sep 2012 18:11:52 -0500 From: Stan Hoeppner Reply-To: stan@hardwarefreak.com User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:15.0) Gecko/20120907 Thunderbird/15.0.1 MIME-Version: 1.0 To: Spelic CC: xfs@oss.sgi.com Subject: Re: Questions on RAID alignment References: <505AF9EA.7030603@shiftmail.org> X-ASG-Orig-Subj: Re: Questions on RAID alignment In-Reply-To: <505AF9EA.7030603@shiftmail.org> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: mo-65-41-216-221.sta.embarqhsd.net[65.41.216.221] X-Barracuda-Start-Time: 1348182714 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com On 9/20/2012 6:11 AM, Spelic wrote: > Hello list > a few questions > > 1- Does XFS support alignment to concatenation RAIDs (e.g. linear over > raid1) similarly to striped ones? XFS has a stripe alignment feature for writeout of metadata and data. It is used to optimize writeout to striped devices. If you concatenate striped arrays then you can use XFS stripe alignment, AS LONG AS EACH ALLOCATION GROUP IS WHOLLY CONTAINED WITHIN A CONCAT MEMBER ARRAY, and doesn't cross concat member boundaries. Thus, more consideration and planning must go into designing such a storage stack. In this situation you will need to specify agcount manually so AGs don't spill over boundaries. Drive size and array configuration will dictate how many AGs you need to use. > I am guessing probably su and sw > should not be specified and the agcount should be multiple of the number > of the concatenated devices, is that correct? If your concat member devices are mirrors, then you don't specify su/sw. If they are striped arrays, you would specify su/sw as you would if using just one of those striped arrays. Again, in the latter case your AGs must not spill. For example: 24x 300GB SAS drive FC SAN box, 4x 6 drive RAID6, 1.2TB/concat member. Max agsize is 1TB, not evenly divisible into 1.2TB. Specify su/sw to match the RAID6 parms. Specify agcount of 16. Each AG is fully contained within a concat device. 12x 3TB drive JBOD on RAID card, 2x 6 drive RAID6, 12TB/concat member. Max agsize is 1TB, evenly divisible into 12TB. Specify su/sw to match RAID6 parms. Specify agcount of 24. Each AG is fully contained within a concat device. > 2- Can mkfs parameters be altered after creation, e.g. after growing a > RAID and then growing the XFS fs, can I also alter su, sw, agcount somehow? mkfs parms can't be altered, but the XFS writeout geometry can with mount options. See 'man mount'. However, if you're using striped arrays as concat members, you must expand the concat with identical striped array members so your geometry remains the same. Thus you won't modify su/sw because they haven't changed. xfs_growfs will create new AGs in the new space made available by adding a new device (array) to the concat. NOTE that xfs_growfs doesn't allow manual control of agcount as mkfs.xfs does. However, if you expand your concat only one array at a time, it shouldn't matter how many AGs are created, as they will all be contained within that concat member array, and thus su/sw parms are still correct. If you add 2 or more arrays to the concat the grow operation may spill AGs across member boundaries. > 3- I seem to remember there was an xattr that one could attach to /home > (if /home was under XFS) so that every user (subdir of /home) would get > a different AG in a different RAID device. I cannot find that > information anymore on the internet; could you refresh my mind? What you're referring to is the inode64 mount option. Every directory created in the XFS will go into the next AG, round robin, until you hit the last AG, then it wraps back to AG0, rinse, repeat. There is no way to control what dirs get created on what RAID devices within a concat, but for the techniques I described above. -- Stan From tiwarikanand@gmail.com Thu Sep 20 19:39:47 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.6 required=5.0 tests=BAYES_05,FREEMAIL_FROM, HTML_MESSAGE,J_CHICKENPOX_63,T_DKIM_INVALID,T_TO_NO_BRKTS_FREEMAIL autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8L0dkeN151324 for ; Thu, 20 Sep 2012 19:39:46 -0500 X-ASG-Debug-ID: 1348188058-04bdf0067c4b50b0001-NocioJ Received: from mail-vb0-f53.google.com (mail-vb0-f53.google.com [209.85.212.53]) by cuda.sgi.com with ESMTP id vxPMHxojC1DnYc3D (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 20 Sep 2012 17:40:59 -0700 (PDT) X-Barracuda-Envelope-From: tiwarikanand@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.212.53 X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.53] Received: by vbbfc21 with SMTP id fc21so3299675vbb.26 for ; Thu, 20 Sep 2012 17:40:58 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.53] X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.53] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:date:message-id:subject:from:to:content-type; bh=qmo4pKPcahyNk69pG5FZwbUSH69pwnz74Z5pxeMU+Ug=; b=dPx51fMuUCrqXZI05GQwzV8z5oNuRrhvFSIGCuHa+HOG6Bt7hWNpMUZqQ+vnz6DDew wyrRRg0uuSX7ZUXvejdbF6vfqG8l5qN+YraXsUyXyHai8q+Y40gDRjSPn305fMX+PfQR xcpocfKawrPsKdk2FQFdsK4+ieiK/EjqCrogqei2qd5+GW0saWbeUBtI9loU7/3MRDwB Sgxv2nCevMNqQcaS4YXw5xJv/L1+saRj8csf2Qp4NX7eEkZMER2NFjd78BrXKcsr7GuH btc9yV1XlvWtthN40tTieswYZenxzlbkgnbsRpvY+apIGK6WRwMnkIuoHidryQQiMDNF vByw== MIME-Version: 1.0 Received: by 10.52.19.198 with SMTP id h6mr1654396vde.78.1348188058478; Thu, 20 Sep 2012 17:40:58 -0700 (PDT) Received: by 10.58.35.10 with HTTP; Thu, 20 Sep 2012 17:40:58 -0700 (PDT) Date: Thu, 20 Sep 2012 18:40:58 -0600 Message-ID: Subject: xfs_repair deleting realtime files. From: Anand Tiwari X-ASG-Orig-Subj: xfs_repair deleting realtime files. To: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=20cf307ca01c50e6ce04ca2b7e4b X-Barracuda-Connect: mail-vb0-f53.google.com[209.85.212.53] X-Barracuda-Start-Time: 1348188059 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109123 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message --20cf307ca01c50e6ce04ca2b7e4b Content-Type: text/plain; charset=ISO-8859-1 Hi All, I have been looking into an issue with xfs_repair with realtime sub volume. some times while running xfs_repair I see following errors ---------------------------- data fork in rt inode 134 claims used rt block 19607 bad data fork in inode 134 would have cleared inode 134 data fork in rt inode 135 claims used rt block 29607 bad data fork in inode 135 would have cleared inode 135 - agno = 1 - agno = 2 - agno = 3 - process newly discovered inodes... Phase 4 - check for duplicate blocks... - setting up duplicate extent list... - check for inodes claiming duplicate blocks... - agno = 0 - agno = 1 - agno = 2 - agno = 3 entry "test-011" in shortform directory 128 references free inode 134 would have junked entry "test-011" in directory inode 128 entry "test-0" in shortform directory 128 references free inode 135 would have junked entry "test-0" in directory inode 128 data fork in rt ino 134 claims dup rt extent,off - 0, start - 7942144, count 2097000 bad data fork in inode 134 would have cleared inode 134 data fork in rt ino 135 claims dup rt extent,off - 0, start - 13062144, count 2097000 bad data fork in inode 135 would have cleared inode 135 No modify flag set, skipping phase 5 ------------------------ Here is the bmap for both inodes. xfs_db> inode 135 xfs_db> bmap data offset 0 startblock 13062144 (12/479232) count 2097000 flag 0 data offset 2097000 startblock 15159144 (14/479080) count 2097000 flag 0 data offset 4194000 startblock 17256144 (16/478928) count 2097000 flag 0 data offset 6291000 startblock 19353144 (18/478776) count 2097000 flag 0 data offset 8388000 startblock 21450144 (20/478624) count 2097000 flag 0 data offset 10485000 startblock 23547144 (22/478472) count 2097000 flag 0 data offset 12582000 startblock 25644144 (24/478320) count 2097000 flag 0 data offset 14679000 startblock 27741144 (26/478168) count 2097000 flag 0 data offset 16776000 startblock 29838144 (28/478016) count 2097000 flag 0 data offset 18873000 startblock 31935144 (30/477864) count 1607000 flag 0 xfs_db> inode 134 xfs_db> bmap data offset 0 startblock 7942144 (7/602112) count 2097000 flag 0 data offset 2097000 startblock 10039144 (9/601960) count 2097000 flag 0 data offset 4194000 startblock 12136144 (11/601808) count 926000 flag 0 by looking into xfs_repair code, it looks like repair does not handle a case where we have more than one extent in a real-time extent. following is code from repair/dinode.c: process_rt_rec ----- for (b = irec->br_startblock; b < irec->br_startblock + irec->br_blockcount; b += mp->m_sb.sb_rextsize) { ext = (xfs_drtbno_t) b / mp->m_sb.sb_rextsize; pwe = xfs_sb_version_hasextflgbit(&mp->m_sb) && irec->br_state == XFS_EXT_UNWRITTEN && (b % mp->m_sb.sb_rextsize != 0); ----- In my case rextsize is 512 (512 * 4096 = 2mb). So we have multiple extents (written extents to be precise, thanks dchinner for that), value of "ext" will be same for all of them and xfs_repair does not like it. thus the error message ""data fork in rt inode XX claims used rt block XX". If I ignore this failure condition, xfs_repairs seems to be happy. (FYI: this file-system is cleanly umounted) But in my opinion, its not good as these multiple extents can overlap too. Should we be using XR_E_MULT to flag and keep track of duplicated real-time extents. (maybe use the present API for adding/detecting duplicate extents) I am open of suggestion or comments on how to fix this. xfs_repair version is 3.1.8 and kernel 2.6.37. thanks, Anand --20cf307ca01c50e6ce04ca2b7e4b Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Hi All,

I have been looking into an issue with xfs_repair with realt= ime sub volume. some times while running xfs_repair I see following errors =

----------------------------
data fork in rt inode 134 claims us= ed rt block 19607
bad data fork in inode 134
would have cleared inode 134
data fork in = rt inode 135 claims used rt block 29607
bad data fork in inode 135
wo= uld have cleared inode 135
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 1
=A0=A0= =A0=A0=A0=A0=A0 - agno =3D 2
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 3
=A0=A0=A0=A0=A0=A0=A0 - process newly= discovered inodes...
Phase 4 - check for duplicate blocks...
=A0=A0= =A0=A0=A0=A0=A0 - setting up duplicate extent list...
=A0=A0=A0=A0=A0=A0= =A0 - check for inodes claiming duplicate blocks...
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 0
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 1=A0=A0=A0=A0=A0=A0=A0 - agno =3D 2
=A0=A0=A0=A0=A0=A0=A0 - agno =3D 3entry "test-011" in shortform directory 128 references free ino= de 134
would have junked entry "test-011" in directory inode 1= 28
entry "test-0" in shortform directory 128 references free inode 1= 35
would have junked entry "test-0" in directory inode 128
= data fork in rt ino 134 claims dup rt extent,off - 0, start - 7942144, coun= t 2097000
bad data fork in inode 134
would have cleared inode 134
data fork in = rt ino 135 claims dup rt extent,off - 0, start - 13062144, count 2097000bad data fork in inode 135
would have cleared inode 135
No modify fl= ag set, skipping phase 5
------------------------

Here is the bmap for both inodes.

x= fs_db> inode 135
xfs_db> bmap
data offset 0 startblock 13062144= (12/479232) count 2097000 flag 0
data offset 2097000 startblock 1515914= 4 (14/479080) count 2097000 flag 0
data offset 4194000 startblock 17256144 (16/478928) count 2097000 flag 0data offset 6291000 startblock 19353144 (18/478776) count 2097000 flag 0data offset 8388000 startblock 21450144 (20/478624) count 2097000 flag 0<= br> data offset 10485000 startblock 23547144 (22/478472) count 2097000 flag 0data offset 12582000 startblock 25644144 (24/478320) count 2097000 flag 0=
data offset 14679000 startblock 27741144 (26/478168) count 2097000 flag= 0
data offset 16776000 startblock 29838144 (28/478016) count 2097000 flag 0data offset 18873000 startblock 31935144 (30/477864) count 1607000 flag 0=
xfs_db> inode 134
xfs_db> bmap
data offset 0 startblock 794= 2144 (7/602112) count 2097000 flag 0
data offset 2097000 startblock 10039144 (9/601960) count 2097000 flag 0
= data offset 4194000 startblock 12136144 (11/601808) count 926000 flag 0
=

by looking into xfs_repair code, it looks like repair does not hand= le a case where we have more than one extent in a real-time extent.
following is code from repair/dinode.c: process_rt_rec

-----
=A0= =A0=A0=A0 for (b =3D irec->br_startblock; b < irec->br_startblock = +=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0
=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 irec-= >br_blockcount; b +=3D mp->m_sb.sb_rextsize)=A0 {=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0
=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 ext =3D (xfs_drtbno_t) b / mp->m_sb= .sb_rextsize;=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0
=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 pwe =3D xfs_sb_version_hasext= flgbit(&mp->m_sb) &&=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0 irec->br_state =3D=3D XFS_EXT_UNWRITTEN &&= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0
=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0 (b % mp->m_sb.sb_rextsize !=3D 0);=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0
-----

In my case rextsize is 512 (51= 2 * 4096 =3D 2mb). So we have multiple extents (written extents to be preci= se, thanks dchinner for that), value of "ext" will be same for al= l of them and xfs_repair does not like it. thus the error message "&qu= ot;data fork in rt inode XX claims used rt block XX".

If I ignore this failure condition, xfs_repairs seems to be happy. (FYI= : this file-system is cleanly umounted)
But in my opinion, its not good = as these multiple extents can overlap too.

Should we be using XR_E_= MULT to flag and keep track of duplicated real-time extents. (maybe use the= present API for adding/detecting duplicate extents)

I am open of suggestion or comments on how to fix this.

xfs_rep= air version is 3.1.8 and kernel 2.6.37.

thanks,
Anand

--20cf307ca01c50e6ce04ca2b7e4b-- From raghu.prabhu13@gmail.com Thu Sep 20 23:53:00 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_DKIM_INVALID,T_TO_NO_BRKTS_FREEMAIL autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8L4r0ur173209 for ; Thu, 20 Sep 2012 23:53:00 -0500 X-ASG-Debug-ID: 1348203252-04bdf0067e4c3060001-NocioJ Received: from mail-pb0-f53.google.com (mail-pb0-f53.google.com [209.85.160.53]) by cuda.sgi.com with ESMTP id nTnDKFqdNcVQUAtf (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 20 Sep 2012 21:54:13 -0700 (PDT) X-Barracuda-Envelope-From: raghu.prabhu13@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.160.53 X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.53] Received: by pbbrp16 with SMTP id rp16so7563526pbb.26 for ; Thu, 20 Sep 2012 21:54:12 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.53] X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.53] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:x-mailer; bh=wSpl6e4rQvlAmnVuLW40M22ULTRFR++Vi/Ut6zDH52g=; b=EeqUTkJZ+kbVS/iGMyc0x+qIJyPvNHGessTI6JobNroFlFDGNQpaBxkJ5rKNXRkbtM ObTzzIzRa5zzY9efirmI9Entodmwd9UDxDaFM2vVi5Dwb9csLUI/XCQY8f2KepDG74YR RDbUQz0gLOvIN5BsV8E0suyZAFXDH0zEFHTAQ/1RkCKS7ZWVUminoqo4jGGVnvYucvqI 0xEs+r8qEuQd7TNVzhsOdTQUNbzmW1bOB2M9su0gLS+IOCXmYVqnNuk6wHi66RCVqgfw uiLbuTY7uGuDNj5ZSjaj0WIoDXpqqbMNt9kH6vparnReYzkeY7LS4urafQLWLqjYeZTJ aZ5w== Received: by 10.68.217.69 with SMTP id ow5mr12344782pbc.35.1348203252662; Thu, 20 Sep 2012 21:54:12 -0700 (PDT) Received: from localhost ([122.166.180.54]) by mx.google.com with ESMTPS id jz10sm4557153pbc.8.2012.09.20.21.54.10 (version=TLSv1/SSLv3 cipher=OTHER); Thu, 20 Sep 2012 21:54:11 -0700 (PDT) From: raghu.prabhu13@gmail.com To: david@fromorbit.com Cc: xfs@oss.sgi.com, Raghavendra D Prabhu Subject: [PATCH v6] Stop periodic syncing if filesystem is already shutdown. Date: Fri, 21 Sep 2012 10:24:04 +0530 X-ASG-Orig-Subj: [PATCH v6] Stop periodic syncing if filesystem is already shutdown. Message-Id: <143becf0f8266fbc8025ec97c8f44476d8fcafc5.1348203015.git.rprabhu@wnohang.net> X-Mailer: git-send-email 1.7.12.1 X-Barracuda-Connect: mail-pb0-f53.google.com[209.85.160.53] X-Barracuda-Start-Time: 1348203252 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, DKIM_SIGNED, DKIM_VERIFIED, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109141 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature From: Raghavendra D Prabhu This is to prevent xfs_log_force from printing error message continuously (due to xfs_sync and others) till umount if the disk has been forcefully unplugged. This is to prevent messages like these from being displayed repeatedly. [ 3873.009329] XFS (sdb3): xfs_log_force: error 5 returned. Note, that even after xfs_do_force_shutdown has been called, xfs_log_force doesn't stop till the filesystem has been unmounted (and it keeps printing "error 5 returned" to kernel log). To fix this, added condition over XFS_FORCED_SHUTDOWN to xfs_log_force and xfs_fs_sync_fs. To simulate it, mount an xfs filesystem located on external disk, and then pull the power to the disk. Now, the dmesg looks, [ 268.307303] XFS (sdb2): xfs_do_force_shutdown(0x1) called from line 1031 of file fs/xfs/xfs_buf.c. Return address = 0xffffffff8127c13a [ 268.307318] XFS (sdb2): I/O Error Detected. Shutting down filesystem [ 268.307323] XFS (sdb2): Please umount the filesystem and rectify the problem(s) Version 1: Removed calling xfs_syncd_stop from xfs_sync_worker. Version 2: Removed calling xfs_fs_writable in xfs_sync_worker and xfs_flush_worker. Version 3: Removed calling xfs_syncd_stop in xfs_bwrite. Version 4: Added return statements to xfs_log_force and xfs_fs_sync_fs. Version 5: As per suggestion, removed EIO return in xfs_log_force. Signed-off-by: Raghavendra D Prabhu --- fs/xfs/xfs_log.c | 5 ++++- fs/xfs/xfs_super.c | 4 ++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 7f4f937..161c925 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -3002,7 +3002,10 @@ xfs_log_force( trace_xfs_log_force(mp, 0); error = _xfs_log_force(mp, flags, NULL); - if (error) + /* + * Avoid warning when the filesystem has already shutdown. + */ + if (error && !XFS_FORCED_SHUTDOWN(mp)) xfs_warn(mp, "%s: error %d returned.", __func__, error); } diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 19e2380..8df3387 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -944,6 +944,10 @@ xfs_fs_sync_fs( if (!wait) return 0; + if (XFS_FORCED_SHUTDOWN(mp)) { + return XFS_ERROR(EIO); + } + error = xfs_quiesce_data(mp); if (error) return -error; -- 1.7.12.1 From sandeen@sandeen.net Thu Sep 20 23:59:01 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_63 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8L4x0MN173752 for ; Thu, 20 Sep 2012 23:59:01 -0500 X-ASG-Debug-ID: 1348203613-04bdf0067c4c3520001-NocioJ Received: from mail.sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id oKJ1D3u6JIoIFnWO for ; Thu, 20 Sep 2012 22:00:13 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) (Authenticated sender: sandeen) by mail.sandeen.net (Postfix) with ESMTP id 6A3FD4964601; Fri, 21 Sep 2012 00:00:13 -0500 (CDT) Message-ID: <505BF45D.5050909@sandeen.net> Date: Fri, 21 Sep 2012 00:00:13 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20120907 Thunderbird/15.0.1 MIME-Version: 1.0 To: Anand Tiwari CC: xfs@oss.sgi.com Subject: Re: xfs_repair deleting realtime files. References: X-ASG-Orig-Subj: Re: xfs_repair deleting realtime files. In-Reply-To: X-Enigmail-Version: 1.4.4 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1348203613 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109141 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 9/20/12 7:40 PM, Anand Tiwari wrote: > Hi All, > > I have been looking into an issue with xfs_repair with realtime sub volume. some times while running xfs_repair I see following errors > > ---------------------------- > data fork in rt inode 134 claims used rt block 19607 > bad data fork in inode 134 > would have cleared inode 134 > data fork in rt inode 135 claims used rt block 29607 > bad data fork in inode 135 > would have cleared inode 135 > - agno = 1 > - agno = 2 > - agno = 3 > - process newly discovered inodes... > Phase 4 - check for duplicate blocks... > - setting up duplicate extent list... > - check for inodes claiming duplicate blocks... > - agno = 0 > - agno = 1 > - agno = 2 > - agno = 3 > entry "test-011" in shortform directory 128 references free inode 134 > would have junked entry "test-011" in directory inode 128 > entry "test-0" in shortform directory 128 references free inode 135 > would have junked entry "test-0" in directory inode 128 > data fork in rt ino 134 claims dup rt extent,off - 0, start - 7942144, count 2097000 > bad data fork in inode 134 > would have cleared inode 134 > data fork in rt ino 135 claims dup rt extent,off - 0, start - 13062144, count 2097000 > bad data fork in inode 135 > would have cleared inode 135 > No modify flag set, skipping phase 5 > ------------------------ > > Here is the bmap for both inodes. > > xfs_db> inode 135 > xfs_db> bmap > data offset 0 startblock 13062144 (12/479232) count 2097000 flag 0 > data offset 2097000 startblock 15159144 (14/479080) count 2097000 flag 0 > data offset 4194000 startblock 17256144 (16/478928) count 2097000 flag 0 > data offset 6291000 startblock 19353144 (18/478776) count 2097000 flag 0 > data offset 8388000 startblock 21450144 (20/478624) count 2097000 flag 0 > data offset 10485000 startblock 23547144 (22/478472) count 2097000 flag 0 > data offset 12582000 startblock 25644144 (24/478320) count 2097000 flag 0 > data offset 14679000 startblock 27741144 (26/478168) count 2097000 flag 0 > data offset 16776000 startblock 29838144 (28/478016) count 2097000 flag 0 > data offset 18873000 startblock 31935144 (30/477864) count 1607000 flag 0 > xfs_db> inode 134 > xfs_db> bmap > data offset 0 startblock 7942144 (7/602112) count 2097000 flag 0 > data offset 2097000 startblock 10039144 (9/601960) count 2097000 flag 0 > data offset 4194000 startblock 12136144 (11/601808) count 926000 flag 0 It's been a while since I thought about realtime, but - That all seems fine, I don't see anything overlapping there, they are all perfectly adjacent, though of interesting size. > > by looking into xfs_repair code, it looks like repair does not handle > a case where we have more than one extent in a real-time extent. > following is code from repair/dinode.c: process_rt_rec "more than one extent in a real-time extent?" I'm not sure what that means. Every extent above is length 2097000 blocks, and they are adjacent. But you say your realtime extent size is 512 blocks ... which doesn't go into 2097000 evenly. So that's odd, at least. Can you provide your xfs_info output for this fs? Or maybe better yet an xfs_metadump image. > ----- > for (b = irec->br_startblock; b < irec->br_startblock + > irec->br_blockcount; b += mp->m_sb.sb_rextsize) { > ext = (xfs_drtbno_t) b / mp->m_sb.sb_rextsize; > pwe = xfs_sb_version_hasextflgbit(&mp->m_sb) && > irec->br_state == XFS_EXT_UNWRITTEN && > (b % mp->m_sb.sb_rextsize != 0); > ----- > > In my case rextsize is 512 (512 * 4096 = 2mb). So we have multiple > extents (written extents to be precise, thanks dchinner for that), > value of "ext" will be same for all of them and xfs_repair does not > like it. thus the error message ""data fork in rt inode XX claims > used rt block XX". "ext" should not be the same for all of them; ext is the realtime extent number in the fs, based on the physical start, br_startblock, divided by the rt extent size. There shouldn't be duplicate values of "ext" based on the bmaps above. The error comes from search_rt_dup_extent() which looks for overlaps elsewhere in the fs... If you can provide a metadump of the fs it might be easier to see what's going on. -Eric > If I ignore this failure condition, xfs_repairs seems to be happy. > (FYI: this file-system is cleanly umounted) But in my opinion, its > not good as these multiple extents can overlap too. > Should we be using XR_E_MULT to flag and keep track of duplicated > real-time extents. (maybe use the present API for adding/detecting > duplicate extents) > > I am open of suggestion or comments on how to fix this. > > xfs_repair version is 3.1.8 and kernel 2.6.37. > > thanks, > Anand > > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From raghu.prabhu13@gmail.com Fri Sep 21 02:15:39 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.7 required=5.0 tests=BAYES_00,FREEMAIL_FROM, J_CHICKENPOX_21,T_DKIM_INVALID,URI_OBFU_WWW autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8L7FdcJ183968 for ; Fri, 21 Sep 2012 02:15:39 -0500 X-ASG-Debug-ID: 1348211811-04cbb07ce45b6070001-NocioJ Received: from mail-pb0-f53.google.com (mail-pb0-f53.google.com [209.85.160.53]) by cuda.sgi.com with ESMTP id B3uFLi0CDBnxEwOP (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 21 Sep 2012 00:16:52 -0700 (PDT) X-Barracuda-Envelope-From: raghu.prabhu13@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.160.53 X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.53] Received: by pbbrp16 with SMTP id rp16so7879903pbb.26 for ; Fri, 21 Sep 2012 00:16:51 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.53] X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.53] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=date:from:to:cc:subject:message-id:mail-followup-to:references :mime-version:content-type:content-disposition:in-reply-to :x-operating-system:x-editor:user-agent; bh=XBQaclQLdgsL6573qx4X/vAtRnNTeytE2Sin/1WMCH0=; b=SLdqabwLLo6gbyuZeJsDvGi5FP7WoStcT+ABMsBq0nAEBJ/ZVZthafSFqAw1PDW+Pu u7O9i0pIdTEdvKGPaTQ9e+WM1Uf3Hr3x4AzVUu631XEDmip10F0dxUv0axZzxHpQ4SHD 46gzy+fjlCXAa+LqgxFOeJ/OkXYwNnBaNa7Q2mmG6cHItXfh8yEaYF+JPoU/snrsqMXo J9GJJ6wm5wE5USLjIOco1lRarnDePJunfItPdVYipFixXR5ZtgyKyGa7LAfBFslNJuUa Ete2RqXslGBhAMe7HGHh55lwbFzDJLVBKOj558ZacsccbW04MI2pHwiQA0WB9qakmAzk X28w== Received: by 10.68.135.39 with SMTP id pp7mr12964565pbb.127.1348211811639; Fri, 21 Sep 2012 00:16:51 -0700 (PDT) Received: from localhost ([223.228.17.142]) by mx.google.com with ESMTPS id it10sm4721670pbc.53.2012.09.21.00.16.48 (version=TLSv1/SSLv3 cipher=OTHER); Fri, 21 Sep 2012 00:16:50 -0700 (PDT) Date: Fri, 21 Sep 2012 12:46:44 +0530 From: Raghavendra D Prabhu To: Dave Chinner Cc: xfs@oss.sgi.com, Ben Myers , Alex Elder Subject: Re: Re: [PATCH 3/3] XFS: Print error when unable to allocate inodes or out of free inodes. Message-ID: <20120921071644.GA20650@Archie> X-ASG-Orig-Subj: Re: Re: [PATCH 3/3] XFS: Print error when unable to allocate inodes or out of free inodes. Mail-Followup-To: Dave Chinner , xfs@oss.sgi.com, Ben Myers , Alex Elder References: <93d9b37ce9ad720e14e2f9311e623a8e3e3139f5.1347396641.git.rprabhu@wnohang.net> <20120911232144.GH11511@dastard> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="opJtzjQTFsWo+cga" Content-Disposition: inline In-Reply-To: <20120911232144.GH11511@dastard> X-Operating-System: Arch linux x86_64 3.6.0-rc6-XLE X-Editor: VIM - Vi IMproved 7.3 User-Agent: Mutt/1.5.21 (2011-07-01) X-Barracuda-Connect: mail-pb0-f53.google.com[209.85.160.53] X-Barracuda-Start-Time: 1348211812 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.83 X-Barracuda-Spam-Status: No, SCORE=0.83 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, MARKETING_SUBJECT, RCVD_ILLEGAL_IP X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109148 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words 0.23 RCVD_ILLEGAL_IP Received: contains illegal IP address -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature --opJtzjQTFsWo+cga Content-Type: text/plain; charset=us-ascii; format=flowed Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hi, * On Wed, Sep 12, 2012 at 09:21:44AM +1000, Dave Chinner wrote: >On Wed, Sep 12, 2012 at 03:43:24AM +0530, raghu.prabhu13@gmail.com wrote: >> From: Raghavendra D Prabhu >> >> When xfs_dialloc is unable to allocate required number of inodes or ther= e are no >> AGs with free inodes, printk the error in ratelimited manner. >> >> Signed-off-by: Raghavendra D Prabhu >> --- >> fs/xfs/xfs_ialloc.c | 19 +++++++++++++++---- >> 1 file changed, 15 insertions(+), 4 deletions(-) >> >> diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c >> index e75a39d..034131b 100644 >> --- a/fs/xfs/xfs_ialloc.c >> +++ b/fs/xfs/xfs_ialloc.c >> @@ -990,8 +990,11 @@ xfs_dialloc( >> goto out_error; >> >> xfs_perag_put(pag); >> - *inop =3D NULLFSINO; >> - return 0; >> + >> + xfs_err_ratelimited(mp, >> + "Unable to allocate inodes in AG %d: Required %d, Current %llu, Max= imum %llu", >> + agno, XFS_IALLOC_INODES(mp), mp->m_sb.sb_icount, mp->m_maxicount); >> + goto out_spc; > >This changes the error to be returned from 0 to ENOSPC. Adding error >messages shouldn't change the logic of the code. 1) Yes, there is a confusion regarding that. =20 > >Also, you might want tolook at how ENOSPC is returned from >xfs_ialloc_ag_alloc(). it only occurs when: > > if (mp->m_maxicount && > mp->m_sb.sb_icount + newlen > mp->m_maxicount) { > >i.e. it is exactly the same error case as the "noroom" error below. >It has nothing to do with being unable to allocate inodes in the >specific AG - the global inode count is too high. IOWs, the error >message is not correct. Now, in xfs_dialloc=20 if (mp->m_maxicount && mp->m_sb.sb_icount + XFS_IALLOC_INODES(mp) > mp->m_maxicount) { noroom =3D 1; okalloc =3D 0; } why does it not make sense to bail out with ENOSPC then itself? I=20 mean, what is the point of the loop when there is no room=20 (noroom=3D1) and no allocations are allowed (okalloc =3D 0), also=20 since the xfs_ialloc_ag_alloc in the loop uses same global logic=20 to return. > >Also, 80 columns. > >> } >> >> if (ialloced) { >> @@ -1016,11 +1019,19 @@ nextag: >> if (++agno =3D=3D mp->m_sb.sb_agcount) >> agno =3D 0; >> if (agno =3D=3D start_agno) { >> - *inop =3D NULLFSINO; >> - return noroom ? ENOSPC : 0; >> + if (noroom) { >> + xfs_err_ratelimited(mp, >> + "Out of AGs with free inodes: Required %d, Current %llu, Maximum %= llu", >> + XFS_IALLOC_INODES(mp), mp->m_sb.sb_icount, mp->m_maxicount); > >The error message here is misleading - the error is that we've >exceeded the maximum inode count for the filesystem (same as the >above error message case), so no further allocations are allowed. > >What about the !noroom case? Isn't that a real ENOSPC condition? >i.e. we've tried to allocate inodes in every AG and yet we've failed >in all of them because there is no aligned, contiguous free space in >any of the AGs. Shouldn't that emit an appropriate warning? The warning is already emitted in call to xfs_ialloc_ag_select.=20 Now, what does inop =3D NULLFSINO, noroom =3D 0 and return value of 0 mean,= =20 =66rom the call chain of xfs_dir_ialloc -> xfs_ialloc ->=20 xfs_dialloc=20 I see that, it is a true ENOSPC only if both the buffer pointed=20 by ialloc_context and the inode are NULL or there is an error=20 returned, in former case (noroom=3D0) xfs_dir_ialloc retries the=20 allocation (ie. when AGI buffer is non-NULL). Now, in case of global inode exhaustion, it is hard error which=20 can be fixed only by remounting with inode64 and nothing else=20 will do, hence, I think ENOSPC must be returned as error instead=20 of 0. (also in case of point #1 above) So, are the assumptions made above correct? > >> + goto out_spc; >> + } >> + return 0; >> } >> } >> >> +out_spc: >> + *inop =3D NULLFSINO; >> + return ENOSPC; >> out_alloc: >> *IO_agbp =3D NULL; >> return xfs_dialloc_ag(tp, agbp, parent, inop); > >Default behaviour on a loop break is to allocate inodes, not return >ENOSPC. > >BTW, there's no need to cc LKML for XFS specific patches. LKML is >noisy enough as it is without unnecessary cross-posts.... > >Cheers, > >Dave. >--=20 >Dave Chinner >david@fromorbit.com > Regards, --=20 Raghavendra Prabhu GPG Id : 0xD72BE977 Fingerprint: B93F EBCB 8E05 7039 CD3C A4B8 A616 DCA1 D72B E977 www: wnohang.net --opJtzjQTFsWo+cga Content-Type: application/pgp-signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.19 (GNU/Linux) iQEcBAEBAgAGBQJQXBRcAAoJEKYW3KHXK+l3tWgIALJwOy5vXU8YC8r9K4cfuHVQ KtDNVgEYI/gbEHNhSzl21KuYvQes4fE1qwH/orx+IvSv7zZJDvRBVBVrPeQaL0UE Tlz5PASy8sqv/OvaoBhq/JpUzNw5vDMFbc8x4k0FPzqg7dmvVWQPi04m/a8Gkb4H 4n1pTCKK1T/s2TOwuqMyI/CCjaCUz1Jpvup55B3aD+CZxHdDnEmwrpQgmh/e2kmq SywZTEwzxgnhX8YwvRzpq+WMSnj30ISAKA4eBTSi7ifpYXlJj5CEjX5ELc2WXYul wOhk13n2oiYP8OQAfx6NH/tdl864oYvo4XSdwi9t1TMNBlDApy1N22mF8LHXBd8= =EAyN -----END PGP SIGNATURE----- --opJtzjQTFsWo+cga-- From cmaiolino@redhat.com Fri Sep 21 08:41:39 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8LDfdCZ216035 for ; Fri, 21 Sep 2012 08:41:39 -0500 X-ASG-Debug-ID: 1348234972-04cbb07ce55ceda0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 5rCBuph77GQVTaYB for ; Fri, 21 Sep 2012 06:42:52 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8LDgpkQ016533 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Fri, 21 Sep 2012 09:42:52 -0400 Received: from andromeda.usersys.redhat.com (ovpn-113-28.phx2.redhat.com [10.3.113.28]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id q8LDgmgC007496 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO) for ; Fri, 21 Sep 2012 09:42:51 -0400 Date: Fri, 21 Sep 2012 10:42:47 -0300 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: Re: [PATCH v6] Stop periodic syncing if filesystem is already shutdown. Message-ID: <20120921134247.GA17090@andromeda.usersys.redhat.com> X-ASG-Orig-Subj: Re: [PATCH v6] Stop periodic syncing if filesystem is already shutdown. Mail-Followup-To: xfs@oss.sgi.com References: <143becf0f8266fbc8025ec97c8f44476d8fcafc5.1348203015.git.rprabhu@wnohang.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <143becf0f8266fbc8025ec97c8f44476d8fcafc5.1348203015.git.rprabhu@wnohang.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1348234972 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com On Fri, Sep 21, 2012 at 10:24:04AM +0530, raghu.prabhu13@gmail.com wrote: > From: Raghavendra D Prabhu > > This is to prevent xfs_log_force from printing error message continuously (due > to xfs_sync and others) till umount if the disk has been forcefully unplugged. > > This is to prevent messages like these from being displayed repeatedly. > > [ 3873.009329] XFS (sdb3): xfs_log_force: error 5 returned. > > Note, that even after xfs_do_force_shutdown has been called, xfs_log_force > doesn't stop till the filesystem has been unmounted (and it keeps printing > "error 5 returned" to kernel log). > > To fix this, added condition over XFS_FORCED_SHUTDOWN to xfs_log_force and > xfs_fs_sync_fs. > > To simulate it, mount an xfs filesystem located on external disk, and then pull > the power to the disk. > > Now, the dmesg looks, > > [ 268.307303] XFS (sdb2): xfs_do_force_shutdown(0x1) called from line 1031 of file fs/xfs/xfs_buf.c. Return address = 0xffffffff8127c13a > [ 268.307318] XFS (sdb2): I/O Error Detected. Shutting down filesystem > [ 268.307323] XFS (sdb2): Please umount the filesystem and rectify the problem(s) > > Version 1: Removed calling xfs_syncd_stop from xfs_sync_worker. > Version 2: Removed calling xfs_fs_writable in xfs_sync_worker and xfs_flush_worker. > Version 3: Removed calling xfs_syncd_stop in xfs_bwrite. > Version 4: Added return statements to xfs_log_force and xfs_fs_sync_fs. > Version 5: As per suggestion, removed EIO return in xfs_log_force. > > Signed-off-by: Raghavendra D Prabhu > --- > fs/xfs/xfs_log.c | 5 ++++- > fs/xfs/xfs_super.c | 4 ++++ > 2 files changed, 8 insertions(+), 1 deletion(-) > > diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c > index 7f4f937..161c925 100644 > --- a/fs/xfs/xfs_log.c > +++ b/fs/xfs/xfs_log.c > @@ -3002,7 +3002,10 @@ xfs_log_force( > > trace_xfs_log_force(mp, 0); > error = _xfs_log_force(mp, flags, NULL); > - if (error) > + /* > + * Avoid warning when the filesystem has already shutdown. > + */ > + if (error && !XFS_FORCED_SHUTDOWN(mp)) > xfs_warn(mp, "%s: error %d returned.", __func__, error); > } > > diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c > index 19e2380..8df3387 100644 > --- a/fs/xfs/xfs_super.c > +++ b/fs/xfs/xfs_super.c > @@ -944,6 +944,10 @@ xfs_fs_sync_fs( > if (!wait) > return 0; > > + if (XFS_FORCED_SHUTDOWN(mp)) { > + return XFS_ERROR(EIO); > + } > + > error = xfs_quiesce_data(mp); > if (error) > return -error; > -- > 1.7.12.1 > Looks good to me. Reviewd-by: Carlos Maiolino -- --Carlos From tiwarikanand@gmail.com Fri Sep 21 10:49:58 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.2 required=5.0 tests=BAYES_00,FREEMAIL_FROM, HTML_MESSAGE,J_CHICKENPOX_63,T_DKIM_INVALID autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8LFnwUV227431 for ; Fri, 21 Sep 2012 10:49:58 -0500 X-ASG-Debug-ID: 1348242670-04cbb07ce55daa10001-NocioJ Received: from mail-qa0-f46.google.com (mail-qa0-f46.google.com [209.85.216.46]) by cuda.sgi.com with ESMTP id 3rZUpwdmtgkQe4Ak (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 21 Sep 2012 08:51:10 -0700 (PDT) X-Barracuda-Envelope-From: tiwarikanand@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.216.46 X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.46] Received: by qaas11 with SMTP id s11so1604321qaa.5 for ; Fri, 21 Sep 2012 08:51:10 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.46] X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.46] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=tkt21PTOnZ6xYw3v3Wbu+iSMgmgBVx/+umVTnLlzOC4=; b=zT7S1hgBTSyEuZT7GgW+m0iarHQMwK+ayvWC9nYLEQ6fARBlKwfnRhejx22BIS/yAZ Ufoi3yNrfHN+ihuJd5XUb3Q9aHbQ/29t7kY+3nBGboFLqbWtYuhWzDeQm9P8tSqidRdK 7RHIGYpT4BILO8Xognb8JH5ZNEhzrnTr1UStaXXpky2gJxryQGcDMcAoyyETEtL09b2q amFFsBTqT5iJxRRfu1+3TlrXydj84q3JsiYITurCXo+2iIXhoPd1CKR6zx6cqL+/URCR PNjxOVs+y7wC1e1WK51lCuE1ZN8sJMrnoEPuQVV9hdVaSroc0uuj0kjPK4mo4p000CeB DJAA== MIME-Version: 1.0 Received: by 10.229.135.75 with SMTP id m11mr3628666qct.66.1348242670242; Fri, 21 Sep 2012 08:51:10 -0700 (PDT) Received: by 10.49.1.16 with HTTP; Fri, 21 Sep 2012 08:51:10 -0700 (PDT) In-Reply-To: <505BF45D.5050909@sandeen.net> References: <505BF45D.5050909@sandeen.net> Date: Fri, 21 Sep 2012 09:51:10 -0600 Message-ID: Subject: Re: xfs_repair deleting realtime files. From: Anand Tiwari X-ASG-Orig-Subj: Re: xfs_repair deleting realtime files. To: Eric Sandeen Cc: xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=00248c6a66c26e4d3a04ca38356e X-Barracuda-Connect: mail-qa0-f46.google.com[209.85.216.46] X-Barracuda-Start-Time: 1348242670 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109183 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message --00248c6a66c26e4d3a04ca38356e Content-Type: text/plain; charset=ISO-8859-1 On Thu, Sep 20, 2012 at 11:00 PM, Eric Sandeen wrote: > On 9/20/12 7:40 PM, Anand Tiwari wrote: > > Hi All, > > > > I have been looking into an issue with xfs_repair with realtime sub > volume. some times while running xfs_repair I see following errors > > > > ---------------------------- > > data fork in rt inode 134 claims used rt block 19607 > > bad data fork in inode 134 > > would have cleared inode 134 > > data fork in rt inode 135 claims used rt block 29607 > > bad data fork in inode 135 > > would have cleared inode 135 > > - agno = 1 > > - agno = 2 > > - agno = 3 > > - process newly discovered inodes... > > Phase 4 - check for duplicate blocks... > > - setting up duplicate extent list... > > - check for inodes claiming duplicate blocks... > > - agno = 0 > > - agno = 1 > > - agno = 2 > > - agno = 3 > > entry "test-011" in shortform directory 128 references free inode 134 > > would have junked entry "test-011" in directory inode 128 > > entry "test-0" in shortform directory 128 references free inode 135 > > would have junked entry "test-0" in directory inode 128 > > data fork in rt ino 134 claims dup rt extent,off - 0, start - 7942144, > count 2097000 > > bad data fork in inode 134 > > would have cleared inode 134 > > data fork in rt ino 135 claims dup rt extent,off - 0, start - 13062144, > count 2097000 > > bad data fork in inode 135 > > would have cleared inode 135 > > No modify flag set, skipping phase 5 > > ------------------------ > > > > Here is the bmap for both inodes. > > > > xfs_db> inode 135 > > xfs_db> bmap > > data offset 0 startblock 13062144 (12/479232) count 2097000 flag 0 > > data offset 2097000 startblock 15159144 (14/479080) count 2097000 flag 0 > > data offset 4194000 startblock 17256144 (16/478928) count 2097000 flag 0 > > data offset 6291000 startblock 19353144 (18/478776) count 2097000 flag 0 > > data offset 8388000 startblock 21450144 (20/478624) count 2097000 flag 0 > > data offset 10485000 startblock 23547144 (22/478472) count 2097000 flag 0 > > data offset 12582000 startblock 25644144 (24/478320) count 2097000 flag 0 > > data offset 14679000 startblock 27741144 (26/478168) count 2097000 flag 0 > > data offset 16776000 startblock 29838144 (28/478016) count 2097000 flag 0 > > data offset 18873000 startblock 31935144 (30/477864) count 1607000 flag 0 > > xfs_db> inode 134 > > xfs_db> bmap > > data offset 0 startblock 7942144 (7/602112) count 2097000 flag 0 > > data offset 2097000 startblock 10039144 (9/601960) count 2097000 flag 0 > > data offset 4194000 startblock 12136144 (11/601808) count 926000 flag 0 > > It's been a while since I thought about realtime, but - > > That all seems fine, I don't see anything overlapping there, they are > all perfectly adjacent, though of interesting size. > > > > > by looking into xfs_repair code, it looks like repair does not handle > > a case where we have more than one extent in a real-time extent. > > following is code from repair/dinode.c: process_rt_rec > > "more than one extent in a real-time extent?" I'm not sure what that > means. > > Every extent above is length 2097000 blocks, and they are adjacent. > But you say your realtime extent size is 512 blocks ... which doesn't go > into 2097000 evenly. So that's odd, at least. > > well, lets look at first extent > data offset 0 startblock 13062144 (12/479232) count 2097000 flag 0 > data offset 2097000 startblock 15159144 (14/479080) count 2097000 flag 0 startblock is aligned and rtext is 25512, since the blockcount is not multiple of 512, last realtime extent ( 25512 + 4095) is partially used, 360 blks second extent start from realtime extent 29607 (ie 25512 + 4095). so, yes, extents are not overlapping, but 29607 realtime extent is shared by two extents. Now once xfs_repair detects this case in phase 2, it bails out and clears that inode. I think search for duplicate extent is done in phase 4, but inode is marked already. Can you provide your xfs_info output for this fs? > Or maybe better yet an xfs_metadump image. > > I will do it soon. The other thing I noticed is if I try to delete this file (inode 135), I get following assertion failure. [75669.291000] Assertion failed: prev.br_state == XFS_EXT_NORM, file: fs/xfs/xfs_bmap.c, line: 5187 [75669.300000] [<8024dc44>] assfail+0x28/0x2c [75669.300000] [<801d8864>] xfs_bunmapi+0x1288/0x14e4 [75669.300000] [<8020aff4>] xfs_itruncate_finish+0x344/0x738 [75669.300000] [<802363b0>] xfs_inactive+0x4a8/0x51c [75669.300000] [<80109124>] evict+0x28/0xd0 [75669.300000] [<80109c14>] iput+0x19c/0x2d8 [75669.300000] [<800fe58c>] do_unlinkat+0x10c/0x19c [75669.300000] [<80011b7c>] stack_done+0x20/0x40 > > ----- > > for (b = irec->br_startblock; b < irec->br_startblock + > > irec->br_blockcount; b += mp->m_sb.sb_rextsize) > { > > ext = (xfs_drtbno_t) b / mp->m_sb.sb_rextsize; > > pwe = xfs_sb_version_hasextflgbit(&mp->m_sb) && > > irec->br_state == XFS_EXT_UNWRITTEN && > > (b % mp->m_sb.sb_rextsize != 0); > > ----- > > > > In my case rextsize is 512 (512 * 4096 = 2mb). So we have multiple > > extents (written extents to be precise, thanks dchinner for that), > > value of "ext" will be same for all of them and xfs_repair does not > > like it. thus the error message ""data fork in rt inode XX claims > > used rt block XX". > > "ext" should not be the same for all of them; ext is the realtime extent > number in the fs, based on the physical start, br_startblock, > divided by the rt extent size. There shouldn't be duplicate values > of "ext" based on the bmaps above. > > The error comes from search_rt_dup_extent() which looks for overlaps > elsewhere in the fs... > > If you can provide a metadump of the fs it might be easier to see what's > going on. > > -Eric > > > If I ignore this failure condition, xfs_repairs seems to be happy. > > (FYI: this file-system is cleanly umounted) But in my opinion, its > > not good as these multiple extents can overlap too. > > > Should we be using XR_E_MULT to flag and keep track of duplicated > > real-time extents. (maybe use the present API for adding/detecting > > duplicate extents) > > > > I am open of suggestion or comments on how to fix this. > > > > xfs_repair version is 3.1.8 and kernel 2.6.37. > > > > thanks, > > Anand > > > > > > > > _______________________________________________ > > xfs mailing list > > xfs@oss.sgi.com > > http://oss.sgi.com/mailman/listinfo/xfs > > > > --00248c6a66c26e4d3a04ca38356e Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable

On Thu, Sep 20, 2012 at 11:00 PM, Eric S= andeen <sandeen@sandeen.net> wrote:
On 9/20/12 7:40 PM, Anand Tiwari wr= ote:
> Hi All,
>
> I have been looking into an issue with xfs_repair with realtime sub vo= lume. some times while running xfs_repair I see following errors
>
> ----------------------------
> data fork in rt inode 134 claims used rt block 19607
> bad data fork in inode 134
> would have cleared inode 134
> data fork in rt inode 135 claims used rt block 29607
> bad data fork in inode 135
> would have cleared inode 135
> =A0 =A0 =A0 =A0 - agno =3D 1
> =A0 =A0 =A0 =A0 - agno =3D 2
> =A0 =A0 =A0 =A0 - agno =3D 3
> =A0 =A0 =A0 =A0 - process newly discovered inodes...
> Phase 4 - check for duplicate blocks...
> =A0 =A0 =A0 =A0 - setting up duplicate extent list...
> =A0 =A0 =A0 =A0 - check for inodes claiming duplicate blocks...
> =A0 =A0 =A0 =A0 - agno =3D 0
> =A0 =A0 =A0 =A0 - agno =3D 1
> =A0 =A0 =A0 =A0 - agno =3D 2
> =A0 =A0 =A0 =A0 - agno =3D 3
> entry "test-011" in shortform directory 128 references free = inode 134
> would have junked entry "test-011" in directory inode 128 > entry "test-0" in shortform directory 128 references free in= ode 135
> would have junked entry "test-0" in directory inode 128
> data fork in rt ino 134 claims dup rt extent,off - 0, start - 7942144,= count 2097000
> bad data fork in inode 134
> would have cleared inode 134
> data fork in rt ino 135 claims dup rt extent,off - 0, start - 13062144= , count 2097000
> bad data fork in inode 135
> would have cleared inode 135
> No modify flag set, skipping phase 5
> ------------------------
>
> Here is the bmap for both inodes.
>
> xfs_db> inode 135
> xfs_db> bmap
> data offset 0 startblock 13062144 (12/479232) count 2097000 flag 0
> data offset 2097000 startblock 15159144 (14/479080) count 2097000 flag= 0
> data offset 4194000 startblock 17256144 (16/478928) count 2097000 flag= 0
> data offset 6291000 startblock 19353144 (18/478776) count 2097000 flag= 0
> data offset 8388000 startblock 21450144 (20/478624) count 2097000 flag= 0
> data offset 10485000 startblock 23547144 (22/478472) count 2097000 fla= g 0
> data offset 12582000 startblock 25644144 (24/478320) count 2097000 fla= g 0
> data offset 14679000 startblock 27741144 (26/478168) count 2097000 fla= g 0
> data offset 16776000 startblock 29838144 (28/478016) count 2097000 fla= g 0
> data offset 18873000 startblock 31935144 (30/477864) count 1607000 fla= g 0
> xfs_db> inode 134
> xfs_db> bmap
> data offset 0 startblock 7942144 (7/602112) count 2097000 flag 0
> data offset 2097000 startblock 10039144 (9/601960) count 2097000 flag = 0
> data offset 4194000 startblock 12136144 (11/601808) count 926000 flag = 0

It's been a while since I thought about realtime, but -

That all seems fine, I don't see anything overlapping there, they are all perfectly adjacent, though of interesting size.

>
> by looking into xfs_repair code, it looks like repair does not handle<= br> > a case where we have more than one extent in a real-time extent.
> following is code from repair/dinode.c: process_rt_rec

"more than one extent in a real-time extent?" =A0I'm no= t sure what that means.

Every extent above is length 2097000 blocks, and they are adjacent.
But you say your realtime extent size is 512 blocks ... which doesn't g= o
into 2097000 evenly. =A0 So that's odd, at least.


well, lets look at first extent
> data offs= et 0 startblock 13062144 (12/479232) count 2097000 flag 0
> data offset 2097000 startblock 15159144 (14/479080) count 2097000 flag= 0
startblock is aligned and rtext is 25512,=A0 since the blockcount is = not multiple of 512, last realtime extent ( 25512 + 4095) is partially used= , 360 blks
second extent start from realtime extent 29607 (ie 25512 + 4095).=A0 so, ye= s, extents are not overlapping, but 29607 realtime extent is shared by two = extents.
Now once xfs_repair detects this case in phase 2, it bails out = and clears that inode. I think=A0 search for duplicate extent is done in ph= ase 4, but inode is marked already.


Can you provide your xfs_info output for this fs?
Or maybe better yet an xfs_metadump image.


I will do it soon.=A0 The= other=A0 thing I noticed is if I try to delete this file (inode 135),=A0 I= get following assertion failure.

[75669.291000] Assertion failed: = prev.br_state =3D=3D XFS_EXT_NORM, file: fs/xfs/xfs_bmap.c, line: 5187=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=
[75669.300000] [<8024dc44>] assfail+0x28/0x2c=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0
[756= 69.300000] [<801d8864>] xfs_bunmapi+0x1288/0x14e4=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0
[75669.300000] [<8020aff4>] xfs_itruncate_finish+0x344/0x738=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0
[75669.300000] [<802363b0>] = xfs_inactive+0x4a8/0x51c=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0
[75669.300000] [<80109124>] evict+0x28/0xd0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 [75669.300000] [<80109c14>] iput+0x19c/0x2d8=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 [75669.300000] [<800fe58c>] do_unlinkat+0x10c/0x19c=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0
[75669.300000] [= <80011b7c>] stack_done+0x20/0x40=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0= =A0=A0=A0=A0=A0=A0=A0=A0

=A0
> -----
> =A0 =A0 =A0for (b =3D irec->br_startblock; b < irec->br_start= block +
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 irec->br_blockcount= ; b +=3D mp->m_sb.sb_rextsize) =A0{
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 ext =3D (xfs_drtbno_t) b / mp->m_sb= .sb_rextsize;
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 pwe =3D xfs_sb_version_hasextflgbit(&a= mp;mp->m_sb) &&
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 irec-&= gt;br_state =3D=3D XFS_EXT_UNWRITTEN &&
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 (b % m= p->m_sb.sb_rextsize !=3D 0);
> -----
>
> In my case rextsize is 512 (512 * 4096 =3D 2mb). So we have multiple > extents (written extents to be precise, thanks dchinner for that),
> value of "ext" will be same for all of them and xfs_repair d= oes not
> like it. thus the error message ""data fork in rt inode XX c= laims
> used rt block XX".

"ext" should not be the same for all of them; ext is the re= altime extent
number in the fs, based on the physical start, br_startblock,
divided by the rt extent size. =A0There shouldn't be duplicate values of "ext" based on the bmaps above.

The error comes from search_rt_dup_extent() which looks for overlaps
elsewhere in the fs...

If you can provide a metadump of the fs it might be easier to see what'= s going on.

-Eric

> If I ignore this failure condition, xfs_repairs seems to be happy.
> (FYI: this file-system is cleanly umounted) But in my opinion, its
> not good as these multiple extents can overlap too.

> Should we be using XR_E_MULT to flag and keep track of duplicated
> real-time extents. (maybe use the present API for adding/detecting
> duplicate extents)
>
> I am open of suggestion or comments on how to fix this.
>
> xfs_repair version is 3.1.8 and kernel 2.6.37.
>
> thanks,
> Anand
>
>
>
> _______________________________________________
> xfs mailing list
> xfs@oss.sgi.com
> = http://oss.sgi.com/mailman/listinfo/xfs
>


--00248c6a66c26e4d3a04ca38356e-- From sandeen@sandeen.net Fri Sep 21 11:05:55 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_63 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8LG5tgP228561 for ; Fri, 21 Sep 2012 11:05:55 -0500 X-ASG-Debug-ID: 1348243628-04cb6c56864f7ce0001-NocioJ Received: from mail.sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id jdC82A1872U2EeTk for ; Fri, 21 Sep 2012 09:07:08 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) (Authenticated sender: sandeen) by mail.sandeen.net (Postfix) with ESMTP id 1AC844964602; Fri, 21 Sep 2012 11:07:04 -0500 (CDT) Message-ID: <505C90A6.90103@sandeen.net> Date: Fri, 21 Sep 2012 11:07:02 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20120907 Thunderbird/15.0.1 MIME-Version: 1.0 To: Anand Tiwari CC: xfs@oss.sgi.com Subject: Re: xfs_repair deleting realtime files. References: <505BF45D.5050909@sandeen.net> X-ASG-Orig-Subj: Re: xfs_repair deleting realtime files. In-Reply-To: X-Enigmail-Version: 1.4.4 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1348243628 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109183 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 9/21/12 10:51 AM, Anand Tiwari wrote: > > > On Thu, Sep 20, 2012 at 11:00 PM, Eric Sandeen > wrote: > > On 9/20/12 7:40 PM, Anand Tiwari wrote: >> Hi All, >> >> I have been looking into an issue with xfs_repair with realtime sub >> volume. some times while running xfs_repair I see following errors >> >> ---------------------------- data fork in rt inode 134 claims used >> rt block 19607 bad data fork in inode 134 would have cleared inode >> 134 data fork in rt inode 135 claims used rt block 29607 bad data >> fork in inode 135 would have cleared inode 135 - agno = 1 - agno = >> 2 - agno = 3 - process newly discovered inodes... Phase 4 - check >> for duplicate blocks... - setting up duplicate extent list... - >> check for inodes claiming duplicate blocks... - agno = 0 - agno = >> 1 - agno = 2 - agno = 3 entry "test-011" in shortform directory 128 >> references free inode 134 would have junked entry "test-011" in >> directory inode 128 entry "test-0" in shortform directory 128 >> references free inode 135 would have junked entry "test-0" in >> directory inode 128 data fork in rt ino 134 claims dup rt >> extent,off - 0, start - 7942144, count 2097000 bad data fork in >> inode 134 would have cleared inode 134 data fork in rt ino 135 >> claims dup rt extent,off - 0, start - 13062144, count 2097000 bad >> data fork in inode 135 would have cleared inode 135 No modify flag >> set, skipping phase 5 ------------------------ >> >> Here is the bmap for both inodes. >> >> xfs_db> inode 135 xfs_db> bmap data offset 0 startblock 13062144 >> (12/479232) count 2097000 flag 0 data offset 2097000 startblock >> 15159144 (14/479080) count 2097000 flag 0 data offset 4194000 >> startblock 17256144 (16/478928) count 2097000 flag 0 data offset >> 6291000 startblock 19353144 (18/478776) count 2097000 flag 0 data >> offset 8388000 startblock 21450144 (20/478624) count 2097000 flag >> 0 data offset 10485000 startblock 23547144 (22/478472) count >> 2097000 flag 0 data offset 12582000 startblock 25644144 (24/478320) >> count 2097000 flag 0 data offset 14679000 startblock 27741144 >> (26/478168) count 2097000 flag 0 data offset 16776000 startblock >> 29838144 (28/478016) count 2097000 flag 0 data offset 18873000 >> startblock 31935144 (30/477864) count 1607000 flag 0 xfs_db> inode >> 134 xfs_db> bmap data offset 0 startblock 7942144 (7/602112) count >> 2097000 flag 0 data offset 2097000 startblock 10039144 (9/601960) >> count 2097000 flag 0 data offset 4194000 startblock 12136144 >> (11/601808) count 926000 flag 0 > > It's been a while since I thought about realtime, but - > > That all seems fine, I don't see anything overlapping there, they > are all perfectly adjacent, though of interesting size. > >> >> by looking into xfs_repair code, it looks like repair does not >> handle a case where we have more than one extent in a real-time >> extent. following is code from repair/dinode.c: process_rt_rec > > "more than one extent in a real-time extent?" I'm not sure what that > means. > > Every extent above is length 2097000 blocks, and they are adjacent. > But you say your realtime extent size is 512 blocks ... which doesn't > go into 2097000 evenly. So that's odd, at least. > > > well, lets look at first extent >> data offset 0 startblock 13062144 (12/479232) count 2097000 flag 0 >> data offset 2097000 startblock 15159144 (14/479080) count 2097000 >> flag 0 > startblock is aligned and rtext is 25512, since the blockcount is > not multiple of 512, last realtime extent ( 25512 + 4095) is > partially used, 360 blks second extent start from realtime extent > 29607 (ie 25512 + 4095). so, yes, extents are not overlapping, but > 29607 realtime extent is shared by two extents. Now once xfs_repair > detects this case in phase 2, it bails out and clears that inode. I > think search for duplicate extent is done in phase 4, but inode is > marked already. ... ok I realize I was misunderstanding some things about the realtime volume. (It's been a very long time since I thought about it). Still, I'd like to look at the metadump image if possible. Thanks, -Eric From bpm@sgi.com Fri Sep 21 11:37:16 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8LGbGdq229921 for ; Fri, 21 Sep 2012 11:37:16 -0500 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay2.corp.sgi.com (Postfix) with ESMTP id C264C304071; Fri, 21 Sep 2012 09:38:27 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id AE7954266DC; Fri, 21 Sep 2012 11:38:27 -0500 (CDT) Date: Fri, 21 Sep 2012 11:38:27 -0500 From: Ben Myers To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH] xfstests: add _require_freeze and minor cleanups Message-ID: <20120921163827.GA1140@sgi.com> References: <505A4D04.2080105@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <505A4D04.2080105@redhat.com> User-Agent: Mutt/1.5.20 (2009-06-14) Hey Eric, On Wed, Sep 19, 2012 at 05:53:56PM -0500, Eric Sandeen wrote: > More filesystems have grown freeze capability, so rather than > hardcoding several in _supported_fs, make tests 068 and 280 > generic and then add a new _require_freeze() which checks whether > the fs under test can be frozen before beginning the test. > > Minor other cleanups to 280: > - remove extra _supported_fs line > - clear $seq.full before beginning > > Signed-off-by: Eric Sandeen > --- > > diff --git a/068 b/068 > index b595d1d..617420c 100755 > --- a/068 > +++ b/068 > @@ -51,10 +51,11 @@ trap "_cleanup" 0 1 2 3 15 > . ./common.filter > > # real QA test starts here > -_supported_fs btrfs ext3 ext4 xfs > +_supported_fs generic > _supported_os Linux IRIX > > _require_scratch > +_require_freeze > > echo "*** init FS" > > diff --git a/280 b/280 > index 55849ed..5e26173 100755 > --- a/280 > +++ b/280 > @@ -45,13 +45,15 @@ _cleanup() > > _require_scratch > _require_quota > +_require_freeze > > # real QA test starts here > > # Modify as appropriate. > -_supported_fs generic > _supported_os Linux > -_supported_fs ext3 ext4 xfs > +_supported_fs generic > + > +rm -f $seq.full > > umount $SCRATCH_DEV 2>/dev/null > _scratch_mkfs >> $seq.full 2>&1 > diff --git a/common.rc b/common.rc > index 602513a..0e8a306 100644 > --- a/common.rc > +++ b/common.rc > @@ -1758,6 +1758,15 @@ _require_btrfs() > [ $? -eq 0 ] || _notrun "$BTRFS_UTIL_PROG too old (must support $cmd)" > } > > +# Does freeze work on this fs? > +_require_freeze() > +{ > + xfs_freeze -f "$TEST_DIR" >/dev/null 2>&1 > + result=$? > + xfs_freeze -u "$TEST_DIR" >/dev/null 2>&1 > + [ $result -eq 0 ] || _notrun "$FSTYP does not support freezing" > +} > + Pretty good idea to generalize _require_freeze. It looks like xfs_freeze is a script that uses xfs_io which uses xfsctl XFS_IOC_FREEZE. So isn't what you have here xfs specific? It wouldn't work for the other filesystems that implement s_op.freeze_fs: 1 1502 btrfs/super.c <> .freeze_fs = btrfs_freeze, 2 804 ext3/super.c <> .freeze_fs = ext3_freeze, 3 1238 ext4/super.c <> .freeze_fs = ext4_freeze, 4 1578 gfs2/super.c <> .freeze_fs = gfs2_freeze, 5 760 jfs/super.c <> .freeze_fs = jfs_freeze, 6 688 nilfs2/super.c <> .freeze_fs = nilfs_freeze, 7 620 reiserfs/super.c <> .freeze_fs = reiserfs_freeze, 8 1536 xfs/linux-2.6/xfs_super.c <> .freeze_fs = xfs_fs_freeze, Maybe it would be better if we had some kind of interface to test whether .freeze_fs is defined (if there isn't one already) rather than freeze and thaw to find out. Oddly freeze_super seems to just return 0 when .freeze_fs is not defined. Regards, Ben From tiwarikanand@gmail.com Fri Sep 21 11:39:15 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.2 required=5.0 tests=BAYES_00,FREEMAIL_FROM, HTML_MESSAGE,J_CHICKENPOX_63,T_DKIM_INVALID autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8LGdE5M230023 for ; Fri, 21 Sep 2012 11:39:15 -0500 X-ASG-Debug-ID: 1348245627-04bdf0067c4f2b80001-NocioJ Received: from mail-qc0-f181.google.com (mail-qc0-f181.google.com [209.85.216.181]) by cuda.sgi.com with ESMTP id huPCoywVVhNs5tng (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Fri, 21 Sep 2012 09:40:27 -0700 (PDT) X-Barracuda-Envelope-From: tiwarikanand@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.216.181 X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.181] Received: by qcpx40 with SMTP id x40so3214707qcp.26 for ; Fri, 21 Sep 2012 09:40:26 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.181] X-Barracuda-IPDD: Level1 [gmail.com/209.85.216.181] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=h7PCUAiHJ+VZFvaE9/+oBUg3zuh5iSU8IuJnFM/98Rs=; b=Gpe9/9xGFWG7H0AzV8nr2diplFVUq3GOeD7GZHXAZrX3t2Ldrgqpk6VMxkxkqQD36L FKE+J275wD6kisAjNIK/L3bvTUJ8CxCADYCT/Qc/X7LOsOZ8c+heGwV2/vrN3vc/3NS/ cpzD4d0OyDc6NudLo6Uu2I/llyKhQRfqZITtOB9uIfRhPD7ueyFeABkk/T8o0ltg/WCf rG09VQe3XfB+ooIgN0nAGcsi03ixqDlPEaZkgnBFg49zyh9qrlNKTNhjo1zpQp35cZhY OK3Sm/i1x2FGCYnHjVSIX7vQHxWloYfw4rAdqNUTr+Gx+T2KW6TsbVRxIpJrA4gSbq3Y iPnw== MIME-Version: 1.0 Received: by 10.229.135.82 with SMTP id m18mr3672543qct.76.1348245626536; Fri, 21 Sep 2012 09:40:26 -0700 (PDT) Received: by 10.49.1.16 with HTTP; Fri, 21 Sep 2012 09:40:26 -0700 (PDT) In-Reply-To: <505C90A6.90103@sandeen.net> References: <505BF45D.5050909@sandeen.net> <505C90A6.90103@sandeen.net> Date: Fri, 21 Sep 2012 10:40:26 -0600 Message-ID: Subject: Re: xfs_repair deleting realtime files. From: Anand Tiwari X-ASG-Orig-Subj: Re: xfs_repair deleting realtime files. To: Eric Sandeen Cc: xfs@oss.sgi.com Content-Type: multipart/mixed; boundary=00248c6a84caa3c24a04ca38e597 X-Barracuda-Connect: mail-qc0-f181.google.com[209.85.216.181] X-Barracuda-Start-Time: 1348245627 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109185 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message --00248c6a84caa3c24a04ca38e597 Content-Type: multipart/alternative; boundary=00248c6a84caa3c22c04ca38e595 --00248c6a84caa3c22c04ca38e595 Content-Type: text/plain; charset=ISO-8859-1 On Fri, Sep 21, 2012 at 10:07 AM, Eric Sandeen wrote: > On 9/21/12 10:51 AM, Anand Tiwari wrote: > > > > > > On Thu, Sep 20, 2012 at 11:00 PM, Eric Sandeen > > wrote: > > > > On 9/20/12 7:40 PM, Anand Tiwari wrote: > >> Hi All, > >> > >> I have been looking into an issue with xfs_repair with realtime sub > >> volume. some times while running xfs_repair I see following errors > >> > >> ---------------------------- data fork in rt inode 134 claims used > >> rt block 19607 bad data fork in inode 134 would have cleared inode > >> 134 data fork in rt inode 135 claims used rt block 29607 bad data > >> fork in inode 135 would have cleared inode 135 - agno = 1 - agno = > >> 2 - agno = 3 - process newly discovered inodes... Phase 4 - check > >> for duplicate blocks... - setting up duplicate extent list... - > >> check for inodes claiming duplicate blocks... - agno = 0 - agno = > >> 1 - agno = 2 - agno = 3 entry "test-011" in shortform directory 128 > >> references free inode 134 would have junked entry "test-011" in > >> directory inode 128 entry "test-0" in shortform directory 128 > >> references free inode 135 would have junked entry "test-0" in > >> directory inode 128 data fork in rt ino 134 claims dup rt > >> extent,off - 0, start - 7942144, count 2097000 bad data fork in > >> inode 134 would have cleared inode 134 data fork in rt ino 135 > >> claims dup rt extent,off - 0, start - 13062144, count 2097000 bad > >> data fork in inode 135 would have cleared inode 135 No modify flag > >> set, skipping phase 5 ------------------------ > >> > >> Here is the bmap for both inodes. > >> > >> xfs_db> inode 135 xfs_db> bmap data offset 0 startblock 13062144 > >> (12/479232) count 2097000 flag 0 data offset 2097000 startblock > >> 15159144 (14/479080) count 2097000 flag 0 data offset 4194000 > >> startblock 17256144 (16/478928) count 2097000 flag 0 data offset > >> 6291000 startblock 19353144 (18/478776) count 2097000 flag 0 data > >> offset 8388000 startblock 21450144 (20/478624) count 2097000 flag > >> 0 data offset 10485000 startblock 23547144 (22/478472) count > >> 2097000 flag 0 data offset 12582000 startblock 25644144 (24/478320) > >> count 2097000 flag 0 data offset 14679000 startblock 27741144 > >> (26/478168) count 2097000 flag 0 data offset 16776000 startblock > >> 29838144 (28/478016) count 2097000 flag 0 data offset 18873000 > >> startblock 31935144 (30/477864) count 1607000 flag 0 xfs_db> inode > >> 134 xfs_db> bmap data offset 0 startblock 7942144 (7/602112) count > >> 2097000 flag 0 data offset 2097000 startblock 10039144 (9/601960) > >> count 2097000 flag 0 data offset 4194000 startblock 12136144 > >> (11/601808) count 926000 flag 0 > > > > It's been a while since I thought about realtime, but - > > > > That all seems fine, I don't see anything overlapping there, they > > are all perfectly adjacent, though of interesting size. > > > >> > >> by looking into xfs_repair code, it looks like repair does not > >> handle a case where we have more than one extent in a real-time > >> extent. following is code from repair/dinode.c: process_rt_rec > > > > "more than one extent in a real-time extent?" I'm not sure what that > > means. > > > > Every extent above is length 2097000 blocks, and they are adjacent. > > But you say your realtime extent size is 512 blocks ... which doesn't > > go into 2097000 evenly. So that's odd, at least. > > > > > > well, lets look at first extent > >> data offset 0 startblock 13062144 (12/479232) count 2097000 flag 0 > >> data offset 2097000 startblock 15159144 (14/479080) count 2097000 > >> flag 0 > > startblock is aligned and rtext is 25512, since the blockcount is > > not multiple of 512, last realtime extent ( 25512 + 4095) is > > partially used, 360 blks second extent start from realtime extent > > 29607 (ie 25512 + 4095). so, yes, extents are not overlapping, but > > 29607 realtime extent is shared by two extents. Now once xfs_repair > > detects this case in phase 2, it bails out and clears that inode. I > > think search for duplicate extent is done in phase 4, but inode is > > marked already. > > ... ok I realize I was misunderstanding some things about the realtime > volume. (It's been a very long time since I thought about it). Still, > I'd like to look at the metadump image if possible. > > Thanks, > -Eric > metadump attached --00248c6a84caa3c22c04ca38e595 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable

On Fri, Sep 21, 2012 at 10:07 AM, Eric S= andeen <sandeen@sandeen.net> wrote:
On 9/21/12 10:51 AM, Anand Tiwari wrote:
>
>
> On Thu, Sep 20, 2012 at 11:00 PM, Eric Sandeen <sandeen@sandeen.net
> <mailto:sandeen@sandeen.net>> wrote:
>
> On 9/20/12 7:40 PM, Anand Tiwari wrote:
>> Hi All,
>>
>> I have been looking into an issue with xfs_repair with realtime su= b
>> volume. some times while running xfs_repair I see following errors=
>>
>> ---------------------------- data fork in rt inode 134 claims used=
>> rt block 19607 bad data fork in inode 134 would have cleared inode=
>> 134 data fork in rt inode 135 claims used rt block 29607 bad data<= br> >> fork in inode 135 would have cleared inode 135 - agno =3D 1 - agno= =3D
>> 2 - agno =3D 3 - process newly discovered inodes... Phase 4 - chec= k
>> for duplicate blocks... - setting up duplicate extent list... - >> check for inodes claiming duplicate blocks... - agno =3D 0 - agno = =3D
>> 1 - agno =3D 2 - agno =3D 3 entry "test-011" in shortfor= m directory 128
>> references free inode 134 would have junked entry "test-011&q= uot; in
>> directory inode 128 entry "test-0" in shortform director= y 128
>> references free inode 135 would have junked entry "test-0&quo= t; in
>> directory inode 128 data fork in rt ino 134 claims dup rt
>> extent,off - 0, start - 7942144, count 2097000 bad data fork in >> inode 134 would have cleared inode 134 data fork in rt ino 135
>> claims dup rt extent,off - 0, start - 13062144, count 2097000 bad<= br> >> data fork in inode 135 would have cleared inode 135 No modify flag=
>> set, skipping phase 5 ------------------------
>>
>> Here is the bmap for both inodes.
>>
>> xfs_db> inode 135 xfs_db> bmap data offset 0 startblock 1306= 2144
>> (12/479232) count 2097000 flag 0 data offset 2097000 startblock >> 15159144 (14/479080) count 2097000 flag 0 data offset 4194000
>> startblock 17256144 (16/478928) count 2097000 flag 0 data offset >> 6291000 startblock 19353144 (18/478776) count 2097000 flag 0 data<= br> >> offset 8388000 startblock 21450144 (20/478624) count 2097000 flag<= br> >> 0 data offset 10485000 startblock 23547144 (22/478472) count
>> 2097000 flag 0 data offset 12582000 startblock 25644144 (24/478320= )
>> count 2097000 flag 0 data offset 14679000 startblock 27741144
>> (26/478168) count 2097000 flag 0 data offset 16776000 startblock >> 29838144 (28/478016) count 2097000 flag 0 data offset 18873000
>> startblock 31935144 (30/477864) count 1607000 flag 0 xfs_db> in= ode
>> 134 xfs_db> bmap data offset 0 startblock 7942144 (7/602112) co= unt
>> 2097000 flag 0 data offset 2097000 startblock 10039144 (9/601960)<= br> >> count 2097000 flag 0 data offset 4194000 startblock 12136144
>> (11/601808) count 926000 flag 0
>
> It's been a while since I thought about realtime, but -
>
> That all seems fine, I don't see anything overlapping there, they<= br> > are all perfectly adjacent, though of interesting size.
>
>>
>> by looking into xfs_repair code, it looks like repair does not
>> handle a case where we have more than one extent in a real-time >> extent. following is code from repair/dinode.c: process_rt_rec
>
> "more than one extent in a real-time extent?" =A0I'm not= sure what that
> means.
>
> Every extent above is length 2097000 blocks, and they are adjacent. > But you say your realtime extent size is 512 blocks ... which doesn= 9;t
> go into 2097000 evenly. =A0 So that's odd, at least.
>
>
> well, lets look at first extent
>> data offset 0 startblock 13062144 (12/479232) count 2097000 flag 0=
>> data offset 2097000 startblock 15159144 (14/479080) count 2097000<= br> >> flag 0
> startblock is aligned and rtext is 25512, =A0since the blockcount is > not multiple of 512, last realtime extent ( 25512 + 4095) is
> partially used, 360 blks second extent start from realtime extent
> 29607 (ie 25512 + 4095). =A0so, yes, extents are not overlapping, but<= br> > 29607 realtime extent is shared by two extents. Now once xfs_repair > detects this case in phase 2, it bails out and clears that inode. I > think =A0search for duplicate extent is done in phase 4, but inode is<= br> > marked already.

... ok I realize I was misunderstanding some things about the r= ealtime
volume. =A0(It's been a very long time since I thought about it). =A0St= ill,
I'd like to look at the metadump image if possible.

Thanks,
-Eric


metadump attached
--00248c6a84caa3c22c04ca38e595-- --00248c6a84caa3c24a04ca38e597 Content-Type: application/x-bzip2; name="dumpo.xfs.bz2" Content-Disposition: attachment; filename="dumpo.xfs.bz2" Content-Transfer-Encoding: base64 X-Attachment-Id: f_h7dim3sn1 QlpoOTFBWSZTWeCrHNADT3B/////////////////////////////////////////////4KQb6kY4 AAAAAAAAAAAAIEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIcAOEALDMYA AAAAAAAAAAAhgAAAAAAAEQCQBIAEiRIEgCRJLy2zKTLFMiRA2D5wBgEOwwRAByYEIhjbIaQB0ADK KRzJhgYYGydznIBBIZATpw5MZJlZABgpC7kjA2WFtyDuYzLKDIADZgiaWZmM0pZYdNMqQJmYAkKQ TRoCTOWTMDoO7aAAYjqgSBEETgAAAAAAAAtACJDmwYmEAgAMZOAEglIAAAAAAAAAAAAAAAAAAAAb U0AHqNAANPSHpPU9I8k9TTRtE/KntNJin6DRpM1T/1T9VM01T2ajI1PammNGn/vVVJvVVFgAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB//+1VVUP//VVSESREaTRgSbSGQZGmI0Ykwap+FPC MmTTaZMAbTT/aBKJvUVHlIyP9VAybU000/JU1P0TfqhNTxT1PKep79VT0/ZVN+iowaamJsmmRoG/ 1VGpPfqgCYJqfpTxTTT9qoIkppRvUoZtJJT1NtMmhjSHqGhNoZT9CnibSMmeTQY0m3v8iqUk9SZQ 9Cmj1PU/U0jxTTeqHtUAaaP0hHqaGaIDQBsoBoNpGyjQABoGgZBiNAYpT0pPeqp+jVPaKPU0aMh+ goPTUeo8mQeqG9UP1J6jJ7TRPPSVP9v97VKqZTSpvVDTRkG0gA0GjQBoABoAAAABoAB6gAAAABoA AQqSIQDIjQAEwGomAKbaJk0aeino9Jpg1Nqab20I1T9RNlNJhoJpim00wjEYajTJPRpqDamT1Npt Qjynino00NM9UNCZoaGphqabRHqeJP/Spqe1syKVmrExdVq8bWcdreP5DXa/YbHXS2mNYlLN73vv w9/4H1vB+v4Xh/W+z4n2vt/c+797xa/v/xfx/N/k/l6kU6+6d+pB199Y6iwzm/x8OC5tQ+5/AD9H xh4Ffl8ywRF1216//L6OLKXxfp/o6XV/E9l33vec/Jl+z89yv2/J/s+H4nkvKeU8zxOU5T8G6+R8 7peP/l8/ccly/kedDr8HfO+AL9cnqxNPT+u097qZs5vLes+TET7fpgTyieHBfzw0l8pelzAv/E6A Mxg1fPgmXNMtQ4Cj7b0332/s+17jg+27n2/de28v3fuc3lc7hdH/V7r/j3nu/ef183Ly/Kd1zkrB csXoKub/H73mfV/3dX/f/h8z5vzun+f8z6He9J0/0e+/x+l9PI+p/l9Xv/Aw/W3fg/X8J/D+xc+z 4n2vt/c+7wPveLXciPv/g8b/P/xc/Dqfi/H7vo878n5fzfnz8/Pz8/P7ft8/Pz+4z8/tM/Pz8/Pz 8/P6P9H6f9P1Z/6/2ft/d73/X9//nx/4f+v7P4/y0dXb0p8pc0+bu0+lzn7dZq9be3ut2V7sr29v fva/ZbPY32z2l/teo23TbXb7j/mBudxut3vMHe77CwMDB3/U8Dg4f/djVwq971XC4fExOLi8Hg7z /3GxuLVVVVVVVuKqqqqqqqqqqqqqquFj2OPyMjJ5PKsZXV5dnl5nMs5udn2tDO0belLVtctWrWXp 6d2lu3bt2/9/74CqqqqoAAAABVwAAAAAAAAAAV/0AAAAAAAAAKv/AAAAAAAAABVwAAAAAAAAAAVY AAAAAAAAAKsAAAAAAAAAKsAAAAAAAAAFWAAAAAAAAACrAAAAAAAAABVgAAAAAAAABVgAAAAAAAAA qwAAAAAAAAAVYAAAAAAAAAKsAAAAAAAAAKsAAAAAAAAAFWAAAAAAAAACrAAAAAAAAABVgAAAAAAA ABVgAAAAAAAAAqwAAAAAAAAAVYAAAAAAAAAKsAAAAAAAAAKsAAAAAAAAAFWAAAAAAAAACrAAAAAA AAABVgAAAAAAAABVgAAAAAAAAAqwAAAAAAAAAVYAAAAAAAAAKsAAAAAAAAAKsAAAAAAAAAFWAAAA AAAAACrAAAAAAAAABVgAAAAAAAABVgAAAAAAAAAqwAAAAAAAAAVYAAAAAAAAAKsAAAAAAAAAKsAA AAAAAAAFWAAAAAAAAACrAAAAAAAAABVgAAAAAAAABVgAAAAAAAAAqwAAAAAAAAAVYAAAAAAAAAKs AAAAAAAAAKsAAAAAAAAAFWAAAAAAAAACrAAAAAAAAABVgAAAAAAAABVgAAAAAAAAAqwAAAAAAAAA VYAAAAAAAAAKsAAAAAAAAAKsAAAAAAAAAFWAAAAAAAAACrAAAAAAAAABVgAAAAAAAABVgAAAAAAA AAqwAAAAAAAAAVYAAAAAAAAAKsAAAABJJJJJJJJJJJJJJJLoAAAAAAAAASS6AAAAAAAAAEkugAAA AAAAABJLoAAAAAAAAASSSSSSSSSSSSAAAAAAKsAAAAAAAAAFWAAAAAAAAACrAAAAAAAAABVgAAAA AAAABVgAAAAAAAAAqwAAAAAAAAAVYAAAAAAAAAKsAAAAAAAAAKsAAAAAAAAAFWAAAAAAAAACrAAA AAAAAABVgAAAAAAAABVgAAAAAAAAAqwAAAAAAAAAVYAAAAAAAAAKsAAAAAAAAAKsAAAAAAAAAFWA AAAAAAAACrAAAAAAAAABVgAAAAAAAABVgAAAAAAAAAqwAAAAAAAAAVYAAAAAAAAAKsAAAAAAAAAK sAAAAAAAAAFWAAAAAAAAACrAAAAAAAAABVgAAAAAAAABVgAAAAAAAAAqwAAAAAAAAAVYAAAAAAAA AKsAAAAAAAAAKsAAAAAAAAAFWAAAAAAAAACrAAAAAAAAABVgAAAAAAAABVgAAAAAAAAAqwAAAAAA AAAVYAAAAAAAAAKsAAAAAAAAAKsAAAAAAAAAFWAAAAAAAAACrAAAAAAAAABVgAAAAAAAABVgAAAA AAAAAqwAAAAAAAAAVYAAAAAAAAAKsAAAAAAAAAKsAAAAAAAAAFWAAAAAAAAACrAAAAAAAAABVgAA AAAAAABVgAAAAAAAAAqwAAAAAAAAAVYAAAAAAAAAKsAAAAAAAAAKsAAAAAAAAAFWAAAAAAAAACrA AAAAAAAABVgAAAAAAAAArAAAAAAAAABVgAAAAAAAAAqwAAAAAAAAAVYAAAAAAAAAKsAAAAAAAAAK sAAAAAAAAAFWAAAAAAAAACrAAAAAAAAABVgAAAAAAAABVgAAAAAAAAAqwAAAAAAAAAVYAAAAAAAA AKsAAAAAAAAAKsAAAAAAAAAFWAAAAAAAAACrAAAAAAAAABVgAAAAAAAABVgAAAAAAAAAqwAAAAAA AAAVYAAAAAAAAAKsAAAAAAAAAKsAAAAAAAAAFWAAAAAAAAACrAAAAAAAAABVgAAAAAAAABVgAAAA AAAAAqwAAAAAAAAAVYAAAAAAAAAKsAAAAAAAAAKsAAAAAAAAAFWAAAAAAAAACrAAAAAAAAABVgAA AAAAAABVgAAAAAAAAAqwAAAAAAAAAVYAAAAAAAAAKsAAAAAAAAAKsAAAAAAAAAFWAAAAAAAAACrA AAAAAAAABVgAAAAAAAABVgAAAAAAAAAqwAAAAAAAAAVYAAAAAAAAAKsAAAAAAAAAKsAAAAAAAAAF WAAAAAAAAACrAAAAAAAAABVgAAAAAAAABVgAAAAAAAAAqwAAAAAAAAAVYAAAAAAAAAKsAAAAAAAA AKsAAAAAAAAAFWAAAAAAAAACrAAAAAAAAABVgAAAAAAAABVgAAAAAAAAAqwAAAAAAAAAVYAAAAAA AAAKsAAAAAAAAAKsAAAAAAAAAFWAAAAAAAAACrAAAAAAAAABVgAAAAAAAAArAAAAAAAAABVgAAAA AAAAAqwAAAAAAAAAVYAAAAAAAAAKsAAAAAAAAAKsAAAAAAAAAFWAAAAAAAAACrAAAAAAAAABVgAA AAAAAABVgAAAAAAAAAqwAAAAAAAAAVYAAAAAAAAAKsAAAAAAAAAKsAAAAAAAAAFWAAAAAAAAACrA AAAAAAAABVgAAAAAAAABVgAAAAAAAAAqwAAAAAAAAAVYAAAAAAAAAKsAAAAAAAAAKsAAAAAAAAAF WAAAAAAAAACrAAAAAAAAABVgAAAAAAAABVgAAAAAAAAAqwAAAAAAAAAVYAAAAAAAAAKsAAAAAAAA AKsAAAAAAAAAFWAAAAAAAAACrAAAAAAAAABVgAAAAAAAABVgAAAAAAAAAqwAAAAAAAAAVYAAAAAA AAAKsAAAAAAAAAKsAAAAAAAAAFWAAAAAAAAACrAAAAAAAAABVgAAAAAAAABVgAAAAAAAAAqwAAAA AAAAAVYAAAAAAAAAKsAAAAAAAAAKsAAAAAAAAAFWAAAAAAAAACrAAAAAAAAABVgAAAAAAAABVgAA AAAAAAAqwAAAAAAAAAVYAAAAAAAAAKsAAAAAAAAAKsAAAAAAAAAFWAAAAAAAAACrAAAAAAAAABVg AAAAAAAABVgAAAAAAAAAqwAAAAAAAAAVYAAAAAAAAAKsAAAAAAAAAKsAAAAAAAAAFWAAAAAAAAAC rAAAAAAAAABVgAAAAAAAAArAAAAAAAAABVgAAAAAAAAAqwAAAAAAAAAVYAAAAAAAAAKsAAAAAAAA AKsAAAAAAAAAFWAAAAAAAAACrAAAAAAAAABVgAAAAAAAABVgAAAAAAAAAqwAAAAAAAAAVYAAAAAA AAAKsAAAAAAAAAKsAAAAAAAAAFWAAAAAAAAACrAAAAAAAAABVgAAAAAAAABVgAAAAAAAAAqwAAAA AAAAAVYAAAAAAAAAKsAAAAAAAAAKsAAAAAAAAAFWAAAAAAAAACrAAAAAAAAABVgAAAAAAAABVgAA AAAAAAAqwAAAAAAAAAVYAAAAAAAAAKsAAAAAAAAAKsAAAAAAAAAFWAAAAAAAAACrAAAAAAAAABVg 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 tO17ruu67ruu67ruvOb/VTg1LEPneYYfv8n0PnT0HovQp7HUMwYPQ77oc4PPyL28qCquIaDEYgqm qopqqqlKGqqiqqqqqKq9ZZVPqZzZjAZpKykigSxYiYJEqqqqqqqqq/IMYqqqqqqqiqqqrosYqqqq qqqqqqqqqqqqqKqqpRoVqlGKqqqqqqkqqqqqmqqqqqCqqqqqqqqqqqqqqqqqoqqqqqmKqqqqqqqq qqqqqqqqqpqqqqqoUiDi/PMt7y+Xy+Xy+Xy+Xy+Xy+Xy+Xy+VyuVyuVyqUpSlKUp0dKUpSlKUpSl KUpSlKUpSlKUpSlKUpSlKUpSlKUpeu7XKqIpS3dirbXaWZYu/1WqbG3l7fa29evXrV69sS2JVEX9 srAAauTOEwb1wHI7Ttkxl5c8PePy5yaKlKHiIsoYl/yhcDIFUDQjSlJQlIp1qQGIVpF7mw07W1tb W1tbW1tavObW1tJsURERERETzCIiIiIiIiJ6BERERERERERERAB04AAAAAMZG6kiJvkTd429THRE REtyLV4PZWZF8Hg9uVnZ4w60qUVDQ0BeqTBiKQCGpu4Pvj0h6bOoHOQaUhQfRhMTQDTQjSlIUpQt IUBSFU/N9oncdx3Hcdx3HcXr169evXr169evXr169evXr169evXr169evXr169evXr17KysrKysr KysrKysrKysrfZWVlZWVlZWVlZWVlZWVlZWVwSLNKoiv/Y3N2/fyb9/f37U79+/fv39jrB5y3lkd njWnYC4UIAFAABQAAUAAFIABQAAUAAFAABQAAUAAFAABQAAUAAFAABSAAUoxxEIcSnp7WfrZshzw 4YTBGMAc7hOJmcXbZjtzGQIGYlaoGkHey4lSkQ00g2823t7e3t7e3t7e3t7e3t7e3t7bv5l3d3d2 ZmZmZmZmZuoZmZmZmZmZmZmZmZmZmZmZm9oW2KNvvt0q7puBv8hmZmZS2WN6qJJx5a/3erlYqKoq oKE50Fs8GUjDKH2gggAEmOLgxVVVVVVVVVVVVvcYqqqqqqqqqqIqqqqimmigoKqqqqqqqqqqpKoq gqiqqqqqqqqqqqqqqqqqoiqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqr9lHGKqqqqoiqqqqqqqq qqqqqqqqqqqqqqqiqJVVVVVVVVVRERETzCIiIif0Inm0REREREREREREREREREREREREREREA64j 7GwRLVutzionldra8x2u1tbW1tbWqm1Hl72T4bCUv5OvGDxPa4I4mCK1kWPgfw/HyHOizSn6hGIK iGkHzUjz8CZSiUKxDSFIgebxiEW5u5uas5zntJz8lOc9jOc5znOc5znOc5znOc5znz05+inOc5zn Oc5znOc5ziIiIiIiIiIWI64ikRFItNrBFcnPEnPdbyeRubm5ubm5ubnN2fT8j3VkmrRRXj7Bb9Fl xCPueJk5KnOwBiQKVEPEpzxvkyAzbe3t7e3t7e3t7e3tu7u7u7u7u7v5t3d3d3d3d/Pu7MzMzMzM zM23ZmZmZmZmZmZm2+1lKRPVtl3GKu6VVVcdVVdhyFUpSLXVAuqH/XBiqvAYQXPAr0ciOZIQ/pSc zNc22tZttJJJJJJJJJJJJJJFVVVVfhr92qqqqqqq/gqqr3Poat7vPb6uxsbGxsbGxsbGxrG+11GF X2ZljsiPzoQMpBQz0u2ItZKREAAAAAADMzMzMzMz8wfPGZmZmZmZ22222222222222222yQ+jy9P ly8jly73Lly2dnZ2fu9nZ1e/8R+32ztM5qwqiqwHCRYUfHFuHojAp/XA/3y/OSVANSF7aOTyeTye TyeTyeTxOTyeTweSzeVZmZmZm5ZmZmZmZmZmZmZm6BmZmZmZmVVVVVVVVVVNVUe4k7viO+5fHd3d 3d+OKUpeyqKRF+HY1WJL6ohA2YfwZUfXFMo5QIzpYEw4mqqVVUiqqkUpVSKwREqqqqqqqqqqqqqq qqqqqqqqqqqqqqqoiIiIiIiIideiIiIiIiIiIiIh8jyWx5Paz7Xldra2tra2tra2trV/j37iAlCF PRwYBYodBAKZoAygAoApRctGjRo0aNGjRo0aJJJJJJJIqqqqr8FVVVVVVVVVVVfD+Zv6Vk5/Jvdt tttt7Os1r2O22s1mb3e4X2JTKAnzuDpOSibLJrAcv13+/H33PO3t7e3t7bu7u7MzMzMzMzM3oWZm ZmZmZmZmZmZmZmZmZmZmZmZmZmZmVVW7uiKRVVFIiKTVEX2ZFurFVUqqik/BsSIpFOrc4mLPH4Ez Oc5znOew7cvy7TC3aarHqt1e46axikXki5+Qd5+hnPzD+CMXoCwq1F95yumTlcrlcrlcrlc7yuVz /K4PK5XKpSlKUpSlKUpSlKUpSlKUpT0VKUpSlKUpSlKUpSlKUpSlKUpSlHpSlOu3d27Zu3d/du3b t27du3bu/9bVkkXg9PIvjmZ6szM7bbbbbbbbbbbfsLbbbbZJJJJJJJ8uSSSSSSSSSQvo+k2+Tbbb bbb0dnXL4/5+ZqWJdkRSL/8UuRlVIrOxIpS2UiJERERERERERERERERERERERERERETpURERERER ERERERERERERERERD3Q3NlE3G5RERERE9pbkUuLIqtneMzMzMzM8nJycnJkkkkk+tkkkkkkkkkkk kkkkkkkkkkkkVX8c8N7npZb5Nt69tttt6Ln4vzejwfN+Bmdb8Tw8JbvEkRbSrGIpS1nieVqqIvXS KdiIiIiIjkuR4+IiI5OIiIiIiIiIiIiIiIjnoiIiIiIiIiHd3d3d3d3d8l3d33EO9ndO7u7u7u70 Qt5IqpSl838dgzMzMz1pmZmdtttttttttttttkkkkkkknypJJJJJJJJJIX0ea22222229Gsz+NrP 8PWSSSSSSSSSSSSSKqqqq+eqqqqqqqqqqqqsk4SSSSSSTvTNfT8vmzW2sVVfYKAAAAB5wAAAAAAA AAAAAAABvvvvvv4fB6Oa1rWa1rWjYPIPKcfU4/H4/H4/H4/H4/ca3b2sl6R9Adbkd33Jd091vCM6 LGXb8oSKRERERWZYlW0uTnOc5znOfHTnOc5znOc5znOc5znOc5znOc5znOc5znOc5znOcRHp4iIi IiIg4iIiOveoikUSnVwMSc9zOc5znOc54dl++RVdmVRdEUiKRERERXtjZIgAAAAAAAAAAAAAAAAA AOaAMzMzMzMzMz60zMzMzMzMzMzMzM7YMWRuAAAAABkEWw546PI43d3d3d3d3d3d3d3d0AAfLAAA AAAH4fjnl4fD6PT4fD4fD3/D4VVXMnlc2vkfOz/R4a9Dly5cuXLly5W222222/W/bW22+3tttttt tttttttttttttskkk3/bcree9222223f9fm23Xv32ujyM1nkbfg7eL/zzNakkkknsJJJJJJJPaSS ST7GSSSSfbSSSSSSRVVVVXvqqvoxeCr0qqpn6Xz9Z+91kkkkkkkkkkkkkkkkkkkkiqqqqvyFVVVV VVV3knCSSSSSSZ+Ptn/bo8l5lVVVVVVUAAAAD3wAAAAAAAAAAAAHV+jJOeSSSSeGSf6XxyMvYVSL 5ZF3fm/S9Zv/feCzMzMzccqqqqqqqqq8+q8vyqqqqqqqqqqqqvOqqqqqqqqqqqq9OqqqIiIiJ775 XIB2ayzMzMzMzN/wLXyKUh7XL3nIbLZlIs3VuXdyl64sX2BWOU1RfXxMQsXE9ZZKyRWaiLBYkU5z nOc56yfJTnOc5znOc5znOc5znOc5zn/ROc5znOc5znOc5ziIiIiIiOBERkRERERE8fbb6IiMiIiI iO5LI12w7qReksbLdlrLBasi7HsN9Z7SxrMbZ5VQAAA1o1oAA5EAAAAAAAAAAAGfnTMzMzMzM+sM zMzMzMzMzMzMzMzG63O8AA3QAAti3ItcRep87IrJZ+8/3VVVVVVVX2gAAAAHvgAAAA++AAAAAAAA O3+TrX3UnqSSSSSST8/s5c1nRt5X+JzZ//cuXLly5crbbbbbbb9pbbbfcW222222222222222222 ySSSS/u56k0aO00aNGjRo0aNGp4l1dDq13mbb7T1tnM2tzm8Moy6q3yY7Y55zYSyRYliqX+eK+IX wuHYu62IiIiMaI5OIiIiIiIiIiIiIjzsRERERERERERERDu7u7u79S7u9p3d3d3eMjd7/fxG+x4i IiI+kVspSJd2VVRWLFRFKrYWCxSKUuFLvZdmAAAANgAAAAAAAAAAAAAAZmZmZmZmZn1dtttttttt tttt5X1bbbbbacu19x+VmcNcuX423/Fbbbbbbbfq7bbZJJJJJJJ7+SSSSe9kkkkkkkkkkkkkkklt ttttttn6X2X9LPMzfm8rbPM2z+D7Pjmvj5J15Iqqqqr9oqr7VVVVVVVVVfvVVVVQAAD0e7tb3Fuz t7du3vLdu3bt663h3FurtS6kuZLFL42J7q4Vgu5V1VVVdUqrs1VVVVVVVVVV5dVVVVVVVVVVVVVV VVURETpURERERN8iIiIiInZNvWZmZmZmZmbIkWqkXEL3mTk5OTk5OTJJJJJJJJJJJJJJIqqqqr6C qqqqqqqq/qayqqr4FWSZ5etvY7fuM7PNnu8VVVVVVVAAAAA80AAAAAAD34AAAAAAGl9RXvKqq+6z WeUZnd7PNP9PNZmszMzM8nJJIr5Sqqq+7VVVVVVVVVVVVffqqqAAAD3D0wAAAPcazPT/h/eOa/ob ePbWszxdbJJJ5MknRJJJJJJJJJJJJJJJPt5JJJIqr79VVfVVVVX0snqySSSSSTse5zNttfx/0tsz XDnxzObbWlVVVVVVVVVVVQAAAAPQAA+EAAAAAACAAbu7vhHPsOjjjgAAAqqqqq95VVVVVVVVVVVV VVB863333333333+YdHvtZ/EzOH7DMkkVVVVV92qqqqqq/aKqqqqqqqqAAAGR11/syPsDMzMzMzM zPZfoq2XyJHh6bfdF5LhF61i4eN/OxY/IXxfV9z7Lju12RbKoqpF5bk5VFruR1ReaLu5F8nF2XIa qXJl2NWDBgwYuDBgwYPM4MGDBgwYMGDBgwYMGDBgwYMHn8GDB6bBgwYMGDpMGDBgwYMGC/fv379+ /fv379+/fvi/fv379+/fv379/A+DA2DBawYMGDAmDB7OTW5yaRf9pF8SO+q6+pmZmZmZmZmZmZmZ tozMzMzMzMqqqqqqqqqr1aqqqqqqqqqqqqqqqqqqnlbt2bFZmZmZnd3aW5L1H3OH+pbbbbbexbbb ZJJJPrpJJPu5JJJJJJJJJJJJJJJJJJJJJKqqqqrH9XP6nzJIqqqqr7pVVVVVVVVVVVVVVVAAAAHt KqqqqY4M6XB9Ni+FKRepKl+RVSKqReBiy/PVqp1O74ju7u7u7u7u7u7u7v5l3d3d3d3d3513d3d2 ZmZmZmZmZt6zMzMzMzMz47u7u7u7u7vwcgi9OVXiFbt27du3bt27du3bt27aqqq+2VVAAAAA+KAA AAAAAAACAAAKrNeXtr6XYz9DPxM95ms9prPidaSSSSSSSSRVVVV+vfvFVVVVV96qqqqqqr8hVZPV 9SSSSSSTfr5rOOeOOOOOOPY8cc8fUc+Vxxzz5XHHPG6AAPLAAAAAAACqqqqnw/Q9AekAOfn/7Hse n6fo+k83jxueePwPHtPG73R4vU9TxvU9T1PU9QAAAAAAAAAAAADmAAAAAAADMzMzM7bbfUtttttt t5eH0uXd5cuXLly5cuXLl9I15QAAG7u7u7u7u7u7u7u7oAA80AAAADT4YG7u7rnj8Bzx6/jxufqu OOjSqqqqqgAAAAfdAAAAAAAAAAAAAAACqvdVVV3zNf3m39j2f2fDOzm2fq7Z/I2zhtytttttttvu rbbbbbbbbbbbbbbbbbbbbbbZJJJJJJJ+RnLcDbgAAAAAWtaRceRVcfrpFZqyu01+LIi1ZFIixaiK xItn/a9fn6/kff5w47eO7W222222222222237C22222222SSSSSSSelJJJJJJJL/OeXTy73f7/fA AAHa/L1uTLhF/f8cqrBdsWiTMzMzMzMzMzMzMzMzMzMzMqqqqqqqqqr1Kqqqqqqqqqqqqqqqqqqq qsiIm9REVVVVXG2n4pFryzy/gXYltvnFMv5luC+qX1ixi+GW/1msLSLGsF8csfVlib4sbRLuS0y9 J7qrV5dKUpSlKUpSmz5KlNjTk6UpSlKUpSlOmpSlKUpSlKUpSlKUpSlKUpSnQ0pSlKUpSlN7SlKU p+Xd37+Tfv377379+/fv37+NkSIpEUi7SC1ZftLZFrC44u2Lbl0hIXJasvNSLkLFRF52xIAAAAAA Ac0OTAAAAAAAAAA88AAAAAAAAAAOiBmZ9QZmZmZmeT13xpFtaiIylbqlKW5TVSLVbjFAxrQA4/It AY134ci15VF2UpZRWS2ZtjEIIAB53h5PXwcE4mY4pzmc5zMmc3pHOamORKxiEXcVFK71nIWGZmZm ZmZmZmZmZmZmZm8szMzMzMzMzMzKqqqqqqqr0K7hVVVVVVVVVVUtSbfb/sMVd9vT4HA4HAVV1ew0 y918MpWPB81Y7+X3eCRS7ztpSlL30iq5TnIiIiIiIiIiIiIiIiIiIiId3d3d3d3d36x3d3d3d3d+ hd+pd3d3d3d3d/VpDvZd3txERERGN3hFT48ilLuaS9ZKVUpdjVVP3pSlyUi1/nWZmZmZmZmZlVVV VVVVVVfSKqqqqqqqqqqqqqqqqqqvQqqqqqqqqqqqgVdtZVVtKq7xVVcZSIZZUsJ7zEmAAAAAAANe AAAAAAAAAAAAAAAAAAAAAAAZmZmZmZmZnknb7Lx6qiqVVxVVcdVVVVVxrZbLZZdliQuDcVVVVVVV VVVVVVVVVVVVVVVVVVVVVVVVERERERERETsERERERERERETcGu8VcRVVVVVVV12we9bt27du2qqq qqqqqAAAAB8IAAAAAAAAAADqf3uZJzyTpkkkk4+PPxta0RSkTcYilL3IIAAAAAAGZmZmZmZmZ8+Z mZmdtttttttttttttttttttk3vak55J0ySSScex6n6nNnzc+hma5/c61r+7/da+b9nxtttt8u23s W222222222222222222222234dttpmZmZ2zO6WT+DbImIiJwERERETG2JFIiyu4mWzMzMzM7bbbb bbbbbbbbbbbbbbJJJJJJJPPkkkkkkkkk3v7DMze3yLfBbbbbx/HxzM1Lfx66VkvWW/5/8txKREXn 6pSIuJ9nVa3wPka6UvK1Fz85z1k+OnOc5znOc5zn5Sc5znOc5xEREREREREepiIiIiIiIiOm6GIi IiIiIiIiIhZvt7LvFuIiIiIxmLl7Vq1atWrVq1atWrWPVVVVXuqqqqqqqqqqrzKqqqqzM8FXTV6V VVdX0Xz3PG8foO33Hb29vb29vb29sknlySSSSSSSSSSSSSSSSSSSSSSeeqqqqvUrvJOEk6ZJJJOP 2PV1dXV1dXV1dXV1VVVVVVVVVVVZmZmZmZmZmfN+ZmZmZmZmZmZmZ4LwV3q9Kqqur6j6T8R43PHR zxxzxxyVUtprsPY7Hw9n5X/HEsWfxVbTL8fk+Hry1WxsSLnIiIiIiIiIiIiIiIiIiId3d3d3d3d3 6p3d3d3d3d3d+hd3d3d3d3228d3fd78o3m4xMeIyd9ERERGN7cpFKWulyHEL4F4pSli1SkVUi4XM gAAAAAGZmZmZmZmZ86ZmZmZmZmZmdtttttttvn2222222SQs7vDuydMkkknHy8zWv/vWf4/ts1ma zMzMz1/nZrPdKqqq+WqqqqqqqqqqqqqqqnngB8UAA9YA37esfTedXvqqrx/K/7+vw9fPNkkkkkkk kkkkkkkkkkkkkkiqqqqvynz1VVVVVeqbrzr3Xvqq8f6j1c1mazMzMz3O4B5AAAKqqqqvmKqqqqq8 yqqqqqrwK6R1gHV28888/zvuXHHHHHt93d3d3d0AB9efJgAAAADzAAKq7B0jrC1atWsbJ/DKUiKU i9yR/P43Yy5kAAAAAa8AAAAAAAAAAAAAAAAAAAAAAAz6EzMzMzMzPHMzM7Y24GIAN+AAABjZEthL dW5FKXbVPikRLLmgAAABrwAAAAAAAAAAAAAAADMzMzMzMzM+uM+hMzMzMzMzMzMz9tk1JYREROAi IiIiY3hZf+vtB6XmgAAAAAAAAAAAADMzMzMzMzM+kM+cMzMzM7bbb59tttttttts5W8Lb4LbbbeP P5Wv4es+n9tu7u7u7oAA9yAAAAAHmAAqqx8J8TvDvh2Dq9jr9P83b+Z8K+7kkkkk9jJJJJJJJJJJ JJ7mSSSSSSSSSSK+eqqqvgVV3knCSdMkmjRo0anJ83+iGtyXrX9PAH6UgeR9yf6tLtO/gAdd+1nV VarV/VsfnjYc/YiIiIiIiIjaRERycRERERERERERERDu7u7u7u79E+4d+m6F3d36l3d3d3d3dojf WYiLcREet63ret1eXVVVVVVVVZmZmZmZmZmfK5mZmZmZmZmZmZ5mZmZmZmZmZmZllVelVVdXH9j/ 8fk52O55qqqoAdgAADzgAAAAAAAAAAA88AAA33333338IHc5w7wBu7vV89zzx2+1AHkAAAAAAABV eZVVVddVV2DpHWAdTn2oAAAAAAVVVVVfAqvMqqqqqq7B0jrAOr4HPHtaqqqqqqr4+zMzMzMzMzM9 /mZmZmZmZmZmZmeZmZmZmZmZmZmZ4Kumr0qqq6vJ8ny6qqzMzMzMzMzM+yZmZmZmZmZmZmZmZmZm ZmZmZmeZmZmZmZ2dnZ2dnZ2dmZ6HoZmejmeHw+Hw+Hw8f0/439P+pJJJJOMkkkkkkkkkkkkkkkkk kkkkkiqqqqvfVVW5hbeFt8FtttvH2XR/L7GfnZtrh83bzOGs5tazaSSSSSSSSSSSSSSSSSSSKqqq q/gqqqqqqqq+pO76fpc8k8mSSSTm+dx/6dZ1wAAADd3d3d3QAB78AAAAAAM3d6d3d9Pv7u271fk/ /nHP57yeOjjp59T6x9B969Tly5cuXK2222222+dbbbbbbbbbbbbbbbbbbbbbbbJJJJC28L3761tv rW3ifM/N9dVV6yqqqqqqqqqqqqqqqAAAAB3QAAOp9RedXpVVet83WeR7hyyXkkr0iRERERERERER ERERERERERERERAAAAAAAB1gAAAAAAAAAAAAtoBZAGOOXI5cuXi4v+VMz5n4usy22222222222SS SSSSSe+kkkkkkkkkkkkkkkkkkkkhbeFt8FtttvH1/H/I1n6Hl+LVttskkkkkkk+zkkkkkkkkkkkk kkkkkkkkkkkVVVd5Jwnpzpkkkk4z5nkev9f4ubM/T2zUkknGSSSSSSSSSSSSSSSSSSSSSSRVVVfi K91VVV3nc70nkST1pJJvOsazo1zT9H8vyNeLly5cuXLkAAAAAAAAAAAAAAAZmZmZmZmZn6kzMzMz MzMzMzMzMzMzv27tj3dgi25VMq6tVXHVVVVZsb03E9YpuAvDvdCc6c8oc7Cf7FMnnwSHzNvzJZSl sJFVg+3YiIiIiNdEREREREQ7u7u7u7u7v0bu7u7u7u7u7u7u7u7u7u7u7u7u7u7xv97ZiI3sR63r Xret63Vz8UFVVVVXtqqqqqqqqqqqqqqqrMzMzMzM8FXTV6VVVdXCqvXVVVVVVVVVVVVVVVWZmZmZ mZmZnw8zMzMzMzwX4z0T1w743333636O2u79RVVX2CqqqqqqqqgAAAAfGAAAAAAAAA9Z334b7793 fcbu9X4Lo56Pi8c8bu7u7u7u7u7u7oAA96AAAAAAAz6bw+Hw963bt7y3bt27du3bxrZO0i/3qLrZ EliXrexVVVERERERERETm0TyiIiIiIiIiIiIiIiIiIiIiIiIiIiIiAAAAAAW0AsgDfgAAAYwkVvY EUpZOusyWr6GTk5OTqsnJyZJJJJJJJJJJJJJJJJJJJJIqqqqr6iqqqp6M7ng9WeTO7PBJJJOt2M/ hbXX4f9N+42SIiIiIiIiIiIiIiIiIiIiIiIAAAAAAAOpAAAAAAAAAAAAAAt7VDsWTM9+ZmYAGN+u 5+P8ySSSSSSSSSKqqqq+9VVVVVVVVVVVVVVXeScJJ0ySSSdXhFVVVVXl1VVVVVVVVVVVVVVWZmZm ZmZmeCrpq9Kqqur756/+LrMQOAAAAAAAAAAAAAAbu7oAA+GAAzfT3e9vpb6e7u7uRq/Gl7nX7r8i SqkRVFIS8XAWfLkVVVVVVdgqqqqqqqqqqqqqqqqiIiIiIiIiJ1SIiIiIiIiIiIiIiIieLxeLxd3q 9/xdPxPF4rxeLxer6vq+r6vV+NAAAqqqqq+1VVVVVVVVVVVVVVVdj0DvDrAOr2PH0fRugADywAAA AAAAqqqqrsHSOsA6vi8eE8YAAAAAAAKqqqqvhVVVVV2O+d4d8B4/q88/wOeN3d3d3d3d3d3d3d3d 3d3d3QAB5oAAAAHZp0jvm7u7vVoAAKqqqqvd1VVVVVVVVVVVVVVXYOkdYB1fU/bN54444444+9/Q +N+44/d+04+t9Hqd3d3d3d3W2223zbbbbbbbbb9nbbbbbbbbbbbbbbJJJJJJJO1fR9G89t8Ftttv HsaMzPzNs/j6z1/3l5rbbbbbbbbbbbbbbbbbbbbbbZJJJJJJJ6UkkkkkkkL6Pht8i2+tbbbet2NI AAAAAAAAAAb777777777777nzIAAAADr7NOkem3yN3Q4/kexNeL8Xm1kkkkkkkkiqqqqv3Sqqqqq qqqqqqqqqr1Mk553Z09vb29vb29vb1f+uePf708cAAD7GAAAB9nAAAFVVVVV2DpHogHV7Tnj2Hse LjjffeNxx+b6d3d3d3d3d3d3d3d3d3d3d3d3d3d35Pd3QAB8IAb/K333337edWtZrbuZtrMw8PA8 j1Q74AB1uj/A21+3z+F9D+Dns/udTN2On8nihveTjBE8uPkfqZu070mc6PosasDpG+PFJ8VMnElq yqIv3Xbt27du3bt27du+Xu3bt27d5W7du3bt27du3bt25cuXLly5cuXPTXOeuXPVXLly5cuXLly5 cuXLly5cuXLly5cuXLm2uXLly5tpSKV3bbrcYlzedtr9v2/b9v2/b9v2+pwjQl84/8D7I+fhMEUY DARgMQYIMODIMnIiIyMjGDLIjBkYJmoyKiKwVmxYKorBVVeplK9JmZmZmZmZmZmVVVVVVVeVVV9G qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqGqrZVVx1VVVVXG48pFLhUkXryLJKUzMzMzMzMzMz6Lbbb bbbbbbbbbbbbbbbbbbbZJJJJJJIz0/U1bee29a2223j/aafh59r/3cP32s2kkkkkkkkkkkkkkknu JJJJJJJFVfvVVV7aqqqqqz05JJJJJJPL6+d3fX09sz8XOj/W1rOG2szNa+pbbbfKtttttttttttk kkkkkknw5JJJJJJJJJJJJJJJJ2yd6Ni2PLZ9jtdPY2NjY2NjY2NTHH1hfa+jwAvbUEgealQkSIiI iIiIiIgAAAAAAA9CAAAAAAAAAAAAAAAAAAAAAAAZ9dbMhULIA4AAAB7Opqj5kPMYAfx4RB+pQSJy bRo0tGjRo0aNGjRo0cKSSSSSSSSSSSSSSSSSSSSSSRVVVVXde1v6Uk55J0ySSScezmZ2dta1rbbW ta1m22szWtfPVVVVVVVVVVVVVVVAAAAA+WAAAAAB2/yt51Sc8nl9GjRo0aNGjU1kDrPQYAXYJUTB J5tIRTZ2dkAAAAAAAAAAAAAGZmZmZmZmZ9KZmZmdttvwrbbbbbbbbbe3vyk4SXwW2228ejWtc888 7u7u7u7u7oAA90AAAAAAAFXn9g6R1gN+PRrM1mfKvNrNZrWO33yqqqq9Cr9WqqqqqqqvnKqqqqqA AAAB4QO31K8Fe+qqvHozM1rM/f7a1rM0qqqqqqqqqqqqqqqAAAAB8oAAAAAA7fU9S8699VVePp+4 +L7Hm9nn+38TmzXNsBiXEJ+TpYUB+PAB72H4siJ9HkcjkcjkcjkcjkKq7RVVVVVVVVVVeWRPOIiI iIiInToiIiIiIiIiInp0RERERERERETr8lUSyiratKqqqrjW5SLYyKReNrNszWazm2zWtZnu9szN ZkkkkkkkVVVVV94qqqqqqqqqr56qqqqoB2upXgr31VV49H1Nv5O2f8f4focMzPp7Zmbba1n09s8X jd5kHFP2DA89AvwSE8+IIABOeAehgKVDEKB3kA8Dg4Tt7gbm5ubm5ubm5ubm5ucHc3Nzc3Nzc3Jz nOc5z8xPm5znOc5znOc5znOc5znOc5znEREREREREQkREbXR7Cq5c3WJvblw7ly5cuXLlzG7LY+c lsyKqoi9HKoiL0VRF4SBoLGAs2A8JBiRR+zhVNRINGjRo0SSSSSSSSSSSST6+SSSSSSfc/c/cySS SSTz/lySSSSSSSSSds9Ik55OmSSSTj0ZrM1rkKh56B1YExD+KC5CiqrhKBNZbbbbbbbbbbbbbbJJ JJJJJPgySSSSSSSSSSSSSSSSSdsvpThbfBbbbbx6M1rWvdfkc2ZrNa/6ttszbM1rM/Tttttttkkk kkkknvJJJJJJJJJJJJJJJJ8KSSSSSSRVe3vJOEk6ZJJJOPldH422s1rX7XbWazNZdtsyopFJ5LVY 75ERERERETXoiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIAAAAAAALQAA680TeWURPD4vF4vF4vF4vFx 6/RmZrWTbNZrNfuttZrWpJJJJJJJJJJJJJJJJJJJJIqqqqr+Eqqqqqqr295tJJ3+mSSSTj1+jWZm fP21l2zNZr/s21mszWW2222222222222SSSSSSSfAkkkkkkkkkkkkkkkkkkkvct57enwW2228fi9 Ga1rX6H+hzZrWa1nk9nObWs99JJJJJFVVVVft19wqqqr9oqqqqqqqqqqAB2t19Lgr0qq9Tx+J+H2 PMzo2zWbbZmc22azWfm5PstuGZmZmuW1ttttt9lbbbbbbbbb7q2222222222222z4Ekkkkkk9aSS Tt+nb6vC2+C2223j8Ts61rWvnZtrMzM+s2zWf1u2s1mtSSSSSSSSSSSSSSSfYySSSSRVVVVX8JVV VVX5Kqvb3jOEk6ZJJJOP0M+L5mKu0SnmhRlYhVfbauTkgnmNnZ2dnZ2dnT2dkAAAAAAAAzPljMzM zMzPojMzMzMzMzMzMzMzMzMzMzMzMzPa2wYsjdDfgAAAY3T7EiIpSK3Vma22221m2222ZrWlVVUA AAADzgPbgAAAAAAAAAAAAAb7777779rwgcAO8AAHH4nZ1ma1mva6zbWazFzM5lVVX2Sqqqqqr9gq qqqqqqqoAAAegB3wADt9SvBXvqqrx6M07bba1muDVKUu8qIpSIa/FlZKREUi3oAAAAHHAAAAAAAA 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 VVgzMzlt+fJzySSSSSSSSSSSSSSSSSSSSSSKqqqq+kqqqqvb7e89aTnknrSSbydbo12c1mZ7LWba zWtZoAAAAAAAA3d3d3QAB5oAAABvvvv2vWN9+Hp7797cAA4/I5ZmZ5m2bbazbNazWbZmZmba1rNa /9NZtrWtZzazWtZmta1sqqqqqoH9GAAAH3QAAAAAAAAAAAAAAB2upXgr31VV4/J7OtazD9nmbZzZ rWs1n7vM1rbNZrIqqqqr7lX9YqqqqqqqqqqqqqqAAAAB8v6zNa1rNa1rXV/ZzhmZqTyJJ0ySSScf a+zzWta1q7HMAAAAbu7u7u7u7u7u7u7u7u7u7ug+aAHwgfNADz+zfux3h3wHj+Vzzzzxxx28c9HH HHHG2ZtmZrM7G2s5ttfnKqqqqqqqqqqAAAAB8MAAAAAAAAAA7fc6tnRlr5tfX1/L6NGjRo0aNGpw DWAPeQD6sj9UoGlKWUU91J7GDSk1ZA7qTIgQ7GVDPxNtyli1VFURfJ/hy0REREREREREO7u7u7u7 u79A7u7u7u7+hd3d3d3d3d3d3d3d3d3fqnd3fao7dhZbdb203J5PJ5PJ5PJ1NUVeASm5K6AhQTcs vda+vr6+vr6+vr66q+YqqqqqqqqqqqqqqqgAAAAHb7ivBXvqqrx+R++8yba1rPnba0h7S8njFUlV VVVVVVVVVVVVVVQgGaClFNratnZ2dnZ2dnZ2dnZ2dnZ4mzsgDyoAAAAAAAAAAAAMzMzMzMzMz25m ZmZmZmZmZ7XKTdIiIiIiIiImu6z/mWzIpSIiMqilIiL2G22Ztma1nRJJJJJJJJJJPaSSSSRVVVVX 9eqqqqqqqqqqvb6ovp869K9Kq8fpTzNa1mZ8XWtbazWZqba1maySSSSSSSKqqqr7f7lVVVVVVVVV VVVVVVPl9SvBXvqqrx6NZmZm+2ta1rNtszWszn2zWZNgAAAAOgAAAAADd3d3d3d3d3d3d3d3d3QA BPPzd3gB3wAOo49GZrMM1trWZmO2ZmtZiqqqqqqqqqqqqqqqAAAAB2gAAAAA7XU+Fede+qqvH1+z mfstZtrWa+jtmtazWdnbNZmvmW22222222222222ySSSSSST4ckkkkkkkkkkkkkkkk7ZfSmWjRsd rsbGxsbGxsbGpsGsAGrKp/gIIABIciWRFIv1gAAAAAAAzMzMzMzMzPnzMzMzMzMztttttttttttt ttttsnbb6l4W3wW23Y2NjU1VV/sSUU5fA2HJHnKGFE5FsbGxsbGxsbFttt6Lbbbbbbbbbbbbbbbb bbbbbbZJJJJJJIzt9stvC92+C2223j+d2c1rWtZ9LbMzMy7W2222222222222222222222ySSSSS STtySSSSSSSSdspbz2+C2223j0O2a1rWtKqqqqqqqqqgAAAAfBAAAAAAAAAAAO34UOAvfVVXj0Zr P/zbWazWtKqqqqAAAAB9uAAAAAAAAAAAAAAAb779rwgcAO8AAHHozWta/gbZmZrX6u22ZtrMz67b Na1q7T9S2222229FttttttttttttttttttttttskknxpJJJN5J6Je5bz23wW2228exrs61rNZn1N szNZr4yqqqqqqqqr7VVVVVUAAAAD5QAAAAAB2pv/zX71t8m3wW2228ex9/tn1Wa1mv8XWba1ou6/ qsFIil4kiq52RVSIpSlclKopeUVVVVVVVVVVVVVVVVVVVeYVVVVVVVVXp1VVVVVVXoFVVVVVVVVV VVVVVXa9+e71aJiKq46qqqqrje/ItnIpSItnURFKRYks21rNZ5u2ta1kkkkkkkVVVVV+4VVVVVVV VVVfgKqqqr4QO11K8FelVV349Ga1rWtTYAAAA8sAAAAN3d3d3d3d3d3d3d3d3d3d0AAeA337fhA4 Ad4AAOPodnWta1rR7gAAAAADd3d3fsG7u7u7u7u7u6AAPnB9tBvvvvvvvvvvv2/Cez5gA7wAAcex r0NeZdszNZmvuNa2zWs0qqqqqqqqvtkAAAAD4IAH60AAAD4YAAAAAPcXnV76qq8fQ10azMzPh7Zm taz/r2z8TsXVtttttskkkkkk9vPeSSe6kkkkkkkkkkkkkkkkkkkkiq7yThPUnTJJJJx+Nm2s1d/s szWviZmtb7777777j6yAA+RB9hAAAAfLVVVVVenVXZ7vjnnnnjnnnnkd4dYBx6MzNfG1h8nWfysz WKqqqqqq/VqvtVV+xVVVQAAAAPkgAAAAAAdX3iPOr31VV49GY6deyVVVVVVVVX2wAAAAH64AAAAA AAAAAAA7ms6keC93vqqrx9D6Os8zMVVVUAAAAPrfOAAAAAAAAAAAAAN3d3QM3d6d3e/u7u7u9Xnf A548IAPXgA+PPkAAAAAFVVVVXfqq7B0jrAOrzvpefi/S8dvb29vb29vb29vbJJJJJJJPbSSSSSSS RVVVVX5KqqqqqqrvJOEk6ZJJJOPxvoAAAAAAAAAAAAAB78AAAAAAAAAAAAOruBwA7wAAcexy/aYq qqgAAAAfWgAAAAAAAAAAbu7u7u7u6Azd3p3d7+7u7u71ed4QA8gAAfIAAAAAVVVVVddVV2DpHWAd Xdx5PHbzx/t4455nCSSSSSSSSSSSSSSSSSSSRVVVVX5Cqqqqqqqz1JPSknkySSSf3PI1VV1ZFYhV oVaFWhVopRaFWhVoVaGlRoVaFWhVoSlBoVaFWhVoWlUoVaFWhVoQpRKFWhVoVaFKVChVoVaFWhGl AoVaFWhVoVpVoVaFWhVoQKUaFWhVoVaFClShVoVaFWhEpQoVaFWhVoVKVoVaFWhVoQaUoVaFWhVo UaWhVoVaFWhFpoVaFWhVoVaFWhVoVaFWmhFoVaFWhVpaFGhVoVaFWlKEGhVoVaFWlaFShVoVaFWl ChEoVaFWhVpUoUKFWhVoVaUaEChVoVaFWlWhWhVoVaFWlAoRoVaFWhVpUKFKFWhVoVaUShChVoVa FWlUoWhVoVaFWlBoShVoVaFWlRoaFWhVoVaUWihVoVaFWhViRWhVoVaFWgpBaFWhVoVaApEaFWhV oVaBpAaFWhVoVaAKRShVoVaFWgSkEoVaFWhVoBpEKFWhVoVaBaQChVoVaFWgApFoVaFWhVoEKQaF WhVoVaASkShVoVaFWgUpAoVaFWhVoAaRoVaFWhVoEaQoVaFWhVoBaShVoVaFWgVqhVoVaFWhVqgV oVaFWhVpKAWhVoVaFWkKBGhVoVaFWkaAGhVoVaFWkCgUoVaFWhVpEoBKFWhVoVaQaBChVoVaFWkW gAoVaFWhVpAKBaFWhVoVaRCgGhVoVaFWkEoEoVaFWhVpFKAKFWhVoVaQGgaFWhVoVaRGgKFWhVoV aQWgoVaFWhVpFYhVoVaFWhVopRaFWhVoVaGlRoVaFWhVoSlBoVaFWhVoWlUoVaFWhVoQpRKFWhVo VaFKVChVoVaFWhGlAoVaFWhVoVpVoVaFWhVoQKUaFWhVoVaFClShVoVaFWhEpQoVaFWhVoVKVoVa FWhVoQaUoVaFWhVoUaWhVoVaFWhFpoVaFWhVoVaF1rbbNa1rbbMzMAAAAAAAA3333333333B8qAA AAAAG+h8PpAAAA4/T5ZmdjNs21mbfR9Dm/iSSSSKqqqq+cr7ZVVVVVVVVVVVVVUAAN19Pgr31VV4 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 --00248c6a84caa3c24a04ca38e597-- From sandeen@redhat.com Fri Sep 21 11:46:38 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8LGkc9Z230515 for ; Fri, 21 Sep 2012 11:46:38 -0500 X-ASG-Debug-ID: 1348246072-04cbb07ce45dea80001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 6wEQSxsRgiBjADFP; Fri, 21 Sep 2012 09:47:52 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8LGlpng032689 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 21 Sep 2012 12:47:51 -0400 Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id q8LGlnjK012632 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Fri, 21 Sep 2012 12:47:50 -0400 Message-ID: <505C9A35.5000404@redhat.com> Date: Fri, 21 Sep 2012 11:47:49 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20120907 Thunderbird/15.0.1 MIME-Version: 1.0 To: Ben Myers CC: xfs-oss Subject: Re: [PATCH] xfstests: add _require_freeze and minor cleanups References: <505A4D04.2080105@redhat.com> <20120921163827.GA1140@sgi.com> X-ASG-Orig-Subj: Re: [PATCH] xfstests: add _require_freeze and minor cleanups In-Reply-To: <20120921163827.GA1140@sgi.com> X-Enigmail-Version: 1.4.4 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1348246072 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com On 9/21/12 11:38 AM, Ben Myers wrote: > Hey Eric, > > On Wed, Sep 19, 2012 at 05:53:56PM -0500, Eric Sandeen wrote: >> More filesystems have grown freeze capability, so rather than >> hardcoding several in _supported_fs, make tests 068 and 280 >> generic and then add a new _require_freeze() which checks whether >> the fs under test can be frozen before beginning the test. >> >> Minor other cleanups to 280: >> - remove extra _supported_fs line >> - clear $seq.full before beginning >> >> Signed-off-by: Eric Sandeen >> --- >> >> diff --git a/068 b/068 >> index b595d1d..617420c 100755 >> --- a/068 >> +++ b/068 >> @@ -51,10 +51,11 @@ trap "_cleanup" 0 1 2 3 15 >> . ./common.filter >> >> # real QA test starts here >> -_supported_fs btrfs ext3 ext4 xfs >> +_supported_fs generic >> _supported_os Linux IRIX >> >> _require_scratch >> +_require_freeze >> >> echo "*** init FS" >> >> diff --git a/280 b/280 >> index 55849ed..5e26173 100755 >> --- a/280 >> +++ b/280 >> @@ -45,13 +45,15 @@ _cleanup() >> >> _require_scratch >> _require_quota >> +_require_freeze >> >> # real QA test starts here >> >> # Modify as appropriate. >> -_supported_fs generic >> _supported_os Linux >> -_supported_fs ext3 ext4 xfs >> +_supported_fs generic >> + >> +rm -f $seq.full >> >> umount $SCRATCH_DEV 2>/dev/null >> _scratch_mkfs >> $seq.full 2>&1 >> diff --git a/common.rc b/common.rc >> index 602513a..0e8a306 100644 >> --- a/common.rc >> +++ b/common.rc >> @@ -1758,6 +1758,15 @@ _require_btrfs() >> [ $? -eq 0 ] || _notrun "$BTRFS_UTIL_PROG too old (must support $cmd)" >> } >> >> +# Does freeze work on this fs? >> +_require_freeze() >> +{ >> + xfs_freeze -f "$TEST_DIR" >/dev/null 2>&1 >> + result=$? >> + xfs_freeze -u "$TEST_DIR" >/dev/null 2>&1 >> + [ $result -eq 0 ] || _notrun "$FSTYP does not support freezing" >> +} >> + > > Pretty good idea to generalize _require_freeze. It looks like xfs_freeze is a > script that uses xfs_io which uses xfsctl XFS_IOC_FREEZE. So isn't what you > have here xfs specific? It wouldn't work for the other filesystems that > implement s_op.freeze_fs: It got elevated to a generic ioctl: fs/xfs/xfs_fs.h: /* XFS_IOC_FREEZE -- FIFREEZE 119 */ /* XFS_IOC_THAW -- FITHAW 120 */ to: include/linux/fs.h: #define FIFREEZE _IOWR('X', 119, int) /* Freeze */ #define FITHAW _IOWR('X', 120, int) /* Thaw */ -Eric > 1 1502 btrfs/super.c <> > .freeze_fs = btrfs_freeze, > 2 804 ext3/super.c <> > .freeze_fs = ext3_freeze, > 3 1238 ext4/super.c <> > .freeze_fs = ext4_freeze, > 4 1578 gfs2/super.c <> > .freeze_fs = gfs2_freeze, > 5 760 jfs/super.c <> > .freeze_fs = jfs_freeze, > 6 688 nilfs2/super.c <> > .freeze_fs = nilfs_freeze, > 7 620 reiserfs/super.c <> > .freeze_fs = reiserfs_freeze, > 8 1536 xfs/linux-2.6/xfs_super.c <> > .freeze_fs = xfs_fs_freeze, > > Maybe it would be better if we had some kind of interface to test whether > .freeze_fs is defined (if there isn't one already) rather than freeze and thaw > to find out. Oddly freeze_super seems to just return 0 when .freeze_fs is not > defined. > > Regards, > Ben > From bpm@sgi.com Fri Sep 21 14:58:11 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8LJwBSp244033 for ; Fri, 21 Sep 2012 14:58:11 -0500 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay3.corp.sgi.com (Postfix) with ESMTP id 2E364AC005; Fri, 21 Sep 2012 12:59:22 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id B86194266DC; Fri, 21 Sep 2012 14:59:21 -0500 (CDT) Date: Fri, 21 Sep 2012 14:59:21 -0500 From: Ben Myers To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH] xfstests: add _require_freeze and minor cleanups Message-ID: <20120921195921.GB1140@sgi.com> References: <505A4D04.2080105@redhat.com> <20120921163827.GA1140@sgi.com> <505C9A35.5000404@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <505C9A35.5000404@redhat.com> User-Agent: Mutt/1.5.20 (2009-06-14) On Fri, Sep 21, 2012 at 11:47:49AM -0500, Eric Sandeen wrote: > On 9/21/12 11:38 AM, Ben Myers wrote: > > Hey Eric, > > > > On Wed, Sep 19, 2012 at 05:53:56PM -0500, Eric Sandeen wrote: > >> More filesystems have grown freeze capability, so rather than > >> hardcoding several in _supported_fs, make tests 068 and 280 > >> generic and then add a new _require_freeze() which checks whether > >> the fs under test can be frozen before beginning the test. > >> > >> Minor other cleanups to 280: > >> - remove extra _supported_fs line > >> - clear $seq.full before beginning > >> > >> Signed-off-by: Eric Sandeen > >> --- > >> > >> diff --git a/068 b/068 > >> index b595d1d..617420c 100755 > >> --- a/068 > >> +++ b/068 > >> @@ -51,10 +51,11 @@ trap "_cleanup" 0 1 2 3 15 > >> . ./common.filter > >> > >> # real QA test starts here > >> -_supported_fs btrfs ext3 ext4 xfs > >> +_supported_fs generic > >> _supported_os Linux IRIX > >> > >> _require_scratch > >> +_require_freeze > >> > >> echo "*** init FS" > >> > >> diff --git a/280 b/280 > >> index 55849ed..5e26173 100755 > >> --- a/280 > >> +++ b/280 > >> @@ -45,13 +45,15 @@ _cleanup() > >> > >> _require_scratch > >> _require_quota > >> +_require_freeze > >> > >> # real QA test starts here > >> > >> # Modify as appropriate. > >> -_supported_fs generic > >> _supported_os Linux > >> -_supported_fs ext3 ext4 xfs > >> +_supported_fs generic > >> + > >> +rm -f $seq.full > >> > >> umount $SCRATCH_DEV 2>/dev/null > >> _scratch_mkfs >> $seq.full 2>&1 > >> diff --git a/common.rc b/common.rc > >> index 602513a..0e8a306 100644 > >> --- a/common.rc > >> +++ b/common.rc > >> @@ -1758,6 +1758,15 @@ _require_btrfs() > >> [ $? -eq 0 ] || _notrun "$BTRFS_UTIL_PROG too old (must support $cmd)" > >> } > >> > >> +# Does freeze work on this fs? > >> +_require_freeze() > >> +{ > >> + xfs_freeze -f "$TEST_DIR" >/dev/null 2>&1 > >> + result=$? > >> + xfs_freeze -u "$TEST_DIR" >/dev/null 2>&1 > >> + [ $result -eq 0 ] || _notrun "$FSTYP does not support freezing" > >> +} > >> + > > > > Pretty good idea to generalize _require_freeze. It looks like xfs_freeze is a > > script that uses xfs_io which uses xfsctl XFS_IOC_FREEZE. So isn't what you > > have here xfs specific? It wouldn't work for the other filesystems that > > implement s_op.freeze_fs: > > It got elevated to a generic ioctl: > > fs/xfs/xfs_fs.h: > /* XFS_IOC_FREEZE -- FIFREEZE 119 */ > /* XFS_IOC_THAW -- FITHAW 120 */ > > to: > > include/linux/fs.h: > #define FIFREEZE _IOWR('X', 119, int) /* Freeze */ > #define FITHAW _IOWR('X', 120, int) /* Thaw */ Ah, great. I see it now. It looks like test 119 is also using freeze. Should that one also _require_freeze? Reviewed-by: Ben Myers From bpm@sgi.com Fri Sep 21 15:07:14 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_45 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8LK7ETB245033 for ; Fri, 21 Sep 2012 15:07:14 -0500 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7B77A8F8035; Fri, 21 Sep 2012 13:08:25 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 687524266DC; Fri, 21 Sep 2012 15:08:25 -0500 (CDT) Date: Fri, 21 Sep 2012 15:08:25 -0500 From: Ben Myers To: Tao Ma Cc: xfs@oss.sgi.com, Eric Sandeen Subject: Re: [PATCH] xfstests: 275, Don't remove all the files in SCRATCH_MNT. Message-ID: <20120921200825.GC1140@sgi.com> References: <1347620592-3420-1-git-send-email-tm@tao.ma> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1347620592-3420-1-git-send-email-tm@tao.ma> User-Agent: Mutt/1.5.20 (2009-06-14) On Fri, Sep 14, 2012 at 07:03:12PM +0800, Tao Ma wrote: > From: Tao Ma > > After the volume is mkfsed, it should have no other files that > need to be rmed. And what's more, it makes ext4 complain since > lost+found is also removed. > > So remove this useless "rm -rf $SCRATCH_MNT/*". > > Cc: Eric Sandeen > Signed-off-by: Tao Ma Committed to git://oss.sgi.com/xfs/cmds/xfstests.git, master branch. From bpm@sgi.com Fri Sep 21 15:07:51 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8LK7pEI245127 for ; Fri, 21 Sep 2012 15:07:51 -0500 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1F1DFAC005; Fri, 21 Sep 2012 13:09:02 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id C1DC04266DC; Fri, 21 Sep 2012 15:09:01 -0500 (CDT) Date: Fri, 21 Sep 2012 15:09:01 -0500 From: Ben Myers To: Mark Tinguely Cc: Brian Foster , xfs@oss.sgi.com Subject: Re: [PATCH] xfstests: fix TEST_MNT typos (should be TEST_DIR) Message-ID: <20120921200901.GD1140@sgi.com> References: <1347894935-1495-1-git-send-email-bfoster@redhat.com> <50589E53.2050407@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50589E53.2050407@sgi.com> User-Agent: Mutt/1.5.20 (2009-06-14) On Tue, Sep 18, 2012 at 11:16:19AM -0500, Mark Tinguely wrote: > On 09/17/12 10:15, Brian Foster wrote: > >We mistakenly use TEST_MNT in tests 222 and 253, which is undefined. > >Replace these two instances with TEST_DIR. > > > >Signed-off-by: Brian Foster > >--- > > Good catch. > > Reviewed-by: Mark Tinguely committed to git://oss.sgi.com/xfs/cmds/xfstests.git, master branch. From sandeen@redhat.com Fri Sep 21 15:19:34 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8LKJX2t245847 for ; Fri, 21 Sep 2012 15:19:34 -0500 X-ASG-Debug-ID: 1348258846-04cb6c5686507050001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 09pzwB5iPuEDWAoM; Fri, 21 Sep 2012 13:20:47 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8LKKk9B004340 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 21 Sep 2012 16:20:46 -0400 Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q8LKKjqg022857 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Fri, 21 Sep 2012 16:20:46 -0400 Message-ID: <505CCC1D.4000203@redhat.com> Date: Fri, 21 Sep 2012 15:20:45 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20120907 Thunderbird/15.0.1 MIME-Version: 1.0 To: Ben Myers CC: xfs-oss Subject: Re: [PATCH] xfstests: add _require_freeze and minor cleanups References: <505A4D04.2080105@redhat.com> <20120921163827.GA1140@sgi.com> <505C9A35.5000404@redhat.com> <20120921195921.GB1140@sgi.com> X-ASG-Orig-Subj: Re: [PATCH] xfstests: add _require_freeze and minor cleanups In-Reply-To: <20120921195921.GB1140@sgi.com> X-Enigmail-Version: 1.4.4 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1348258846 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com On 9/21/12 2:59 PM, Ben Myers wrote: > On Fri, Sep 21, 2012 at 11:47:49AM -0500, Eric Sandeen wrote: >> On 9/21/12 11:38 AM, Ben Myers wrote: >>> Hey Eric, >>> ... >>> Pretty good idea to generalize _require_freeze. It looks like xfs_freeze is a >>> script that uses xfs_io which uses xfsctl XFS_IOC_FREEZE. So isn't what you >>> have here xfs specific? It wouldn't work for the other filesystems that >>> implement s_op.freeze_fs: >> >> It got elevated to a generic ioctl: >> >> fs/xfs/xfs_fs.h: >> /* XFS_IOC_FREEZE -- FIFREEZE 119 */ >> /* XFS_IOC_THAW -- FITHAW 120 */ >> >> to: >> >> include/linux/fs.h: >> #define FIFREEZE _IOWR('X', 119, int) /* Freeze */ >> #define FITHAW _IOWR('X', 120, int) /* Thaw */ > > Ah, great. I see it now. It looks like test 119 is also using freeze. Should > that one also _require_freeze? Since it's xfs-specific, I didn't think it was necessary, but it could. -Eric > Reviewed-by: Ben Myers > From bpm@sgi.com Fri Sep 21 16:21:14 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8LLLEik251233 for ; Fri, 21 Sep 2012 16:21:14 -0500 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay3.corp.sgi.com (Postfix) with ESMTP id A69F4AC004; Fri, 21 Sep 2012 14:22:25 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 3CEBA4266DC; Fri, 21 Sep 2012 16:22:25 -0500 (CDT) Date: Fri, 21 Sep 2012 16:22:25 -0500 From: Ben Myers To: Carlos Maiolino Cc: xfs@oss.sgi.com Subject: Re: [PATCH 0/6 V4] inode32/inode64 allocation changes Message-ID: <20120921212224.GE1140@sgi.com> References: <1348147961-7520-1-git-send-email-cmaiolino@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1348147961-7520-1-git-send-email-cmaiolino@redhat.com> User-Agent: Mutt/1.5.20 (2009-06-14) Hey Carlos, On Thu, Sep 20, 2012 at 10:32:35AM -0300, Carlos Maiolino wrote: > This patch set adds inode64 as the default allocation mode, but also includes 2 > patches to remove duplicated code and another one to make inode32 able to be > remounted. > > NOTE: This patch has as dependency "Make inode64 a remountable option" patch. > > V4 properly set pagf_metadata in patch 5 > > V3 has a better factoring of each patch goal, including other dchinner's > suggestions in V2. > Also it contains a fix in how m_agirotor reset is made (patch 01) that I've > found while doing tests with these patches. > > Carlos Maiolino (6): > xfs: Fix m_agirotor reset during AG selection > xfs: make inode64 as the default allocation mode > xfs: reduce code duplication handling inode32/64 options > xfs: Fix mp->m_maxagi update during inode64 remount > xfs: add inode64->inode32 transition into xfs_set_inode32() > xfs: Make inode32 a remountable option > > fs/xfs/xfs_ialloc.c | 2 +- > fs/xfs/xfs_mount.c | 43 +++---------------- > fs/xfs/xfs_super.c | 117 ++++++++++++++++++++++++++++++++++++++++------------ > fs/xfs/xfs_super.h | 2 + > 4 files changed, 99 insertions(+), 65 deletions(-) This patch does not apply cleanly on the master branch. What are you running? Thanks, Ben From bpm@sgi.com Fri Sep 21 16:33:22 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8LLXM6m252178 for ; Fri, 21 Sep 2012 16:33:22 -0500 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay3.corp.sgi.com (Postfix) with ESMTP id 368BAAC002; Fri, 21 Sep 2012 14:34:36 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id D7C934266DC; Fri, 21 Sep 2012 16:34:35 -0500 (CDT) Date: Fri, 21 Sep 2012 16:34:35 -0500 From: Ben Myers To: Carlos Maiolino Cc: xfs@oss.sgi.com Subject: Re: [PATCH 0/6 V4] inode32/inode64 allocation changes Message-ID: <20120921213435.GF1140@sgi.com> References: <1348147961-7520-1-git-send-email-cmaiolino@redhat.com> <20120921212224.GE1140@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20120921212224.GE1140@sgi.com> User-Agent: Mutt/1.5.20 (2009-06-14) On Fri, Sep 21, 2012 at 04:22:25PM -0500, Ben Myers wrote: > On Thu, Sep 20, 2012 at 10:32:35AM -0300, Carlos Maiolino wrote: > > This patch set adds inode64 as the default allocation mode, but also includes 2 > > patches to remove duplicated code and another one to make inode32 able to be > > remounted. > > > > NOTE: This patch has as dependency "Make inode64 a remountable option" patch. > > > > V4 properly set pagf_metadata in patch 5 > > > > V3 has a better factoring of each patch goal, including other dchinner's > > suggestions in V2. > > Also it contains a fix in how m_agirotor reset is made (patch 01) that I've > > found while doing tests with these patches. > > > > Carlos Maiolino (6): > > xfs: Fix m_agirotor reset during AG selection > > xfs: make inode64 as the default allocation mode > > xfs: reduce code duplication handling inode32/64 options > > xfs: Fix mp->m_maxagi update during inode64 remount > > xfs: add inode64->inode32 transition into xfs_set_inode32() > > xfs: Make inode32 a remountable option > > > > fs/xfs/xfs_ialloc.c | 2 +- > > fs/xfs/xfs_mount.c | 43 +++---------------- > > fs/xfs/xfs_super.c | 117 ++++++++++++++++++++++++++++++++++++++++------------ > > fs/xfs/xfs_super.h | 2 + > > 4 files changed, 99 insertions(+), 65 deletions(-) > > This patch does not apply cleanly on the master branch. What are you running? Never mind. I needed Message-Id: <1345238378-10123-1-git-send-email-cmaiolino@redhat.com> Regards, Ben From ling@slac.stanford.edu Fri Sep 21 16:47:45 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8LLljw6253705 for ; Fri, 21 Sep 2012 16:47:45 -0500 X-ASG-Debug-ID: 1348264139-04bdf0067d5075c0001-NocioJ Received: from nospam3.slac.stanford.edu (nospam3.slac.stanford.edu [134.79.18.80]) by cuda.sgi.com with ESMTP id kslka6RRxXYs0wbP (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 21 Sep 2012 14:48:59 -0700 (PDT) X-Barracuda-Envelope-From: ling@slac.stanford.edu X-Barracuda-Apparent-Source-IP: 134.79.18.80 Received: from mailgate04.slac.stanford.edu (mailgate04.slac.stanford.edu [134.79.102.8]) by nospam3.slac.stanford.edu (8.14.4/8.14.4) with ESMTP id q8LLmwOD031636 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Fri, 21 Sep 2012 14:48:58 -0700 (envelope-from ling@slac.stanford.edu) Received: from [134.79.72.90] (pcds108.slac.stanford.edu [134.79.72.90]) (Authenticated sender: ling) by mailgate04.slac.stanford.edu (Postfix) with ESMTP id 702442E2EDC for ; Fri, 21 Sep 2012 14:48:58 -0700 (PDT) Message-ID: <505CE0CA.6090005@slac.stanford.edu> Date: Fri, 21 Sep 2012 14:48:58 -0700 From: Ling Ho User-Agent: Mozilla/5.0 (X11; Linux i686 on x86_64; rv:8.0) Gecko/20111105 Thunderbird/8.0 MIME-Version: 1.0 To: xfs@oss.sgi.com Subject: RHEL 6.x xfs mount causing panic after forced shutdown Content-Type: text/plain; charset=ISO-8859-1; format=flowed X-ASG-Orig-Subj: RHEL 6.x xfs mount causing panic after forced shutdown Content-Transfer-Encoding: 7bit X-Barracuda-Connect: nospam3.slac.stanford.edu[134.79.18.80] X-Barracuda-Start-Time: 1348264139 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109205 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Hi, I am facing a problem when my servers get power cycled by force. When they come up, almost everytime when xfs filesystems are being mounted, I get a system panic. It looks like what's described here: https://bugzilla.redhat.com/show_bug.cgi?id=657166 But I am running RHEL 6.2 and 6.3 (2.6.32-279.el6.x86_64) This is what my fstab entrys look like: LABEL=/brick1 /brick1 xfs sunit=256,swidth=3328,noatime,nodiratime,logbufs=8,largeio,quota 0 0 # xfs_info /brick1 meta-data=/dev/sdb isize=256 agcount=24, agsize=268435200 blks = sectsz=512 attr=2 data = bsize=4096 blocks=6347161600, imaxpct=5 = sunit=32 swidth=416 blks naming =version 2 bsize=4096 ascii-ci=0 log =internal bsize=4096 blocks=521728, version=2 = sectsz=512 sunit=8 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 Even if I go to single user mode and try to mount (via the fstab entry), I get the panic. But I can mount it without any option by doing "mount /dev/sdb /brick1". Is there any workaround to this? Thanks, ... ling From sandeen@sandeen.net Fri Sep 21 16:58:40 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8LLweCW254571 for ; Fri, 21 Sep 2012 16:58:40 -0500 X-ASG-Debug-ID: 1348264793-04cbb07ce35f3950001-NocioJ Received: from mail.sandeen.net (sandeen.net [63.231.237.45]) by cuda.sgi.com with ESMTP id JS1mp92fA33KpflX for ; Fri, 21 Sep 2012 14:59:54 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@sandeen.net X-Barracuda-Apparent-Source-IP: 63.231.237.45 Received: from liberator.sandeen.net (liberator.sandeen.net [10.0.0.4]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) (Authenticated sender: sandeen) by mail.sandeen.net (Postfix) with ESMTP id C62514964601; Fri, 21 Sep 2012 16:59:53 -0500 (CDT) Message-ID: <505CE359.7020707@sandeen.net> Date: Fri, 21 Sep 2012 16:59:53 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20120907 Thunderbird/15.0.1 MIME-Version: 1.0 To: Ling Ho CC: xfs@oss.sgi.com Subject: Re: RHEL 6.x xfs mount causing panic after forced shutdown References: <505CE0CA.6090005@slac.stanford.edu> X-ASG-Orig-Subj: Re: RHEL 6.x xfs mount causing panic after forced shutdown In-Reply-To: <505CE0CA.6090005@slac.stanford.edu> X-Enigmail-Version: 1.4.4 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Barracuda-Connect: sandeen.net[63.231.237.45] X-Barracuda-Start-Time: 1348264793 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109207 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On 9/21/12 4:48 PM, Ling Ho wrote: > Hi, > > I am facing a problem when my servers get power cycled by force. When they come up, almost everytime when xfs filesystems are being mounted, I get a system panic. Hm, you didn't include the panic itself, though. But bugs for distros like RHEL (or RHS, perhaps) should probably be reported to your Red Hat Support contacts, rather than taken to the upstream mailing list... -Eric > It looks like what's described here: > > https://bugzilla.redhat.com/show_bug.cgi?id=657166 > > But I am running RHEL 6.2 and 6.3 (2.6.32-279.el6.x86_64) > > This is what my fstab entrys look like: > > LABEL=/brick1 /brick1 xfs sunit=256,swidth=3328,noatime,nodiratime,logbufs=8,largeio,quota 0 0 > > > # xfs_info /brick1 > meta-data=/dev/sdb isize=256 agcount=24, agsize=268435200 blks > = sectsz=512 attr=2 > data = bsize=4096 blocks=6347161600, imaxpct=5 > = sunit=32 swidth=416 blks > naming =version 2 bsize=4096 ascii-ci=0 > log =internal bsize=4096 blocks=521728, version=2 > = sectsz=512 sunit=8 blks, lazy-count=1 > realtime =none extsz=4096 blocks=0, rtextents=0 > > > Even if I go to single user mode and try to mount (via the fstab entry), I get the panic. But I can mount it without any option by doing "mount /dev/sdb /brick1". > > Is there any workaround to this? > > Thanks, > ... > ling > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs > From lists@nerdbynature.de Fri Sep 21 19:36:34 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=BAYES_00,FROM_12LTRDOM autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8M0aYaG010043 for ; Fri, 21 Sep 2012 19:36:34 -0500 X-ASG-Debug-ID: 1348274264-04cbb07ce45fb100001-NocioJ Received: from trent.utfs.org (trent.utfs.org [94.185.90.103]) by cuda.sgi.com with ESMTP id K8vlrLxCD7FxfDEX for ; Fri, 21 Sep 2012 17:37:46 -0700 (PDT) X-Barracuda-Envelope-From: lists@nerdbynature.de X-Barracuda-Apparent-Source-IP: 94.185.90.103 Received: by trent.utfs.org (Postfix, from userid 8) id 14D2D3E0DF; Sat, 22 Sep 2012 02:37:44 +0200 (CEST) Received: from trent.utfs.org (localhost [127.0.0.1]) by trent.utfs.org (Postfix) with ESMTP id 7D2A73DD45 for ; Sat, 22 Sep 2012 02:37:43 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by trent.utfs.org (Postfix) with ESMTP id 624C83DAC2 for ; Sat, 22 Sep 2012 02:37:43 +0200 (CEST) Date: Fri, 21 Sep 2012 17:37:43 -0700 (PDT) From: Christian Kujau To: xfs@oss.sgi.com Subject: 3.6.0-rc6: inconsistent {IN-RECLAIM_FS-W} -> {RECLAIM_FS-ON-W} usage Message-ID: X-ASG-Orig-Subj: 3.6.0-rc6: inconsistent {IN-RECLAIM_FS-W} -> {RECLAIM_FS-ON-W} usage User-Agent: Alpine 2.01 (DEB 1266 2009-07-14) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-AV-Checked: ClamAV using ClamSMTP (127.0.0.1) X-Barracuda-Connect: trent.utfs.org[94.185.90.103] X-Barracuda-Start-Time: 1348274265 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109216 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- After upgrading from 3.5 to 3.6.0-rc6, the lockdep warning below is printed after the machine was running for ~1 day. When it was printed, disk i/o load was higher than usual as the machine was running backups, so this might've triggered it. I've observed a simliar lockdep warning earlier[0] for 3.5.0-rc5, but with a different backtrace. Also, then I was told that I may have run out of inode attributes. As I have not reformatted the filesystem, this might still be the case. A more similar backtrace has been posted[1] for 3.5.0-rc1, but I don't think a consensus on its solution has been reached. The .config, mountoptions and full dmesg are here: http://nerdbynature.de/bits/3.6.0-rc6 Christian. [0] http://oss.sgi.com/archives/xfs/2012-07/msg00113.html [1] https://lkml.org/lkml/2012/6/13/582 ================================= [ INFO: inconsistent lock state ] 3.6.0-rc6-00052-gc46de22 #1 Not tainted --------------------------------- inconsistent {IN-RECLAIM_FS-W} -> {RECLAIM_FS-ON-W} usage. rm/12693 [HC0[0]:SC0[0]:HE1:SE1] takes: (&(&ip->i_lock)->mr_lock){++++?-}, at: [] xfs_ilock+0x8c/0xb0 {IN-RECLAIM_FS-W} state was registered at: [] lock_acquire+0x50/0x6c [] down_write_nested+0x54/0x94 [] xfs_ilock+0x8c/0xb0 [] xfs_reclaim_inode+0x11c/0x32c [] xfs_reclaim_inodes_ag+0x1c4/0x3c8 [] xfs_reclaim_inodes_nr+0x38/0x4c [] xfs_fs_free_cached_objects+0x14/0x24 [] prune_super+0xf4/0x188 [] shrink_slab+0x1c0/0x2b4 [] kswapd+0x460/0x940 [] kthread+0x84/0x88 [] kernel_thread+0x4c/0x68 irq event stamp: 6402587 hardirqs last enabled at (6402587): [] _raw_spin_unlock_irqrestore+0x3c/0x90 hardirqs last disabled at (6402586): [] _raw_spin_lock_irqsave+0x2c/0x7c softirqs last enabled at (6401106): [] __do_softirq+0x138/0x17c softirqs last disabled at (6401095): [] call_do_softirq+0x14/0x24 other info that might help us debug this: Possible unsafe locking scenario: CPU0 ---- lock(&(&ip->i_lock)->mr_lock); lock(&(&ip->i_lock)->mr_lock); *** DEADLOCK *** 4 locks held by rm/12693: #0: (sb_writers#11){.+.+.+}, at: [] mnt_want_write+0x24/0x58 #1: (&type->i_mutex_dir_key#5/1){+.+.+.}, at: [] do_rmdir+0xac/0x110 #2: (sb_internal#2){.+.+.+}, at: [] xfs_trans_alloc+0x28/0x58 #3: (&(&ip->i_lock)->mr_lock){++++?-}, at: [] xfs_ilock+0x8c/0xb0 stack backtrace: Call Trace: [d9e35b60] [c00091e4] show_stack+0x48/0x15c (unreliable) [d9e35ba0] [c04cc4b4] print_usage_bug.part.34+0x260/0x274 [d9e35bd0] [c006e528] mark_lock+0x570/0x644 [d9e35c00] [c00708d4] mark_held_locks+0x98/0x168 [d9e35c40] [c0070fd4] lockdep_trace_alloc+0x84/0xe8 [d9e35c50] [c00c0834] kmem_cache_alloc+0x34/0x124 [d9e35c70] [c00b5088] vm_map_ram+0x228/0x5a0 [d9e35cf0] [c01a3b44] _xfs_buf_map_pages+0x44/0x104 [d9e35d10] [c01a4c1c] xfs_buf_get_map+0x74/0x11c [d9e35d30] [c01fbd30] xfs_trans_get_buf_map+0xc0/0xdc [d9e35d50] [c01e55bc] xfs_ifree_cluster+0x3f4/0x5b0 [d9e35de0] [c01e6c78] xfs_ifree+0xec/0xf0 [d9e35e20] [c01b9678] xfs_inactive+0x274/0x448 [d9e35e60] [c01b4930] xfs_fs_evict_inode+0x60/0x74 [d9e35e70] [c00e0858] evict+0xc0/0x1b4 [d9e35e90] [c00dc740] d_delete+0x1b0/0x1f4 [d9e35eb0] [c00d3820] vfs_rmdir+0x124/0x128 [d9e35ed0] [c00d390c] do_rmdir+0xe8/0x110 [d9e35f40] [c0010a4c] ret_from_syscall+0x0/0x38 --- Exception: c01 at 0xff4c918 LR = 0x10001b2c -- BOFH excuse #198: Post-it Note Sludge leaked into the monitor. From hawk@tbi.univie.ac.at Sat Sep 22 04:32:00 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_54 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8M9Vx4j063873 for ; Sat, 22 Sep 2012 04:32:00 -0500 X-ASG-Debug-ID: 1348306391-04cbb07ce46126f0001-NocioJ Received: from mescalin.tbi.univie.ac.at (mescalin.tbi.univie.ac.at [131.130.44.61]) by cuda.sgi.com with ESMTP id LcfMVypBkIWNK8Ky (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 22 Sep 2012 02:33:13 -0700 (PDT) X-Barracuda-Envelope-From: hawk@tbi.univie.ac.at X-Barracuda-Apparent-Source-IP: 131.130.44.61 Received: from h082218137050.host.wavenet.at ([82.218.137.50]:51658 helo=BD-MacBook.local) by mescalin.tbi.univie.ac.at with esmtpsa (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1TFM5E-0002KK-GJ; Sat, 22 Sep 2012 11:33:10 +0200 Message-ID: <505D85CF.9070701@tbi.univie.ac.at> Date: Sat, 22 Sep 2012 11:33:03 +0200 From: Richard Neuboeck User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20120907 Thunderbird/15.0.1 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: xfs mount fails 'can't read superblock' References: <50583590.7060702@tbi.univie.ac.at> <20120918205508.GA31501@dastard> X-ASG-Orig-Subj: Re: xfs mount fails 'can't read superblock' In-Reply-To: <20120918205508.GA31501@dastard> X-Enigmail-Version: 1.4.4 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="------------enigE0B170903D3D0C8C6F21481C" X-TBI-Spam-Score: -1.0 (-) X-TBI-Spam-Report: No hits=-1.0 required=5.0 tests=ALL_TRUSTED autolearn=ham version=3.3.1 X-Barracuda-Connect: mescalin.tbi.univie.ac.at[131.130.44.61] X-Barracuda-Start-Time: 1348306392 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109252 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- This is an OpenPGP/MIME signed message (RFC 2440 and 3156) --------------enigE0B170903D3D0C8C6F21481C Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Hi Dave, thanks for your help! You are absolutely right. On 9/18/12 10:55 PM, Dave Chinner wrote: > On Tue, Sep 18, 2012 at 10:49:20AM +0200, Richard Neuboeck wrote: >> I've a XFS related problem that boggles my find and I couldn't find a >> solution yet. >> >> I've got a virtual machine (huddle) that gets a ~66TB logical volume >> from the host handed as (virtio) block device (/dev/vdb). For ease of >> maintenance I didn't partition the device but formatted it directly wi= th >> xfs. The system at the time of formatting was Ubuntu Lucid 64bit. >=20 > virtio configuration? (i.e. cache=3Dnone?) Yes. Virtio and cache=3Dnone. >> A few days ago I upgraded the virtual machine to Ubuntu LTS 'precise',= >> Kernel 3.2, and got the following error while trying to mount the devi= ce: >=20 > Upgraded from what? Ubtunu Lucid. >> root@huddle:~# mount /dev/vdb /mnt/storage >> mount: /dev/vdb: can't read superblock >> >> dmesg shows some more info: >> root@huddle:~# dmesg | tail >> [ 672.774206] end_request: I/O error, dev vdb, sector 0 >> [ 672.774393] XFS (vdb): SB buffer read failed >> >> At first I thought the block device had some error and checked the >> virtual machine configuration and host system. >> >> From the host system (Ubuntu lucid 64bit, Kernel 2.6) I can still moun= t >> the xfs formatted device without problems. I also ran xfs_repair -n th= at >> didn't show any problem. >=20 > So the filesystem is accesible via direct IO from the host. What's > the xfs_info output once it is mounted? xfs_info on the host system shows a 4K sector size: root@wirt2:~# xfs_info /mnt/temp/ meta-data=3D/dev/mapper/storage-huddle isize=3D256 agcount=3D66, agsize=3D268435455 blks =3D sectsz=3D4096 attr=3D2 data =3D bsize=3D4096 blocks=3D17572571136, i= maxpct=3D5 =3D sunit=3D0 swidth=3D0 blks naming =3Dversion 2 bsize=3D4096 ascii-ci=3D0 log =3Dinternal bsize=3D4096 blocks=3D521728, versio= n=3D2 =3D sectsz=3D4096 sunit=3D1 blks, lazy-co= unt=3D1 realtime =3Dnone extsz=3D4096 blocks=3D0, rtextents=3D= 0 >> I tried to hand the virual machine a different ext4 formated block >> device (also without partition and preformatted). This didn't yield an= y >> mount problems. >> >> The Ubuntu 'precise' machine has an older kernel (2.6.32-42) too. >> Booting this kernel the xfs formatted block device gets mounted withou= t >> error. >=20 > The newer kernel has a different buffer cache implementation, so > sector sized IO (such as superblocks) is cached and issued > differently. >=20 >> The curious part is that it is still possible to mount the volume unde= r >> Kernel 3.2 without error using the loop option: >> >> root@huddle:~# mount -v -t xfs -o loop /dev/vdb /mnt/storage/ >=20 > Turns all IO into pagecache based IO, so 4k aligned. Will avoid any > sector size mismatch issues. >=20 >> Trying xfs_repair also brings up the I/O Error unless I use it with th= e >> -f option under Kernel 3.2. >=20 > -f can turn direct IO into buffered IO is there is a sector size > mismatch between the filesystem and the underlying storage. >=20 >> Obviously the problem is Kernel 3.2 related. I'm not sure if I'm at th= e >> right place in the XFS Mailinglist but thought it would make a good >> starting point since I couldn't find anything related in bugzilla or t= he >> web in general and the problem didn't show up using ext4 (so may not b= e >> a generic kernel problem). >=20 > Sounds like a sector size based problem to me - direct Io does > sector aligned and sized IO, buffered IO does page sized IO. So my > initial thought is that you've got a 512 byte sector filesystem on a > 4k sector device.... >=20 >> Running any kernel, blkid still identifies the device correctly as xfs= >> volume: >> root@huddle:~# blkid /dev/vdb >> /dev/vdb: UUID=3D"5adcd575-d3f2-48c3-81de-104f125b275e" TYPE=3D"xfs" >=20 > Buffered IO, again. I verified it with a 512B sector loop back device which works fine with xfs (or whatever the file system choice is). I can only nod my head in shame. Though I know this may be the wrong mailinglist for my problem I have absolutely no idea how to proceed. Googling didn't reveal the holy grail yet. Is there a way to realign the filesystem (without loosing the data on it)? Thanks! Richard > Cheers, >=20 > Dave. >=20 --------------enigE0B170903D3D0C8C6F21481C Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG/MacGPG2 v2.0.18 (Darwin) Comment: Using GnuPG with Mozilla - http://www.enigmail.net/ iEYEARECAAYFAlBdhdEACgkQnGohgOrO9GENvwCghxHlIFjOOf+RdXlnBYnwEKCU 8lQAoPCMNJuINRZtkoBUbr48p6X2HIq3 =nMNy -----END PGP SIGNATURE----- --------------enigE0B170903D3D0C8C6F21481C-- From MHERNANM@clinic.ub.es Sat Sep 22 21:42:30 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.0 required=5.0 tests=BAYES_99,LOTS_OF_MONEY autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8N2gTHZ185359 for ; Sat, 22 Sep 2012 21:42:30 -0500 X-ASG-Debug-ID: 1348368221-04bdf0067d55b610001-NocioJ Received: from mailsnd1.hospitalclinic.org (mailsnd1.hospitalclinic.org [194.224.71.214]) by cuda.sgi.com with ESMTP id Is0zfTVv620KVVy5 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Sat, 22 Sep 2012 19:43:43 -0700 (PDT) X-Barracuda-Envelope-From: MHERNANM@clinic.ub.es X-Barracuda-Apparent-Source-IP: 194.224.71.214 Received: from cscmlfe3.csc.es ([172.22.2.41]) by mailsnd1.hospitalclinic.org (8.13.6/8.13.6/SuSE Linux 0.8) with ESMTP id q8N1wmtZ017065; Sun, 23 Sep 2012 03:58:51 +0200 Received: from CSCMLBE4.csc.es ([::1]) by cscmlfe3.csc.es ([::1]) with mapi id 14.02.0309.002; Sun, 23 Sep 2012 03:40:34 +0200 From: Subject: Thread-Index: Ac2ZLC6UX6NY0WgkSAC1E6iork9RpA== X-ASG-Orig-Subj: Date: Sun, 23 Sep 2012 01:40:33 +0000 Message-ID: <2C6BE1E800DF404D89A2158586D922F8119A8999@cscmlbe4.csc.es> Accept-Language: es-ES, en-US Content-Language: es-ES X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [172.21.103.248] Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 To: undisclosed-recipients:; X-Barracuda-Connect: mailsnd1.hospitalclinic.org[194.224.71.214] X-Barracuda-Start-Time: 1348368222 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 1.31 X-Barracuda-Spam-Status: No, SCORE=1.31 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MISSING_SUBJECT, MISSING_SUBJECT_2, NO_REAL_NAME, THREAD_INDEX X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109320 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.01 THREAD_INDEX thread-index: AcO7Y8iR61tzADqsRmmc5wNiFHEOig== 0.00 NO_REAL_NAME From: does not include a real name 0.01 MISSING_SUBJECT Missing Subject: header 1.28 MISSING_SUBJECT_2 Missing Subject: header My wife Violet and I Allen Large won $11.3 million in a lottery 6-49 in Jul= y and we have decided to donate the sum of $500,000.00 USD to you. Contact us via our personal email for more details (allen_large70@outlook.c= om ) From rjevskiy@gmail.com Sun Sep 23 14:23:26 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_66, T_DKIM_INVALID autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8NJNQOf026967 for ; Sun, 23 Sep 2012 14:23:26 -0500 X-ASG-Debug-ID: 1348428280-04cb6c5687589640001-NocioJ Received: from mail-lb0-f181.google.com (mail-lb0-f181.google.com [209.85.217.181]) by cuda.sgi.com with ESMTP id Bwb3dnBrz8XfV20T (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 23 Sep 2012 12:24:41 -0700 (PDT) X-Barracuda-Envelope-From: rjevskiy@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.217.181 X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.181] Received: by lbbgg6 with SMTP id gg6so1076235lbb.26 for ; Sun, 23 Sep 2012 12:24:39 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.181] X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.181] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references; bh=cBYTtuMwXWru0wTEx6sODFy9ggfTCAPJf6nDJgNgAB0=; b=gsEa3YDHdOdUwGhVHNAYGxeb79186YstsTwNCWN4TOWReTN1RlFsNIDew/2d/31QJ4 3UX5kfppiyUqHgnk2eQexeht4BBh7lDTVA7ClRfpjxNM2fPtY2Uu5hOD6Ewp4KSSkd73 i7XKxKJBErPvKDqX/MQpM5Z9yY6QJWpScJ5LBDGxxROEFU7dBultdcjLv6n0eGSlgJR/ MDeL0cGGnWyJjP6Pv6v223tTATbttKWRBdK/LmmcmMNThsOIcUFSOFOyXaqJ1ny324K5 lNEBcD2mPNCxqXNiYnbBkgR+YAnzUZ17YaB+yojhQTO41OyA/dCX63tUZFP9UGmletab U2zg== Received: by 10.112.102.68 with SMTP id fm4mr3641281lbb.19.1348428279818; Sun, 23 Sep 2012 12:24:39 -0700 (PDT) Received: from smtp.gmail.com (swsoft-msk-nat.sw.ru. [195.214.232.10]) by mx.google.com with ESMTPS id go3sm2084330lab.11.2012.09.23.12.24.38 (version=TLSv1/SSLv3 cipher=OTHER); Sun, 23 Sep 2012 12:24:39 -0700 (PDT) Sender: Dmitry Monakhov From: Dmitry Monakhov To: linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org Cc: xfs@oss.sgi.com, hch@lst.de, Dmitry Monakhov Subject: [PATCH 1/6] xfstest: add fio git submodule Date: Sun, 23 Sep 2012 23:24:31 +0400 X-ASG-Orig-Subj: [PATCH 1/6] xfstest: add fio git submodule Message-Id: <1348428276-13161-1-git-send-email-dmonakhov@openvz.org> X-Mailer: git-send-email 1.7.7.6 In-Reply-To: References: X-Barracuda-Connect: mail-lb0-f181.google.com[209.85.217.181] X-Barracuda-Start-Time: 1348428280 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109385 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature FIO is very flexible io generator, i would call it IO swiss knife. Currently we have tonnes of hardcoded application which reproduces some predefined scenario. This approach has obvious dissadvantages 1) Lack of flexability: once written it is hard to modify it in future 2) Code base is large, many routines written again and again At the same time add new fio based tast is just add simle INI file. This greatly simplify code review. I do beleve that some day we will replace most of hardcoded io binaries with fio. Signed-off-by: Dmitry Monakhov --- .gitmodules | 3 +++ common.config | 3 +++ src/Makefile | 8 +++++--- src/aio-dio-regress/Makefile | 4 ++-- src/fio | 1 + 5 files changed, 14 insertions(+), 5 deletions(-) create mode 100644 .gitmodules create mode 160000 src/fio diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..f0481ea --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "src/fio"] + path = src/fio + url = git://git.kernel.dk/fio.git diff --git a/common.config b/common.config index 7bed1c5..25cddb4 100644 --- a/common.config +++ b/common.config @@ -138,6 +138,9 @@ export DF_PROG="`set_prog_path df`" [ "$DF_PROG" = "" ] && _fatal "df not found" [ "$HOSTOS" = "Linux" ] && export DF_PROG="$DF_PROG -T" +export FIO_PROG="`set_prog_path $PWD/src/fio/fio`" +[ "$FIO_PROG" = "" ] && _fatal "fio not found" + export XFS_LOGPRINT_PROG="`set_prog_path xfs_logprint`" export XFS_REPAIR_PROG="`set_prog_path xfs_repair`" export XFS_CHECK_PROG="`set_prog_path xfs_check`" diff --git a/src/Makefile b/src/Makefile index 67250ee..255bdd4 100644 --- a/src/Makefile +++ b/src/Makefile @@ -52,16 +52,18 @@ LLDLIBS += $(LIBGDBM) endif ifeq ($(HAVE_AIO), true) -SUBDIRS += aio-dio-regress +SUBDIRS += aio-dio-regress \ + fio + endif CFILES = $(TARGETS:=.c) LDIRT = $(TARGETS) -default: depend $(TARGETS) $(SUBDIRS) +default: .depend $(TARGETS) $(SUBDIRS) -depend: .dep +.depend: .dep include $(BUILDRULES) diff --git a/src/aio-dio-regress/Makefile b/src/aio-dio-regress/Makefile index 79dd55d..fcead9a 100644 --- a/src/aio-dio-regress/Makefile +++ b/src/aio-dio-regress/Makefile @@ -8,9 +8,9 @@ LDIRT = $(TARGETS) LLDLIBS = -laio -lpthread -default: depend $(TARGETS) +default: .depend $(TARGETS) -depend: .dep +.depend: .dep include $(BUILDRULES) diff --git a/src/fio b/src/fio new file mode 160000 index 0000000..e12d280 --- /dev/null +++ b/src/fio @@ -0,0 +1 @@ +Subproject commit e12d2800f811cb64d376cfdaed9a1257f3fa9c99 -- 1.7.7.6 From rjevskiy@gmail.com Sun Sep 23 14:23:27 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_66, T_DKIM_INVALID autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8NJNR1t026975 for ; Sun, 23 Sep 2012 14:23:27 -0500 X-ASG-Debug-ID: 1348428282-04cb6c5688589650001-NocioJ Received: from mail-lb0-f181.google.com (mail-lb0-f181.google.com [209.85.217.181]) by cuda.sgi.com with ESMTP id 81CAfNx0kM6GNbHK (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 23 Sep 2012 12:24:43 -0700 (PDT) X-Barracuda-Envelope-From: rjevskiy@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.217.181 X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.181] Received: by lbbgg6 with SMTP id gg6so1076250lbb.26 for ; Sun, 23 Sep 2012 12:24:41 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.181] X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.181] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references; bh=RFURmQRNR0LjcNFXNNqcUS++hHY4GMfYtLTaEf5G7nQ=; b=lxBCLiLYaJgjdIcrftfBiu66eAc4UIa/GZfDn6W+D3Iuwf3BMoUYwaBS/4j1hBppWb 9htjR9Wkf/z5UmIvRtJsYawbRuDmcCP9SyAl7fXmt0NTrt8oylkafACmDdG04rHrwUL7 rfJGjWJA4GfEnFnopt/U7DxP5aiVqFG3ZpHv1sIxVMDaUEBoH0cMC2RPiapL3Gq+kY43 2HrY4zC/9nrCYQUEG2EuySYx6PVOGkgabBM/gOA1SA5WAoisV40gY8AE1WBHJfG0oGKb dV9NmnS2cm85YKk6Mc966TBEb+eJcBnyrd6Ope+wMVbT5PzOvBNX85CmvWTvNWDNkGMj O1HQ== Received: by 10.112.84.105 with SMTP id x9mr3665246lby.92.1348428281603; Sun, 23 Sep 2012 12:24:41 -0700 (PDT) Received: from smtp.gmail.com (swsoft-msk-nat.sw.ru. [195.214.232.10]) by mx.google.com with ESMTPS id ey2sm2641704lbb.12.2012.09.23.12.24.40 (version=TLSv1/SSLv3 cipher=OTHER); Sun, 23 Sep 2012 12:24:40 -0700 (PDT) Sender: Dmitry Monakhov From: Dmitry Monakhov To: linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org Cc: xfs@oss.sgi.com, hch@lst.de, Dmitry Monakhov Subject: [PATCH 2/6] xfstest: add configurable load factors Date: Sun, 23 Sep 2012 23:24:32 +0400 X-ASG-Orig-Subj: [PATCH 2/6] xfstest: add configurable load factors Message-Id: <1348428276-13161-2-git-send-email-dmonakhov@openvz.org> X-Mailer: git-send-email 1.7.7.6 In-Reply-To: <1348428276-13161-1-git-send-email-dmonakhov@openvz.org> References: <1348428276-13161-1-git-send-email-dmonakhov@openvz.org> X-Barracuda-Connect: mail-lb0-f181.google.com[209.85.217.181] X-Barracuda-Start-Time: 1348428282 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109385 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Most stress test has probable behaviour, the longer test run the larger corner cases will be cover. It is reasonable to allow user to provide some sort of system load factor. This patch introduce two global variables LOAD_FACTOR: Usually means factor number of running tasks TIME_FACTOR: Usually means factor of run time, or number of operations If not speficied both variables defined to 1, so original behaviour preserved. TODO: Change all stress tests to use this variables Signed-off-by: Dmitry Monakhov --- common.config | 8 ++++++++ 1 files changed, 8 insertions(+), 0 deletions(-) diff --git a/common.config b/common.config index 25cddb4..a24b915 100644 --- a/common.config +++ b/common.config @@ -255,5 +255,13 @@ if [ ! -z "$SCRATCH_MNT" -a ! -d "$SCRATCH_MNT" ]; then exit 1 fi +if [ -z "$LOAD_FACTOR" ]; then + LOAD_FACTOR=1 +fi + +if [ -z "$TIME_FACTOR" ]; then + TIME_FACTOR=1 +fi + # make sure this script returns success /bin/true -- 1.7.7.6 From rjevskiy@gmail.com Sun Sep 23 14:23:29 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_72, LOCAL_GNU_PATCH,T_DKIM_INVALID autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8NJNSt8026982 for ; Sun, 23 Sep 2012 14:23:28 -0500 X-ASG-Debug-ID: 1348428280-04cb6c5687589640002-NocioJ Received: from mail-lb0-f181.google.com (mail-lb0-f181.google.com [209.85.217.181]) by cuda.sgi.com with ESMTP id UTxacyVQFzYkL7uL (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 23 Sep 2012 12:24:43 -0700 (PDT) X-Barracuda-Envelope-From: rjevskiy@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.217.181 X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.181] Received: by mail-lb0-f181.google.com with SMTP id gg6so1076235lbb.26 for ; Sun, 23 Sep 2012 12:24:43 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.181] X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.181] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references; bh=P1rW5gTRl7okNlK3af1DoSkR3hw4lo6j+0UxE8VTThU=; b=0ibgnQBtl/XafZK2wtkXG4J3WDwxTY7/K1ZxtQPpD5Hp4ufLcxLN87twzHYmLEgifY cJiIEloLjAKu8FQfiPxtTAn52WQp2B0RN4Hp1/rU/lbQi3jGOQBDJdgZlJb22Mox5IuQ uHOhsL+u8Huc89/qa4LueriZ0DQia+Rjkd4imcALOdk3irKwTMD/tlg0TtRbhaUK/9Ki 07i6fy7KHKPbdUp0nbBgQM9cSbD1XWNqejP4UizhthUkS7Wcvj9Gpem7VtzdgUBWR8iD yT3DjWDEJeTWjfAYDUskMf2Qt5gvQ9OjktKp4hnlU6d69D3Ss6rJxSLEqYmX0o/lUVYI 2T3g== Received: by 10.152.47.112 with SMTP id c16mr7913167lan.50.1348428283520; Sun, 23 Sep 2012 12:24:43 -0700 (PDT) Received: from smtp.gmail.com (swsoft-msk-nat.sw.ru. [195.214.232.10]) by mx.google.com with ESMTPS id h8sm3758932lbi.13.2012.09.23.12.24.42 (version=TLSv1/SSLv3 cipher=OTHER); Sun, 23 Sep 2012 12:24:42 -0700 (PDT) Sender: Dmitry Monakhov From: Dmitry Monakhov To: linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org Cc: xfs@oss.sgi.com, hch@lst.de, Dmitry Monakhov Subject: [PATCH 3/6] xfstest: allow fsstress to use load factor where appropriate Date: Sun, 23 Sep 2012 23:24:33 +0400 X-ASG-Orig-Subj: [PATCH 3/6] xfstest: allow fsstress to use load factor where appropriate Message-Id: <1348428276-13161-3-git-send-email-dmonakhov@openvz.org> X-Mailer: git-send-email 1.7.7.6 In-Reply-To: <1348428276-13161-1-git-send-email-dmonakhov@openvz.org> References: <1348428276-13161-1-git-send-email-dmonakhov@openvz.org> X-Barracuda-Connect: mail-lb0-f181.google.com[209.85.217.181] X-Barracuda-Start-Time: 1348428282 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109385 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Signed-off-by: Dmitry Monakhov --- 017 | 5 ++++- 068 | 4 ++-- 070 | 4 +++- 076 | 5 ++++- 083 | 4 ++-- 087 | 10 ++++++---- 104 | 4 ++-- 114 | 5 +++-- 167 | 4 ++-- 232 | 5 +++-- 233 | 5 +++-- 269 | 7 ++++--- 270 | 7 ++++--- 276 | 11 ++++++----- 14 files changed, 48 insertions(+), 32 deletions(-) diff --git a/017 b/017 index 9ca0e72..8d35ee8 100755 --- a/017 +++ b/017 @@ -67,7 +67,10 @@ echo "*** test" for l in 0 1 2 3 4 do echo " *** test $l" - $FSSTRESS_PROG -d $SCRATCH_MNT -n 1000 $FSSTRESS_AVOID >>$seq.full + NUM=$((1000 * TIME_FACTOR)) + CPU=$((1 * LOAD_FACTOR)) + $FSSTRESS_PROG -d $SCRATCH_MNT -n $NUM -p $CPU \ + $FSSTRESS_AVOID >>$seq.full _scratch_mount -o remount,ro \ || _fail "remount ro failed" diff --git a/068 b/068 index b595d1d..9a01100 100755 --- a/068 +++ b/068 @@ -75,8 +75,8 @@ touch $tmp.running STRESS_DIR="$SCRATCH_MNT/fsstress_test_dir" mkdir "$STRESS_DIR" - procs=2 - nops=200 + procs=$((2 * LOAD_FACTOR)) + nops=$((200 * TIME_FACTOR)) while [ -f "$tmp.running" ] do # We do both read & write IO - not only is this more realistic, diff --git a/070 b/070 index f48c33c..286ae90 100755 --- a/070 +++ b/070 @@ -62,7 +62,9 @@ $FSSTRESS_PROG \ -f unresvsp=0 \ -f attr_set=100 \ -f attr_remove=100 \ - -p 1 -n 10000 -S c >$seq.full 2>&1 + -p $((LOAD_FACTOR)) \ + -n $((10000 * TIME_FACTOR)) \ + -S c >$seq.full 2>&1 status=$? exit diff --git a/076 b/076 index e472b26..fa1a916 100755 --- a/076 +++ b/076 @@ -74,7 +74,10 @@ echo "*** test concurrent block/fs access" cat $SCRATCH_DEV >/dev/null & pid=$! -$FSSTRESS_PROG -d $SCRATCH_MNT -p 2 -n 2000 $FSSTRESS_AVOID >>$seq.full +num=$((2000 * TIME_FACTOR)) +proc=$((2 * LOAD_FACTOR)) + +$FSSTRESS_PROG -d $SCRATCH_MNT -p $proc -n $num $FSSTRESS_AVOID >>$seq.full _lets_get_pidst _check_scratch_fs diff --git a/083 b/083 index e0670b9..7af7c08 100755 --- a/083 +++ b/083 @@ -66,8 +66,8 @@ workout() { fsz=$1 ags=$2 - procs=$3 - nops=$4 + procs=$(($3 * LOAD_FACTOR)) + nops=$(($4 * TIME_FACTOR)) umount $SCRATCH_DEV >/dev/null 2>&1 echo "*** mkfs -dsize=$fsz,agcount=$ags" >>$seq.full diff --git a/087 b/087 index 48e5eaa..5c67f5e 100755 --- a/087 +++ b/087 @@ -43,11 +43,13 @@ trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15 _do_meta() { out=$SCRATCH_MNT/fsstress - count=10000 - param="-p 4 -z -f rmdir=10 -f link=10 -f creat=10 -f mkdir=10 \ + count=$((10000 * TIME_FACTOR)) + proc=$((4 * LOAD_FACTOR)) + param="-z -f rmdir=10 -f link=10 -f creat=10 -f mkdir=10 \ -f rename=30 -f stat=30 -f unlink=30 -f truncate=20" - _echofull "calling fsstress $param -m8 -n $count" - if ! $FSSTRESS_PROG $param $FSSTRESS_AVOID -m 8 -n $count -d $out >>$seq.full 2>&1 + _echofull "calling fsstress $param -m8 -p $proc -n $count" + if ! $FSSTRESS_PROG $param $FSSTRESS_AVOID -m 8 -p $proc \ + -n $count -d $out >>$seq.full 2>&1 then _echofull "fsstress failed" fi diff --git a/104 b/104 index 14f2669..abc9705 100755 --- a/104 +++ b/104 @@ -61,8 +61,8 @@ _fill_scratch() _stress_scratch() { - procs=3 - nops=1000 + procs=$((3 * LOAD_FACTOR)) + nops=$((1000 * TIME_FACTOR)) # -w ensures that the only ops are ones which cause write I/O $FSSTRESS_PROG -d $SCRATCH_MNT -w -p $procs -n $nops $FSSTRESS_AVOID > /dev/null & } diff --git a/114 b/114 index 7679222..348f992 100755 --- a/114 +++ b/114 @@ -245,12 +245,13 @@ _test_fsstress() echo "" out=$SCRATCH_MNT/fsstress.$$ - count=1000 + count=$((1000 * TIME_FACTOR)) + proc=$((3 * LOAD_FACTOR)) args="-z \ -f rmdir=10 -f link=10 -f creat=10 \ -f mkdir=10 -f rename=30 -f unlink=10 \ -f symlink=10 \ --n $count -d $out -p 3" +-n $count -d $out -p $proc" echo "fsstress $args" | sed -e "s#$out#outdir#" if ! $FSSTRESS_PROG $args | _filter_num diff --git a/167 b/167 index ccb6c2a..ad5fcd0 100755 --- a/167 +++ b/167 @@ -42,8 +42,8 @@ _cleanup() workout() { - procs=100 - nops=15000 + procs=$((100 * LOAD_FACTOR)) + nops=$((15000 * TIME_FACTOR)) $FSSTRESS_PROG -d $SCRATCH_MNT -p $procs -n $nops $FSSTRESS_AVOID \ >>$seq.full & sleep 2 diff --git a/232 b/232 index 2795da7..6cd0171 100755 --- a/232 +++ b/232 @@ -53,8 +53,9 @@ _fsstress() echo "" out=$SCRATCH_MNT/fsstress.$$ - count=2000 - args="-n $count -d $out -p 7" + count=$((2000*TIME_FACTOR)) + CPU=$((7 * LOAD_FACTOR)) + args="-n $count -d $out -p $CPU" echo "fsstress $args" | tee -a $here/$seq.full | sed -e "s#$out#outdir#" if ! $FSSTRESS_PROG $args | tee -a $here/$seq.full | _filter_num diff --git a/233 b/233 index 28e6ac7..e30d9cc 100755 --- a/233 +++ b/233 @@ -57,11 +57,12 @@ _fsstress() echo "" out=$SCRATCH_MNT/fsstress.$$ - count=5000 + count=$((5000 * TIME_FACTOR)) + proc=$((7 * LOAD_FACTOR)) args="-z \ -f rmdir=20 -f link=10 -f creat=10 -f mkdir=10 -f unlink=20 -f symlink=10 \ -f rename=10 -f fsync=2 -f write=15 -f dwrite=15 \ --n $count -d $out -p 7" +-n $count -d $out -p $proc" echo "fsstress $args" | tee -a $here/$seq.full | sed -e "s#$out#outdir#" if ! su $qa_user -c "$FSSTRESS_PROG $args" | tee -a $here/$seq.full | _filter_num diff --git a/269 b/269 index 7e13ed9..ca2700c 100755 --- a/269 +++ b/269 @@ -42,10 +42,11 @@ _workout() echo "" echo "Run fsstress" echo "" - num_iterations=10 - enospc_time=2 + num_iterations=$((10 * TIME_FACTOR)) + enospc_time=$((2 * TIME_FACTOR)) + proc=$((128 * LOAD_FACTOR)) out=$SCRATCH_MNT/fsstress.$$ - args="-p128 -n999999999 -f setattr=1 $FSSTRESS_AVOID -d $out" + args="-p $proc -n999999999 -f setattr=1 $FSSTRESS_AVOID -d $out" echo "fsstress $args" >> $here/$seq.full $FSSTRESS_PROG $args > /dev/null 2>&1 & pid=$! diff --git a/270 b/270 index b9ada27..5197910 100755 --- a/270 +++ b/270 @@ -45,10 +45,11 @@ _workout() echo "" echo "Run fsstress" echo "" - num_iterations=10 - enospc_time=2 + num_iterations=$((10 * TIME_FACTOR)) + enospc_time=$((2 * TIME_FACTOR)) + proc=$((128 * LOAD_FACTOR)) out=$SCRATCH_MNT/fsstress.$$ - args="-p128 -n999999999 -f setattr=1 $FSSTRESS_AVOID -d $out" + args="-p$proc -n999999999 -f setattr=1 $FSSTRESS_AVOID -d $out" echo "fsstress $args" >> $here/$seq.full # Grant chown capability cp $FSSTRESS_PROG $tmp.fsstress.bin diff --git a/276 b/276 index 082f943..551bef7 100755 --- a/276 +++ b/276 @@ -175,7 +175,8 @@ workout() { fsz=$1 nfiles=$2 - procs=$3 + procs=$(($3 * LOAD_FACTOR)) + num=$((1000* TIME_FACTOR)) snap_name=$4 umount $SCRATCH_DEV >/dev/null 2>&1 @@ -185,8 +186,8 @@ workout() || _fail "size=$fsz mkfs failed" run_check _scratch_mount # -w ensures that the only ops are ones which cause write I/O - run_check $FSSTRESS_PROG -d $SCRATCH_MNT -w -p $procs -n 1000 \ - $FSSTRESS_AVOID + run_check $FSSTRESS_PROG -d $SCRATCH_MNT -w -p $procs -n $num \ + $FSSTRESS_AVOID run_check $BTRFS_UTIL_PROG subvol snap $SCRATCH_MNT \ $SCRATCH_MNT/$snap_name @@ -196,13 +197,13 @@ workout() # make some noise but ensure we're not touching existing data # extents. - run_check $FSSTRESS_PROG -d $SCRATCH_MNT -p $procs -n 2000 \ + run_check $FSSTRESS_PROG -d $SCRATCH_MNT -p $procs -n $((num*2)) \ -z -f chown=3 -f link=1 -f mkdir=2 -f mknod=2 \ -f rename=2 -f setxattr=1 -f symlink=2 clean_dir="$SCRATCH_MNT/next" mkdir $clean_dir # now make more files to get a higher tree - run_check $FSSTRESS_PROG -d $clean_dir -w -p $procs -n 2000 \ + run_check $FSSTRESS_PROG -d $clean_dir -w -p $procs -n $((num*2)) \ $FSSTRESS_AVOID run_check umount $SCRATCH_DEV >/dev/null 2>&1 run_check _scratch_mount "-o atime" -- 1.7.7.6 From rjevskiy@gmail.com Sun Sep 23 14:23:31 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_DKIM_INVALID autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8NJNVS4027001 for ; Sun, 23 Sep 2012 14:23:31 -0500 X-ASG-Debug-ID: 1348428282-04cb6c5688589650002-NocioJ Received: from mail-lb0-f181.google.com (mail-lb0-f181.google.com [209.85.217.181]) by cuda.sgi.com with ESMTP id ct8lc7Mrp4VTPCYe (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 23 Sep 2012 12:24:45 -0700 (PDT) X-Barracuda-Envelope-From: rjevskiy@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.217.181 X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.181] Received: by mail-lb0-f181.google.com with SMTP id gg6so1076250lbb.26 for ; Sun, 23 Sep 2012 12:24:45 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.181] X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.181] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references; bh=CzqerX5OPlec3SMi/wreGpW2ly5dAN+2Hj58HArzhdA=; b=xlfCEuz5ahFECqVjNWVAeBsspMzW5kZbMjQXK7EIRFJtdtoEFXecR75pNyI1dltii5 aTYCuTR+zyQfxSIlrkTP2GlsdQP/1twtGwu3HiqtbLYLNQ6AwC5Q3fv4yuM3AeplAmzi ML4f4KChAd3AeOwoLOkSj+dx7mfDx+qb5gaxJqWu0hR5taOV2SPdmNeSKryNTOmzSmFU qUHPtW36cAGd6Vti8Vs0fKDIgM7cYACKEeiy271lLUmO/FsHpQqL/t9xEbKqaUwaq7Kf EMN6Jvi3Ta5MWk2YQP40pJv0vlRcbTq6Ubahh2EvbtHLrI3Bw9Y0XQ1/duk6Qb1s9Hta uNKQ== Received: by 10.112.41.232 with SMTP id i8mr3670931lbl.48.1348428285767; Sun, 23 Sep 2012 12:24:45 -0700 (PDT) Received: from smtp.gmail.com (swsoft-msk-nat.sw.ru. [195.214.232.10]) by mx.google.com with ESMTPS id gt19sm3771846lab.8.2012.09.23.12.24.44 (version=TLSv1/SSLv3 cipher=OTHER); Sun, 23 Sep 2012 12:24:44 -0700 (PDT) Sender: Dmitry Monakhov From: Dmitry Monakhov To: linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org Cc: xfs@oss.sgi.com, hch@lst.de, Dmitry Monakhov Subject: [PATCH 4/6] xfstest add fallocate/truncate vs AIO/DIO stress test Date: Sun, 23 Sep 2012 23:24:34 +0400 X-ASG-Orig-Subj: [PATCH 4/6] xfstest add fallocate/truncate vs AIO/DIO stress test Message-Id: <1348428276-13161-4-git-send-email-dmonakhov@openvz.org> X-Mailer: git-send-email 1.7.7.6 In-Reply-To: <1348428276-13161-1-git-send-email-dmonakhov@openvz.org> References: <1348428276-13161-1-git-send-email-dmonakhov@openvz.org> X-Barracuda-Connect: mail-lb0-f181.google.com[209.85.217.181] X-Barracuda-Start-Time: 1348428283 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109385 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Run DIO, fallocate and truncate threads on a common file in parallel. If race exist old dio request may rewrite blocks after it was allocated to another file, we will catch that by verifying blocks content. this patch known to catch deadlock for ext4 http://lists.openwall.net/linux-ext4/2012/09/06/3 Signed-off-by: Dmitry Monakhov --- 286 | 153 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 286.out | 5 ++ group | 1 + 3 files changed, 159 insertions(+), 0 deletions(-) create mode 100755 286 create mode 100644 286.out diff --git a/286 b/286 new file mode 100755 index 0000000..beb9546 --- /dev/null +++ b/286 @@ -0,0 +1,153 @@ +#! /bin/bash +# FSQA Test No. 286 +# +# Test various aio dio vs truncate +# +#----------------------------------------------------------------------- +# Copyright (c) 2006 Silicon Graphics, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +#----------------------------------------------------------------------- +# +# creator +owner=dmonakhov@openvz.org + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter +run_check() +{ + echo "# $@" >> $seq.full 2>&1 + "$@" >> $seq.full 2>&1 || _fail "failed: '$@'" +} + + +NUM_JOBS=$((4*LOAD_FACTOR)) +BLK_DEV_SIZE=`blockdev --getsz $SCRATCH_DEV` +FILE_SIZE=$((BLK_DEV_SIZE * 512)) + +cat >$tmp-$seq.fio <> $seq.full + run_check $FIO_PROG $tmp-$seq.fio >> $seq.full & + pid=$! + echo "Start fallocate/truncate loop" + for ((i=0; ; i++)) + do + for ((k=1; k <= NUM_JOBS; k++)) + do + fallocate -l $FILE_SIZE $SCRATCH_MNT/direct_aio.$k.0 \ + >> $seq.full 2>&1 + done + for ((k=1; k <= NUM_JOBS; k++)) + do + truncate -s 0 $SCRATCH_MNT/direct_aio.$k.0 + done + # One fio exit we can stop fallocate/truncate loop + kill -0 $pid > /dev/null 2>&1 || break + done + wait $pid +} + +# real QA test starts here +_supported_fs generic +_supported_os Linux +_need_to_be_root +_require_scratch + +_scratch_mkfs >> $seq.full 2>&1 +_scratch_mount + +if ! _workout; then + umount $SCRATCH_DEV 2>/dev/null + exit +fi + +if ! _scratch_unmount; then + echo "failed to umount" + status=1 + exit +fi +_check_scratch_fs +status=$? +exit diff --git a/286.out b/286.out new file mode 100644 index 0000000..d721996 --- /dev/null +++ b/286.out @@ -0,0 +1,5 @@ +QA output created by 286 + +Run fio with random aio-dio pattern + +Start fallocate/truncate loop diff --git a/group b/group index 697269b..2469f80 100644 --- a/group +++ b/group @@ -404,3 +404,4 @@ deprecated 283 dump ioctl auto quick 284 auto 285 auto dump quota quick +286 auto rw enospc aio -- 1.7.7.6 From rjevskiy@gmail.com Sun Sep 23 14:23:32 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_DKIM_INVALID autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8NJNWUC027017 for ; Sun, 23 Sep 2012 14:23:32 -0500 X-ASG-Debug-ID: 1348428280-04cb6c5687589640003-NocioJ Received: from mail-lb0-f181.google.com (mail-lb0-f181.google.com [209.85.217.181]) by cuda.sgi.com with ESMTP id DUOxA2XweIHagpa6 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 23 Sep 2012 12:24:47 -0700 (PDT) X-Barracuda-Envelope-From: rjevskiy@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.217.181 X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.181] Received: by mail-lb0-f181.google.com with SMTP id gg6so1076235lbb.26 for ; Sun, 23 Sep 2012 12:24:47 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.181] X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.181] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references; bh=FZKa+lLUcpAdbq9kwfPFinWc6z6QBaNclbHG0+F5HyU=; b=DsEozxpMIfR/PRRkaBkUt++Lxkwk8hxL+1ARSMxaa+N9MsIulDGk+UHpEfilKJ71Y0 jtZHW4KcFY7l8BcpkvqVk9YVbk4OZRaVlbBHi3/tymINoARLX8avdd1MrKcjJUjCx6Z1 A8prPliGERbmLztE+NWTghX3c5/i97K28t4UZP+Lk/EejvzvP5uLfqyNTS7g4ZVMFdLN 3h31Qva7s4EyMq+GPWh2aw+xaNpnphfEd1pPkOG7Jrc+qX5EkcuDGXugvs8mNiIMgoxF NgIvztq9K+i5d5NHOqP49IT5DuuGO86ueAotoIcPBkh3xjEsNDUsg5X1ok/o6um8SAJn GGlw== Received: by 10.152.105.135 with SMTP id gm7mr8929635lab.22.1348428287535; Sun, 23 Sep 2012 12:24:47 -0700 (PDT) Received: from smtp.gmail.com (swsoft-msk-nat.sw.ru. [195.214.232.10]) by mx.google.com with ESMTPS id k10sm2009444lbz.6.2012.09.23.12.24.46 (version=TLSv1/SSLv3 cipher=OTHER); Sun, 23 Sep 2012 12:24:47 -0700 (PDT) Sender: Dmitry Monakhov From: Dmitry Monakhov To: linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org Cc: xfs@oss.sgi.com, hch@lst.de, Dmitry Monakhov Subject: [PATCH 5/6] xfstest: add fallocate/punch_hole vs AIO/DIO stress test Date: Sun, 23 Sep 2012 23:24:35 +0400 X-ASG-Orig-Subj: [PATCH 5/6] xfstest: add fallocate/punch_hole vs AIO/DIO stress test Message-Id: <1348428276-13161-5-git-send-email-dmonakhov@openvz.org> X-Mailer: git-send-email 1.7.7.6 In-Reply-To: <1348428276-13161-1-git-send-email-dmonakhov@openvz.org> References: <1348428276-13161-1-git-send-email-dmonakhov@openvz.org> X-Barracuda-Connect: mail-lb0-f181.google.com[209.85.217.181] X-Barracuda-Start-Time: 1348428284 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109385 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Run DIO, fallocate and punch_hole threads on a common file in parallel. If race exist old dio request may rewrite punched block after it was allocated to another file, we will catch that by verifying blocks content. Signed-off-by: Dmitry Monakhov --- 287 | 155 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ group | 1 + 2 files changed, 156 insertions(+), 0 deletions(-) create mode 100755 287 diff --git a/287 b/287 new file mode 100755 index 0000000..40e096e --- /dev/null +++ b/287 @@ -0,0 +1,155 @@ +#! /bin/bash +# FSQA Test No. 287 +# +# Test various races AIO/DIO vs fallocate/punch_hole +# +#----------------------------------------------------------------------- +# Copyright (c) 2006 Silicon Graphics, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +#----------------------------------------------------------------------- +# +# creator +owner=dmonakhov@openvz.org + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter +run_check() +{ + echo "# $@" >> $seq.full 2>&1 + "$@" >> $seq.full 2>&1 || _fail "failed: '$@'" +} + + +NUM_JOBS=$((4*LOAD_FACTOR)) +BLK_DEV_SIZE=`blockdev --getsz $SCRATCH_DEV` +if [ $((BLK_DEV_SIZE)) -gt 1048576 ] +then + BLK_DEV_SIZE=1048576 +fi +FS_SIZE=$((BLK_DEV_SIZE * 512)) + +cat >$tmp-$seq.fio <> $seq.full + run_check $FIO_PROG $tmp-$seq.fio >> $seq.full +} + +# real QA test starts here +_supported_fs generic +_supported_os Linux +_need_to_be_root +_require_scratch + +_scratch_mkfs_sized $FS_SIZE >> $seq.full 2>&1 +_scratch_mount + +if ! _workout; then + umount $SCRATCH_DEV 2>/dev/null + exit +fi + +if ! _scratch_unmount; then + echo "failed to umount" + status=1 + exit +fi +_check_scratch_fs +status=$? +exit diff --git a/group b/group index 2469f80..37f3256 100644 --- a/group +++ b/group @@ -405,3 +405,4 @@ deprecated 284 auto 285 auto dump quota quick 286 auto rw enospc aio +287 auto rw enospc aio prealloc -- 1.7.7.6 From rjevskiy@gmail.com Sun Sep 23 14:23:34 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_16, J_CHICKENPOX_36,T_DKIM_INVALID autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8NJNYUT027030 for ; Sun, 23 Sep 2012 14:23:34 -0500 X-ASG-Debug-ID: 1348428282-04cb6c5688589650003-NocioJ Received: from mail-lb0-f181.google.com (mail-lb0-f181.google.com [209.85.217.181]) by cuda.sgi.com with ESMTP id BR6uiRwc14PS4Fun (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 23 Sep 2012 12:24:49 -0700 (PDT) X-Barracuda-Envelope-From: rjevskiy@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.217.181 X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.181] Received: by mail-lb0-f181.google.com with SMTP id gg6so1076250lbb.26 for ; Sun, 23 Sep 2012 12:24:49 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.181] X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.181] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references; bh=iNFo1SqbdovrJ4KUNPOAq4Q78Ahv/Zr18cVYi53bizE=; b=uV1zh+enKVhL5WswiNtBiqnFrNeH1KbM88akXfSRQAFBXhLhdtYm7rBMlE+6dku485 iK66eCDqPVMfOeMLIKNcdu45KW+6I2f6qS3ewHEQIu6fFf4YM1wMs/wOV+oBnMX1ywgc /VO72azn2gmup44c/tbkjPov3LvSAPHRhpBS3hd7jV39eOypqa9Xz079uFyy8l/BlLHo NnNgr3MoAc8/Kmz7Po93ZItfUGcGWuoj2X7HZD4TQXnEvBHN+TDs26qKY+nRXQ9alXF8 ly5Q2TZ6GQRyd/sCeEme7DV1cLAbZ7bCGnOmW/3eHIbCaeWDlupYQwI5N/V+YvYzO2ms lc8w== Received: by 10.152.105.135 with SMTP id gm7mr8929672lab.22.1348428289383; Sun, 23 Sep 2012 12:24:49 -0700 (PDT) Received: from smtp.gmail.com (swsoft-msk-nat.sw.ru. [195.214.232.10]) by mx.google.com with ESMTPS id hz16sm3774490lab.6.2012.09.23.12.24.48 (version=TLSv1/SSLv3 cipher=OTHER); Sun, 23 Sep 2012 12:24:48 -0700 (PDT) Sender: Dmitry Monakhov From: Dmitry Monakhov To: linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org Cc: xfs@oss.sgi.com, hch@lst.de, Dmitry Monakhov Subject: [PATCH 6/6] xfstest: add defragmentation stress test for ext4 Date: Sun, 23 Sep 2012 23:24:36 +0400 X-ASG-Orig-Subj: [PATCH 6/6] xfstest: add defragmentation stress test for ext4 Message-Id: <1348428276-13161-6-git-send-email-dmonakhov@openvz.org> X-Mailer: git-send-email 1.7.7.6 In-Reply-To: <1348428276-13161-1-git-send-email-dmonakhov@openvz.org> References: <1348428276-13161-1-git-send-email-dmonakhov@openvz.org> X-Barracuda-Connect: mail-lb0-f181.google.com[209.85.217.181] X-Barracuda-Start-Time: 1348428286 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109385 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Perform various regression tests for ext4defrag subsystem Test1: Defragment file while other task does direct AIO Test2: Perform defragmentation on file under buffered AIO while third task does direct AIO to donor file Test3: Two defrag tasks use common donor file. Test4: Stress defragmentation. Several threads pefrorm fragmentation at random position use inplace=1 will allocate and free blocks inside defrag event improve load pressure. This test known to caught most known e4defrag bugs. Signed-off-by: Dmitry Monakhov --- 288 | 277 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 288.out | 4 + group | 1 + 3 files changed, 282 insertions(+), 0 deletions(-) create mode 100755 288 create mode 100644 288.out diff --git a/288 b/288 new file mode 100755 index 0000000..c972f88 --- /dev/null +++ b/288 @@ -0,0 +1,277 @@ +#! /bin/bash +# FSQA Test No. 288 +# +# Ext4 defragmentatio stress test +# +#----------------------------------------------------------------------- +# Copyright (c) 2006 Silicon Graphics, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +#----------------------------------------------------------------------- +# +# creator +owner=dmonakhov@openvz.org + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter +run_check() +{ + echo "# $@" >> $seq.full 2>&1 + "$@" >> $seq.full 2>&1 || _fail "failed: '$@'" +} + + +NUM_JOBS=$((4*LOAD_FACTOR)) +BLK_DEV_SIZE=`blockdev --getsz $SCRATCH_DEV` +# We need space for 8 files +FILE_SIZE=$((BLK_DEV_SIZE * (512 /12))) + +cat >$tmp-$seq.fio <> $seq.full + run_check $FIO_PROG $tmp-$seq.fio >> $seq.full +} + +# real QA test starts here +_supported_fs generic +_supported_os Linux +_supported_fs ext4 +_need_to_be_root +_require_scratch + +_scratch_mkfs >> $seq.full 2>&1 +_scratch_mount + +if ! _workout; then + umount $SCRATCH_DEV 2>/dev/null + exit +fi + +if ! _scratch_unmount; then + echo "failed to umount" + status=1 + exit +fi +_check_scratch_fs +status=$? +exit diff --git a/288.out b/288.out new file mode 100644 index 0000000..b215a3f --- /dev/null +++ b/288.out @@ -0,0 +1,4 @@ +QA output created by 288 + + Start defragment activity + diff --git a/group b/group index 37f3256..8bd5c21 100644 --- a/group +++ b/group @@ -406,3 +406,4 @@ deprecated 285 auto dump quota quick 286 auto rw enospc aio 287 auto rw enospc aio prealloc +288 auto rw aio -- 1.7.7.6 From sandeen@redhat.com Sun Sep 23 22:15:52 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_66 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8O3FqbZ068810 for ; Sun, 23 Sep 2012 22:15:52 -0500 X-ASG-Debug-ID: 1348456627-04bdf06cd0499760001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id DgXarBPw6BSj2xga for ; Sun, 23 Sep 2012 20:17:08 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8O3H2Zb016934 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Sun, 23 Sep 2012 23:17:03 -0400 Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q8O3GvGa002384 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Sun, 23 Sep 2012 23:16:59 -0400 Message-ID: <505FD0A9.3090601@redhat.com> Date: Sun, 23 Sep 2012 22:16:57 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20120907 Thunderbird/15.0.1 MIME-Version: 1.0 To: Dmitry Monakhov CC: linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, hch@lst.de Subject: Re: [PATCH 1/6] xfstest: add fio git submodule References: <1348428276-13161-1-git-send-email-dmonakhov@openvz.org> X-ASG-Orig-Subj: Re: [PATCH 1/6] xfstest: add fio git submodule In-Reply-To: <1348428276-13161-1-git-send-email-dmonakhov@openvz.org> X-Enigmail-Version: 1.4.4 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1348456628 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com On 9/23/12 2:24 PM, Dmitry Monakhov wrote: > FIO is very flexible io generator, i would call it IO swiss knife. > Currently we have tonnes of hardcoded application which reproduces > some predefined scenario. This approach has obvious dissadvantages > 1) Lack of flexability: once written it is hard to modify it in future > 2) Code base is large, many routines written again and again > > At the same time add new fio based tast is just add simle INI file. > This greatly simplify code review. I do beleve that some day we will > replace most of hardcoded io binaries with fio. The submodule approach is interesting, but I wonder - we have quite a few dependencies on other binaries already; what are the pros and cons of creating this as a git submodule vs. simply expecting fio to be installed on the system like any of the other dependencies we have today? (I package fio for Fedora, is it not commonly available on other distros?) -Eric > Signed-off-by: Dmitry Monakhov > --- > .gitmodules | 3 +++ > common.config | 3 +++ > src/Makefile | 8 +++++--- > src/aio-dio-regress/Makefile | 4 ++-- > src/fio | 1 + > 5 files changed, 14 insertions(+), 5 deletions(-) > create mode 100644 .gitmodules > create mode 160000 src/fio > > diff --git a/.gitmodules b/.gitmodules > new file mode 100644 > index 0000000..f0481ea > --- /dev/null > +++ b/.gitmodules > @@ -0,0 +1,3 @@ > +[submodule "src/fio"] > + path = src/fio > + url = git://git.kernel.dk/fio.git > diff --git a/common.config b/common.config > index 7bed1c5..25cddb4 100644 > --- a/common.config > +++ b/common.config > @@ -138,6 +138,9 @@ export DF_PROG="`set_prog_path df`" > [ "$DF_PROG" = "" ] && _fatal "df not found" > [ "$HOSTOS" = "Linux" ] && export DF_PROG="$DF_PROG -T" > > +export FIO_PROG="`set_prog_path $PWD/src/fio/fio`" > +[ "$FIO_PROG" = "" ] && _fatal "fio not found" > + > export XFS_LOGPRINT_PROG="`set_prog_path xfs_logprint`" > export XFS_REPAIR_PROG="`set_prog_path xfs_repair`" > export XFS_CHECK_PROG="`set_prog_path xfs_check`" > diff --git a/src/Makefile b/src/Makefile > index 67250ee..255bdd4 100644 > --- a/src/Makefile > +++ b/src/Makefile > @@ -52,16 +52,18 @@ LLDLIBS += $(LIBGDBM) > endif > > ifeq ($(HAVE_AIO), true) > -SUBDIRS += aio-dio-regress > +SUBDIRS += aio-dio-regress \ > + fio > + > endif > > CFILES = $(TARGETS:=.c) > LDIRT = $(TARGETS) > > > -default: depend $(TARGETS) $(SUBDIRS) > +default: .depend $(TARGETS) $(SUBDIRS) > > -depend: .dep > +.depend: .dep > > include $(BUILDRULES) > > diff --git a/src/aio-dio-regress/Makefile b/src/aio-dio-regress/Makefile > index 79dd55d..fcead9a 100644 > --- a/src/aio-dio-regress/Makefile > +++ b/src/aio-dio-regress/Makefile > @@ -8,9 +8,9 @@ LDIRT = $(TARGETS) > > LLDLIBS = -laio -lpthread > > -default: depend $(TARGETS) > +default: .depend $(TARGETS) > > -depend: .dep > +.depend: .dep > > include $(BUILDRULES) > > diff --git a/src/fio b/src/fio > new file mode 160000 > index 0000000..e12d280 > --- /dev/null > +++ b/src/fio > @@ -0,0 +1 @@ > +Subproject commit e12d2800f811cb64d376cfdaed9a1257f3fa9c99 > From gregory.machin@gmail.com Sun Sep 23 23:48:29 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_DKIM_INVALID autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8O4mSus077932 for ; Sun, 23 Sep 2012 23:48:28 -0500 X-ASG-Debug-ID: 1348462183-04cb6c568559a590001-NocioJ Received: from mail-oa0-f53.google.com (mail-oa0-f53.google.com [209.85.219.53]) by cuda.sgi.com with ESMTP id HtON4RuOQbqldG2k (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sun, 23 Sep 2012 21:49:44 -0700 (PDT) X-Barracuda-Envelope-From: gregory.machin@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.219.53 X-Barracuda-IPDD: Level1 [gmail.com/209.85.219.53] Received: by oagj6 with SMTP id j6so1429775oag.26 for ; Sun, 23 Sep 2012 21:49:43 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.219.53] X-Barracuda-IPDD: Level1 [gmail.com/209.85.219.53] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:reply-to:sender:date:x-google-sender-auth:message-id :subject:from:to:content-type; bh=rsR6XSoDKQq0Wk3bsHm45SQoAdTeRndRa4r51zXXKT4=; b=HO0WZsG15lU8lgqk97fSbswhlPz1BJkKi+G0QCjdUHJ7gDn5H4/7zCln0EtZIWoz1o F0+Ud/nZKCeinGmFTqQyrmaEelTFN4ZZ69UbWJR10TYZ5CIPCXHwUG8SXqPLfpCDZVi4 ORQL+vLypiOes7J0ePGVwV4UQx5FTp+86TViGJIP8vVdhjkD9nQ2d5wMHjE8VvZEa8q4 JXqCUWLUMLBzQr0PzwI5rbvSCBfYtuIgxtDAWvp1zTWMT7e3vGXxI9Ss+sP7eU59eD7s DHeQfTGN6NSTlg1I9ZiPnReF/F9xBkU5dBgUCVuuNrZHzorEFCQMfl/wRmP7Em3kmQin xQkQ== MIME-Version: 1.0 Received: by 10.60.31.39 with SMTP id x7mr9153538oeh.66.1348462183538; Sun, 23 Sep 2012 21:49:43 -0700 (PDT) Reply-To: gdm@linuxpro.co.za Sender: gregory.machin@gmail.com Received: by 10.76.169.69 with HTTP; Sun, 23 Sep 2012 21:49:43 -0700 (PDT) Date: Mon, 24 Sep 2012 16:49:43 +1200 X-Google-Sender-Auth: kMIKtU_tVkqAUvc3yl3AIh0kopg Message-ID: Subject: xlog_space_left: head behind tail ? From: Gregory Machin X-ASG-Orig-Subj: xlog_space_left: head behind tail ? To: xfs@oss.sgi.com Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-oa0-f53.google.com[209.85.219.53] X-Barracuda-Start-Time: 1348462184 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109422 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hi. Since I started using Acronis backup software I have the following in my logs : Sep 22 18:00:16 nzhmlfpr04 kernel: session_stat: dev=8:1 state=6 blksize=1024 mmapsize=262144 Sep 22 18:00:16 nzhmlfpr04 kernel: session_stat: psize=1024000 pstrt=2048 mshft=0 ioctls=728 Sep 22 18:00:16 nzhmlfpr04 kernel: session_stat: bhpgs=0 bhcnt=0 abhs=307 fbhs=307 dbhs=0 Sep 22 18:00:16 nzhmlfpr04 kernel: session_stat: gpgs=30836 ppgs=30836 emmax=30662 emmin=28746 emcur=0 cached=0 Sep 22 18:00:16 nzhmlfpr04 kernel: session_stat: rblk=9321 cblk=95 rcblk=46 rc2blk=0 mcblk=38 rwcolls=11 Sep 22 18:00:16 nzhmlfpr04 kernel: session_stat: sync=0 async=26 aretr=0 Sep 22 18:00:16 nzhmlfpr04 kernel: XFS (dm-2): xlog_space_left: head behind tail Sep 22 18:00:16 nzhmlfpr04 kernel: tail_cycle = 20, tail_bytes = 26561024 Sep 22 18:00:16 nzhmlfpr04 kernel: GH cycle = 20, GH bytes = 26540592 Sep 22 18:00:16 nzhmlfpr04 kernel: XFS (dm-2): xlog_space_left: head behind tail Sep 22 18:00:16 nzhmlfpr04 kernel: tail_cycle = 20, tail_bytes = 26561024 Sep 22 18:00:16 nzhmlfpr04 kernel: GH cycle = 20, GH bytes = 26540592 Sep 22 18:00:16 nzhmlfpr04 kernel: XFS (dm-2): xlog_space_left: head behind tail Sep 22 18:00:16 nzhmlfpr04 kernel: tail_cycle = 20, tail_bytes = 26561024 Sep 22 18:00:16 nzhmlfpr04 kernel: GH cycle = 20, GH bytes = 26541608 Sep 22 18:00:16 nzhmlfpr04 kernel: XFS (dm-2): xlog_space_left: head behind tail Sep 22 18:00:16 nzhmlfpr04 kernel: tail_cycle = 20, tail_bytes = 26561024 Sep 22 18:00:16 nzhmlfpr04 kernel: GH cycle = 20, GH bytes = 26541608 Sep 22 18:00:17 nzhmlfpr04 kernel: XFS (dm-5): xlog_space_left: head behind tail Sep 22 18:00:17 nzhmlfpr04 kernel: tail_cycle = 2052, tail_bytes = 3527680 Sep 22 18:00:17 nzhmlfpr04 kernel: GH cycle = 2052, GH bytes = 3510104 Sep 22 18:00:17 nzhmlfpr04 kernel: XFS (dm-5): xlog_space_left: head behind tail Sep 22 18:00:17 nzhmlfpr04 kernel: tail_cycle = 2052, tail_bytes = 3527680 Sep 22 18:00:17 nzhmlfpr04 kernel: GH cycle = 2052, GH bytes = 3510104 Sep 22 18:00:24 nzhmlfpr04 kernel: XFS (dm-3): xlog_space_left: head behind tail Sep 22 18:00:24 nzhmlfpr04 kernel: tail_cycle = 125, tail_bytes = 438272 Sep 22 18:00:24 nzhmlfpr04 kernel: GH cycle = 125, GH bytes = 416952 Sep 22 18:00:24 nzhmlfpr04 kernel: XFS (dm-3): xlog_space_left: head behind tail Sep 22 18:00:24 nzhmlfpr04 kernel: tail_cycle = 125, tail_bytes = 438272 Sep 22 18:00:24 nzhmlfpr04 kernel: GH cycle = 125, GH bytes = 416952 Sep 22 18:00:30 nzhmlfpr04 kernel: XFS (dm-4): xlog_space_left: head behind tail Sep 22 18:00:30 nzhmlfpr04 kernel: tail_cycle = 46, tail_bytes = 11395072 Sep 22 18:00:30 nzhmlfpr04 kernel: GH cycle = 46, GH bytes = 11375664 Sep 22 18:00:30 nzhmlfpr04 kernel: XFS (dm-4): xlog_space_left: head behind tail Sep 22 18:00:30 nzhmlfpr04 kernel: tail_cycle = 46, tail_bytes = 11395072 Sep 22 18:00:30 nzhmlfpr04 kernel: GH cycle = 46, GH bytes = 11375664 Sep 22 18:00:33 nzhmlfpr04 kernel: XFS (dm-2): xlog_space_left: head behind tail Sep 22 18:00:33 nzhmlfpr04 kernel: tail_cycle = 20, tail_bytes = 26563072 Sep 22 18:00:33 nzhmlfpr04 kernel: GH cycle = 20, GH bytes = 26542632 Sep 22 18:00:33 nzhmlfpr04 kernel: XFS (dm-2): xlog_space_left: head behind tail Sep 22 18:00:33 nzhmlfpr04 kernel: tail_cycle = 20, tail_bytes = 26563072 Sep 22 18:00:33 nzhmlfpr04 kernel: GH cycle = 20, GH bytes = 26542632 Sep 22 18:00:47 nzhmlfpr04 kernel: XFS (dm-5): xlog_space_left: head behind tail Sep 22 18:00:47 nzhmlfpr04 kernel: tail_cycle = 2052, tail_bytes = 3529728 Sep 22 18:00:47 nzhmlfpr04 kernel: GH cycle = 2052, GH bytes = 3511128 Sep 22 18:00:47 nzhmlfpr04 kernel: XFS (dm-5): xlog_space_left: head behind tail Sep 22 18:00:47 nzhmlfpr04 kernel: tail_cycle = 2052, tail_bytes = 3529728 Sep 22 18:00:47 nzhmlfpr04 kernel: GH cycle = 2052, GH bytes = 3511128 Sep 22 18:00:54 nzhmlfpr04 kernel: XFS (dm-3): xlog_space_left: head behind tail Sep 22 18:00:54 nzhmlfpr04 kernel: tail_cycle = 125, tail_bytes = 439296 Sep 22 18:00:54 nzhmlfpr04 kernel: GH cycle = 125, GH bytes = 417976 Sep 22 18:00:54 nzhmlfpr04 kernel: XFS (dm-3): xlog_space_left: head behind tail Sep 22 18:00:54 nzhmlfpr04 kernel: tail_cycle = 125, tail_bytes = 439296 Sep 22 18:00:54 nzhmlfpr04 kernel: GH cycle = 125, GH bytes = 417976 Sep 22 18:01:00 nzhmlfpr04 kernel: XFS (dm-4): xlog_space_left: head behind tail Sep 22 18:01:00 nzhmlfpr04 kernel: tail_cycle = 46, tail_bytes = 11396096 Sep 22 18:01:00 nzhmlfpr04 kernel: GH cycle = 46, GH bytes = 11376688 Sep 22 18:01:00 nzhmlfpr04 kernel: XFS (dm-4): xlog_space_left: head behind tail Sep 22 18:01:00 nzhmlfpr04 kernel: tail_cycle = 46, tail_bytes = 11396096 Sep 22 18:01:00 nzhmlfpr04 kernel: GH cycle = 46, GH bytes = 11376688 Sep 22 18:01:03 nzhmlfpr04 kernel: XFS (dm-2): xlog_space_left: head behind tail Sep 22 18:01:03 nzhmlfpr04 kernel: tail_cycle = 20, tail_bytes = 26564096 Sep 22 18:01:03 nzhmlfpr04 kernel: GH cycle = 20, GH bytes = 26543656 Sep 22 18:01:03 nzhmlfpr04 kernel: XFS (dm-2): xlog_space_left: head behind tail Sep 22 18:01:03 nzhmlfpr04 kernel: tail_cycle = 20, tail_bytes = 26564096 Sep 22 18:01:03 nzhmlfpr04 kernel: GH cycle = 20, GH bytes = 26543656 Sep 22 18:01:17 nzhmlfpr04 kernel: XFS (dm-5): xlog_space_left: head behind tail Sep 22 18:01:17 nzhmlfpr04 kernel: tail_cycle = 2052, tail_bytes = 3530752 Sep 22 18:01:17 nzhmlfpr04 kernel: GH cycle = 2052, GH bytes = 3512152 Sep 22 18:01:17 nzhmlfpr04 kernel: XFS (dm-5): xlog_space_left: head behind tail Sep 22 18:01:17 nzhmlfpr04 kernel: tail_cycle = 2052, tail_bytes = 3530752 Sep 22 18:01:17 nzhmlfpr04 kernel: GH cycle = 2052, GH bytes = 3512152 Sep 22 18:09:41 nzhmlfpr04 kernel: session_stat: dev=fd:2 state=6 blksize=4096 mmapsize=262144 Sep 22 18:09:41 nzhmlfpr04 kernel: session_stat: psize=209707008 pstrt=0 mshft=0 ioctls=170766 Sep 22 18:09:41 nzhmlfpr04 kernel: session_stat: bhpgs=0 bhcnt=0 abhs=85404 fbhs=85404 dbhs=0 Sep 22 18:09:41 nzhmlfpr04 kernel: session_stat: gpgs=31595 ppgs=31595 emmax=30662 emmin=28746 emcur=0 cached=0 Sep 22 18:09:41 nzhmlfpr04 kernel: session_stat: rblk=5460184 cblk=1 rcblk=1 rc2blk=0 mcblk=1 rwcolls=0 Sep 22 18:09:41 nzhmlfpr04 kernel: session_stat: sync=0 async=1 aretr=0 Sep 22 18:10:10 nzhmlfpr04 kernel: session_stat: dev=fd:0 state=6 blksize=4096 mmapsize=262144 Sep 22 18:10:10 nzhmlfpr04 kernel: session_stat: psize=78725120 pstrt=0 mshft=0 ioctls=25526 Sep 22 18:10:10 nzhmlfpr04 kernel: session_stat: bhpgs=0 bhcnt=0 abhs=4658 fbhs=4658 dbhs=0 Sep 22 18:10:10 nzhmlfpr04 kernel: session_stat: gpgs=31622 ppgs=31622 emmax=30662 emmin=28746 emcur=0 cached=0 Sep 22 18:10:10 nzhmlfpr04 kernel: session_stat: rblk=193051 cblk=525 rcblk=525 rc2blk=0 mcblk=246 rwcolls=53 Sep 22 18:10:10 nzhmlfpr04 kernel: session_stat: sync=0 async=525 aretr=0 Sep 22 18:10:10 nzhmlfpr04 kernel: session_unlockdev: No lock for device (FD00001) in session (ffff880116b6c000) Then I found these : Sep 22 20:17:17 nzhmlfpr04 kernel: tail_cycle = 2052, tail_bytes = 3572736 Sep 22 20:17:17 nzhmlfpr04 kernel: GH cycle = 2052, GH bytes = 3554064 Sep 22 20:17:24 nzhmlfpr04 kernel: XFS (dm-3): xlog_space_left: head behind tail Sep 22 20:17:24 nzhmlfpr04 kernel: tail_cycle = 125, tail_bytes = 488448 Sep 22 20:17:24 nzhmlfpr04 kernel: GH cycle = 125, GH bytes = 467056 Sep 22 20:17:24 nzhmlfpr04 kernel: XFS (dm-3): xlog_space_left: head behind tail Sep 22 20:17:24 nzhmlfpr04 kernel: tail_cycle = 125, tail_bytes = 488448 Sep 22 20:17:24 nzhmlfpr04 kernel: GH cycle = 125, GH bytes = 467056 Sep 22 20:17:30 nzhmlfpr04 kernel: XFS (dm-4): xlog_space_left: head behind tail Sep 22 20:17:30 nzhmlfpr04 kernel: tail_cycle = 46, tail_bytes = 11430912 Sep 22 20:17:30 nzhmlfpr04 kernel: GH cycle = 46, GH bytes = 11411432 Sep 22 20:17:30 nzhmlfpr04 kernel: XFS (dm-4): xlog_space_left: head behind tail Sep 22 20:17:30 nzhmlfpr04 kernel: tail_cycle = 46, tail_bytes = 11430912 Sep 22 20:17:30 nzhmlfpr04 kernel: GH cycle = 46, GH bytes = 11411432 Sep 22 20:17:33 nzhmlfpr04 kernel: XFS (dm-2): xlog_space_left: head behind tail Sep 22 20:17:33 nzhmlfpr04 kernel: tail_cycle = 20, tail_bytes = 26600960 Sep 22 20:17:33 nzhmlfpr04 kernel: GH cycle = 20, GH bytes = 26580440 Sep 22 20:17:33 nzhmlfpr04 kernel: XFS (dm-2): xlog_space_left: head behind tail Sep 22 20:17:33 nzhmlfpr04 kernel: tail_cycle = 20, tail_bytes = 26600960 Sep 22 20:17:33 nzhmlfpr04 kernel: GH cycle = 20, GH bytes = 26580440 Sep 22 20:17:47 nzhmlfpr04 kernel: XFS (dm-5): xlog_space_left: head behind tail Sep 22 20:17:47 nzhmlfpr04 kernel: tail_cycle = 2052, tail_bytes = 3573760 Sep 22 20:17:47 nzhmlfpr04 kernel: GH cycle = 2052, GH bytes = 3555088 Sep 22 20:17:47 nzhmlfpr04 kernel: XFS (dm-5): xlog_space_left: head behind tail Sep 22 20:17:47 nzhmlfpr04 kernel: tail_cycle = 2052, tail_bytes = 3573760 Sep 22 20:17:47 nzhmlfpr04 kernel: GH cycle = 2052, GH bytes = 3555088 Sep 22 20:17:54 nzhmlfpr04 kernel: XFS (dm-3): xlog_space_left: head behind tail Sep 22 20:17:54 nzhmlfpr04 kernel: tail_cycle = 125, tail_bytes = 489472 Sep 22 20:17:54 nzhmlfpr04 kernel: GH cycle = 125, GH bytes = 468080 Sep 22 20:17:54 nzhmlfpr04 kernel: XFS (dm-3): xlog_space_left: head behind tail Sep 22 20:17:54 nzhmlfpr04 kernel: tail_cycle = 125, tail_bytes = 489472 Sep 22 20:17:54 nzhmlfpr04 kernel: GH cycle = 125, GH bytes = 468080 Sep 22 20:19:07 nzhmlfpr04 kernel: XFS (snumbd11d): Corruption detected. Unmount and run xfs_repair Sep 22 20:19:07 nzhmlfpr04 kernel: XFS (snumbd11d): inode 0x13461d0d background reclaim flush failed with 117 Sep 22 20:19:07 nzhmlfpr04 kernel: XFS (snumbd11d): Corruption detected. Unmount and run xfs_repair Sep 22 20:19:07 nzhmlfpr04 kernel: XFS (snumbd11d): inode 0x13461d0e background reclaim flush failed with 117 Sep 22 20:19:07 nzhmlfpr04 kernel: XFS (snumbd11d): Corruption detected. Unmount and run xfs_repair Sep 22 20:19:07 nzhmlfpr04 kernel: XFS (snumbd11d): inode 0x13461d0f background reclaim flush failed with 117 Sep 22 20:19:37 nzhmlfpr04 kernel: XFS (snumbd11d): Corruption detected. Unmount and run xfs_repair Sep 22 20:19:37 nzhmlfpr04 kernel: XFS (snumbd11d): inode 0x13461d0d background reclaim flush failed with 117 Sep 22 20:19:37 nzhmlfpr04 kernel: XFS (snumbd11d): Corruption detected. Unmount and run xfs_repair Sep 22 20:19:37 nzhmlfpr04 kernel: XFS (snumbd11d): inode 0x13461d0e background reclaim flush failed with 117 Sep 22 20:19:37 nzhmlfpr04 kernel: XFS (snumbd11d): Corruption detected. Unmount and run xfs_repair Sep 22 20:19:37 nzhmlfpr04 kernel: XFS (snumbd11d): inode 0x13461d0f background reclaim flush failed with 117 Sep 22 20:20:07 nzhmlfpr04 kernel: XFS (snumbd11d): Corruption detected. Unmount and run xfs_repair Sep 22 20:20:07 nzhmlfpr04 kernel: XFS (snumbd11d): inode 0x13461d0d background reclaim flush failed with 117 Sep 22 20:20:07 nzhmlfpr04 kernel: XFS (snumbd11d): Corruption detected. Unmount and run xfs_repair Sep 22 20:20:07 nzhmlfpr04 kernel: XFS (snumbd11d): inode 0x13461d0e background reclaim flush failed with 117 Sep 22 20:20:07 nzhmlfpr04 kernel: XFS (snumbd11d): Corruption detected. Unmount and run xfs_repair Sep 22 20:20:07 nzhmlfpr04 kernel: XFS (snumbd11d): inode 0x13461d0f background reclaim flush failed with 117 What is the cause for the first lot of logs and are they an issue ? Did what was causing the first lot of logs create the second "Corruption detected. Unmount and run xfs_repair" I ran the xfs_repair and this has relosved the "Corruption detected. Unmount and run xfs_repair" issue I want to be sure before I start pointing fingures and asking questions as to why I'm seeing the first lot of logs and what else could have cause the 2nd ? Thanks From david@fromorbit.com Mon Sep 24 02:24:58 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8O7Ow78110848 for ; Mon, 24 Sep 2012 02:24:58 -0500 X-ASG-Debug-ID: 1348471572-04cbb07ce46869c0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id uK6GMnFi6Cira3LK for ; Mon, 24 Sep 2012 00:26:13 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ag0KADIKYFB5Lafp/2dsb2JhbABFvSEDgQaBCYIgAQEEATocIwULCAMOBgQVGRQlAyETh38FuE0UiwgCIliCAoJMYAOVZIk4hmyCeQ Received: from ppp121-45-167-233.lns20.syd6.internode.on.net (HELO dastard) ([121.45.167.233]) by ipmail04.adl6.internode.on.net with ESMTP; 24 Sep 2012 16:56:11 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TG33I-0004qD-6i; Mon, 24 Sep 2012 17:26:00 +1000 Date: Mon, 24 Sep 2012 17:26:00 +1000 From: Dave Chinner To: Gregory Machin Cc: xfs@oss.sgi.com Subject: Re: xlog_space_left: head behind tail ? Message-ID: <20120924072600.GE20960@dastard> X-ASG-Orig-Subj: Re: xlog_space_left: head behind tail ? References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1348471572 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109430 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Sep 24, 2012 at 04:49:43PM +1200, Gregory Machin wrote: > Hi. > > Since I started using Acronis backup software I have the following in my logs : What kernel? > Sep 22 18:00:16 nzhmlfpr04 kernel: XFS (dm-2): xlog_space_left: head behind tail > Sep 22 18:00:16 nzhmlfpr04 kernel: tail_cycle = 20, tail_bytes = 26561024 > Sep 22 18:00:16 nzhmlfpr04 kernel: GH cycle = 20, GH bytes = 26540592 20,432 bytes behind. ... > Sep 22 18:01:03 nzhmlfpr04 kernel: XFS (dm-2): xlog_space_left: head behind tail > Sep 22 18:01:03 nzhmlfpr04 kernel: tail_cycle = 20, tail_bytes = 26564096 > Sep 22 18:01:03 nzhmlfpr04 kernel: GH cycle = 20, GH bytes = 26543656 And that's 20440 bytes behind. So, an 8 byte leak - sounds rather familiar: $ gl -n 1 3948659 commit 3948659e30808fbaa7673bbe89de2ae9769e20a7 Author: Dave Chinner Date: Thu Mar 22 05:15:11 2012 +0000 xfs: Account log unmount transaction correctly There have been a few reports of this warning appearing recently: XFS (dm-4): xlog_space_left: head behind tail tail_cycle = 129, tail_bytes = 20163072 GH cycle = 129, GH bytes = 20162880 The common cause appears to be lots of freeze and unfreeze cycles, and the output from the warnings indicates that we are leaking around 8 bytes of log space per freeze/unfreeze cycle. When we freeze the filesystem, we write an unmount record and that uses xlog_write directly - a special type of transaction, effectively. What it doesn't do, however, is correctly account for the log space it uses. The unmount record writes an 8 byte structure with a special magic number into the log, and the space this consumes is not accounted for in the log ticket tracking the operation. Hence we leak 8 bytes every unmount record that is written. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Signed-off-by: Ben Myers $ git describe --contains 3948659 v3.4-rc1~55^2~3 So, fixed in 3.4. FWIW, this commit is in the series I proposed recently for back porting to 3.0.x stable kernel. .... > Sep 22 20:17:54 nzhmlfpr04 kernel: XFS (dm-3): xlog_space_left: head behind tail ^^^^ > Sep 22 20:17:54 nzhmlfpr04 kernel: tail_cycle = 125, tail_bytes = 489472 > Sep 22 20:17:54 nzhmlfpr04 kernel: GH cycle = 125, GH bytes = 468080 > Sep 22 20:19:07 nzhmlfpr04 kernel: XFS (snumbd11d): Corruption ^^^^^^^^^ > detected. Unmount and run xfs_repair Note the different device names the errors are for? So the log space warnings are from different filesystems to the one that corruption has been found on. IOWs, unrelated. > I want to be sure before I start pointing fingures and asking > questions as to why I'm seeing the first lot of logs Acronis is freezing/thawing the filesystem to get a consistent backup image, hence triggering the problem. > and what else > could have cause the 2nd ? Don't know. There's no stack trace in the error message, so I don't even know where it came from. have you modified the xfs_error_level sysctl to turn off verbose reporting? Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Sep 24 02:54:39 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8O7sdWu114914 for ; Mon, 24 Sep 2012 02:54:39 -0500 X-ASG-Debug-ID: 1348473353-04cb6c568859ffd0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 262TFSLHBAGqJxFS for ; Mon, 24 Sep 2012 00:55:54 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AgwKAGYRYFB5Lafp/2dsb2JhbABFvSIDgQaBCYIgAQEFOhwjEAgDGC4UJQMhE4gEuEsUiwh8hE5gA5VkiTiGbIJ5 Received: from ppp121-45-167-233.lns20.syd6.internode.on.net (HELO dastard) ([121.45.167.233]) by ipmail04.adl6.internode.on.net with ESMTP; 24 Sep 2012 17:25:53 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TG3WC-0004tP-0f; Mon, 24 Sep 2012 17:55:52 +1000 Date: Mon, 24 Sep 2012 17:55:51 +1000 From: Dave Chinner To: Eric Sandeen Cc: Anand Tiwari , xfs@oss.sgi.com Subject: Re: xfs_repair deleting realtime files. Message-ID: <20120924075551.GF20960@dastard> X-ASG-Orig-Subj: Re: xfs_repair deleting realtime files. References: <505BF45D.5050909@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <505BF45D.5050909@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1348473354 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109432 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Sep 21, 2012 at 12:00:13AM -0500, Eric Sandeen wrote: > On 9/20/12 7:40 PM, Anand Tiwari wrote: > > Hi All, > > > > I have been looking into an issue with xfs_repair with realtime sub volume. some times while running xfs_repair I see following errors > > > > ---------------------------- > > data fork in rt inode 134 claims used rt block 19607 > > bad data fork in inode 134 > > would have cleared inode 134 > > data fork in rt inode 135 claims used rt block 29607 > > bad data fork in inode 135 > > would have cleared inode 135 ..... > > xfs_db> inode 135 > > xfs_db> bmap > > data offset 0 startblock 13062144 (12/479232) count 2097000 flag 0 > > data offset 2097000 startblock 15159144 (14/479080) count 2097000 flag 0 > > data offset 4194000 startblock 17256144 (16/478928) count 2097000 flag 0 > > data offset 6291000 startblock 19353144 (18/478776) count 2097000 flag 0 > > data offset 8388000 startblock 21450144 (20/478624) count 2097000 flag 0 > > data offset 10485000 startblock 23547144 (22/478472) count 2097000 flag 0 > > data offset 12582000 startblock 25644144 (24/478320) count 2097000 flag 0 > > data offset 14679000 startblock 27741144 (26/478168) count 2097000 flag 0 > > data offset 16776000 startblock 29838144 (28/478016) count 2097000 flag 0 > > data offset 18873000 startblock 31935144 (30/477864) count 1607000 flag 0 > > xfs_db> inode 134 > > xfs_db> bmap > > data offset 0 startblock 7942144 (7/602112) count 2097000 flag 0 > > data offset 2097000 startblock 10039144 (9/601960) count 2097000 flag 0 > > data offset 4194000 startblock 12136144 (11/601808) count 926000 flag 0 > > It's been a while since I thought about realtime, but - > > That all seems fine, I don't see anything overlapping there, they are > all perfectly adjacent, though of interesting size. Yeah, the size is the problem. .... > Every extent above is length 2097000 blocks, and they are adjacent. > But you say your realtime extent size is 512 blocks ... which doesn't go > into 2097000 evenly. So that's odd, at least. Once you realise that the bmapbt is recording multiples of FSB (4k) rather than rtextsz (2MB), it becomes more obvious what the problem is: rounding of the extent size at MAXEXTLEN - 2097000 is only 152 blocks short of 2^21 (2097152). I haven't looked at the kernel code yet to work out why it is rounding to a non-rtextsz multiple, but that is the source of the problem. The repair code is detecting that extents are not of the correct granularity, but the error message indicates that this was only ever expected for duplicate blocks occurring rather than a kernel bug. So "fixing repair" is not what is needd here - finding and fixing the kernel bug is what you shoul be looking at. Cheers, Dave. -- Dave Chinner david@fromorbit.com From rjevskiy@gmail.com Mon Sep 24 05:02:31 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_66, T_DKIM_INVALID autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8OA2V5q129001 for ; Mon, 24 Sep 2012 05:02:31 -0500 X-ASG-Debug-ID: 1348481025-04cbb07ce268f2e0001-NocioJ Received: from mail-lb0-f181.google.com (mail-lb0-f181.google.com [209.85.217.181]) by cuda.sgi.com with ESMTP id pDL8Y5tV9YDVrITv (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 24 Sep 2012 03:03:46 -0700 (PDT) X-Barracuda-Envelope-From: rjevskiy@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.217.181 X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.181] Received: by lbbgg6 with SMTP id gg6so1724518lbb.26 for ; Mon, 24 Sep 2012 03:03:45 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.181] X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.181] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:in-reply-to:references:user-agent:date :message-id:mime-version:content-type; bh=KsK9nFUgxuR7b7J+yVJ5EQsm9SzZ4dd1hVL3Qe2qY00=; b=ELEZ7Se7gH7W3M/U5yY07rxv9Xba1coPErrwQhEFwfCLYpBt7ibDobfRvezk9LOOT+ IQZE7o8eUYxfph88IzG9STFkl7aNrbYQAtzAkOv6X6DAzNI1A0h56+vxpuPEMFaK1YFR ZGpgrPMzHqfc3RBKk1yyO/Cc/3THoLmikobWLxDS1xa9H3VMSX2QUXf2hJfCsT1sVkVf rUDFDpBxlUx5PxoloOsiBbkXdM71O2RwkNfUbqF6C6P4NT/yKRDOeCPq/DMt1Xe3gNap putoTMfIcPtoTu/9dpK/eRODd4W8PlnhXsgD5PhXfmkqgQU8Dvq4IfUiYkevXQLKfQNu F4vw== Received: by 10.112.85.97 with SMTP id g1mr4234114lbz.101.1348481024432; Mon, 24 Sep 2012 03:03:44 -0700 (PDT) Received: from smtp.gmail.com (swsoft-msk-nat.sw.ru. [195.214.232.10]) by mx.google.com with ESMTPS id hj19sm4193715lab.13.2012.09.24.03.03.43 (version=TLSv1/SSLv3 cipher=OTHER); Mon, 24 Sep 2012 03:03:43 -0700 (PDT) Sender: Dmitry Monakhov From: Dmitry Monakhov To: Eric Sandeen Cc: linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, hch@lst.de Subject: Re: [PATCH 1/6] xfstest: add fio git submodule In-Reply-To: <505FD0A9.3090601@redhat.com> X-ASG-Orig-Subj: Re: [PATCH 1/6] xfstest: add fio git submodule References: <1348428276-13161-1-git-send-email-dmonakhov@openvz.org> <505FD0A9.3090601@redhat.com> User-Agent: Notmuch/0.6.1 (http://notmuchmail.org) Emacs/23.3.1 (x86_64-redhat-linux-gnu) Date: Mon, 24 Sep 2012 14:03:42 +0400 Message-ID: <87lifzd9fl.fsf@openvz.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Barracuda-Connect: mail-lb0-f181.google.com[209.85.217.181] X-Barracuda-Start-Time: 1348481026 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109440 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Sun, 23 Sep 2012 22:16:57 -0500, Eric Sandeen wrote: > On 9/23/12 2:24 PM, Dmitry Monakhov wrote: > > FIO is very flexible io generator, i would call it IO swiss knife. > > Currently we have tonnes of hardcoded application which reproduces > > some predefined scenario. This approach has obvious dissadvantages > > 1) Lack of flexability: once written it is hard to modify it in future > > 2) Code base is large, many routines written again and again > > > > At the same time add new fio based tast is just add simle INI file. > > This greatly simplify code review. I do beleve that some day we will > > replace most of hardcoded io binaries with fio. > > The submodule approach is interesting, but I wonder - we have quite a few > dependencies on other binaries already; what are the pros and cons of creating > this as a git submodule vs. simply expecting fio to be installed on the > system like any of the other dependencies we have today? Pro: P1) allow to specify exact commit as a submodule HEAD this guarantee that we will have known version and functionality regardless to distribution package manager (which are known to be very conservative) P2) Prevent duplicating of source code (fsstress.c/aio-stress.c and etc). If some one want to add new feature to submodule he simply push it to official submodule repo and move submodule HEAD In that both parties(submodule maintainer and project maintainer) will benefit because new features will be available to every submodule user Cons: C1) New dependencies C2) Learn people how to work with submodules I'll not assume (C2) as a serious argument because this is just one more git's command. For most users should just add new option to clone: git clone --recursive git://git.kernel.org/pub/scm/fs/xfs/xfstests-dev.git (C1) Is not big deal in case of Fio because we already depends from libaio. (P2) Makes xfstest coverage larger because all new tests which use new submodules functionality will start to work by default (today it silently ignored). As i already told fio is under rapid development Jens Axboe does very good job so (P2) really works for me, new features i need for xfstets was reviewed and accepted by Jens http://git.kernel.dk/?p=fio.git;a=commit;h=8b28bd41375930664a0ff9ff9b101a88ac416ac5 http://git.kernel.dk/?p=fio.git;a=commit;h=9c25d2e3f498707c4fd5a4bb0adf9867ecb17768 http://git.kernel.dk/?p=fio.git;a=commit;h=e615ceafbe3962a35b7a7e06a0c8f4e2c0652c65 > > (I package fio for Fedora, is it not commonly available on other > distros?) > > -Eric > > > Signed-off-by: Dmitry Monakhov > > --- > > .gitmodules | 3 +++ > > common.config | 3 +++ > > src/Makefile | 8 +++++--- > > src/aio-dio-regress/Makefile | 4 ++-- > > src/fio | 1 + > > 5 files changed, 14 insertions(+), 5 deletions(-) > > create mode 100644 .gitmodules > > create mode 160000 src/fio > > > > diff --git a/.gitmodules b/.gitmodules > > new file mode 100644 > > index 0000000..f0481ea > > --- /dev/null > > +++ b/.gitmodules > > @@ -0,0 +1,3 @@ > > +[submodule "src/fio"] > > + path = src/fio > > + url = git://git.kernel.dk/fio.git > > diff --git a/common.config b/common.config > > index 7bed1c5..25cddb4 100644 > > --- a/common.config > > +++ b/common.config > > @@ -138,6 +138,9 @@ export DF_PROG="`set_prog_path df`" > > [ "$DF_PROG" = "" ] && _fatal "df not found" > > [ "$HOSTOS" = "Linux" ] && export DF_PROG="$DF_PROG -T" > > > > +export FIO_PROG="`set_prog_path $PWD/src/fio/fio`" > > +[ "$FIO_PROG" = "" ] && _fatal "fio not found" > > + > > export XFS_LOGPRINT_PROG="`set_prog_path xfs_logprint`" > > export XFS_REPAIR_PROG="`set_prog_path xfs_repair`" > > export XFS_CHECK_PROG="`set_prog_path xfs_check`" > > diff --git a/src/Makefile b/src/Makefile > > index 67250ee..255bdd4 100644 > > --- a/src/Makefile > > +++ b/src/Makefile > > @@ -52,16 +52,18 @@ LLDLIBS += $(LIBGDBM) > > endif > > > > ifeq ($(HAVE_AIO), true) > > -SUBDIRS += aio-dio-regress > > +SUBDIRS += aio-dio-regress \ > > + fio > > + > > endif > > > > CFILES = $(TARGETS:=.c) > > LDIRT = $(TARGETS) > > > > > > -default: depend $(TARGETS) $(SUBDIRS) > > +default: .depend $(TARGETS) $(SUBDIRS) > > > > -depend: .dep > > +.depend: .dep > > > > include $(BUILDRULES) > > > > diff --git a/src/aio-dio-regress/Makefile b/src/aio-dio-regress/Makefile > > index 79dd55d..fcead9a 100644 > > --- a/src/aio-dio-regress/Makefile > > +++ b/src/aio-dio-regress/Makefile > > @@ -8,9 +8,9 @@ LDIRT = $(TARGETS) > > > > LLDLIBS = -laio -lpthread > > > > -default: depend $(TARGETS) > > +default: .depend $(TARGETS) > > > > -depend: .dep > > +.depend: .dep > > > > include $(BUILDRULES) > > > > diff --git a/src/fio b/src/fio > > new file mode 160000 > > index 0000000..e12d280 > > --- /dev/null > > +++ b/src/fio > > @@ -0,0 +1 @@ > > +Subproject commit e12d2800f811cb64d376cfdaed9a1257f3fa9c99 > > > > -- > To unsubscribe from this list: send the line "unsubscribe linux-ext4" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html From david@fromorbit.com Mon Sep 24 05:49:02 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8OAn2Uk132464 for ; Mon, 24 Sep 2012 05:49:02 -0500 X-ASG-Debug-ID: 1348483816-04cbb07ce3690ee0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id oUUdWpAbzHmEu6Lh for ; Mon, 24 Sep 2012 03:50:17 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AgwKAIc6YFB5Lafp/2dsb2JhbABFvSIDgQaBCYIgAQEEATocGAsQCAMOCi4UJQMhE4d/BbgOFIsIAnqFLgOVZIk4hmyCeQ Received: from ppp121-45-167-233.lns20.syd6.internode.on.net (HELO dastard) ([121.45.167.233]) by ipmail04.adl6.internode.on.net with ESMTP; 24 Sep 2012 20:20:02 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TG6Ei-0005GG-NU; Mon, 24 Sep 2012 20:50:00 +1000 Date: Mon, 24 Sep 2012 20:50:00 +1000 From: Dave Chinner To: Gregory Machin Cc: xfs@oss.sgi.com Subject: Re: xlog_space_left: head behind tail ? Message-ID: <20120924105000.GI20960@dastard> X-ASG-Orig-Subj: Re: xlog_space_left: head behind tail ? References: <20120924072600.GE20960@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1348483816 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109444 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- [ please leave the mailing list CC on responses. thanks. ] [Fixed up the top posting mess, too] On Mon, Sep 24, 2012 at 09:29:04PM +1200, Gregory Machin wrote: > On Mon, Sep 24, 2012 at 7:26 PM, Dave Chinner wrote: > > On Mon, Sep 24, 2012 at 04:49:43PM +1200, Gregory Machin wrote: > >> Hi. > >> > >> Since I started using Acronis backup software I have the following in my logs : > > > > What kernel? > > The Kernel : Linux nzhmlfpr04 2.6.32-279.5.2.el6.x86_64 #1 SMP Fri Aug > 24 01:07:11 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux > OS CentOS : 6.3 So, it doesn't have the fix. You'll have to upgrade to 3.4 or backport the patch yourself. > >> Sep 22 20:17:54 nzhmlfpr04 kernel: XFS (dm-3): xlog_space_left: head behind tail > > ^^^^ > >> Sep 22 20:17:54 nzhmlfpr04 kernel: tail_cycle = 125, tail_bytes = 489472 > >> Sep 22 20:17:54 nzhmlfpr04 kernel: GH cycle = 125, GH bytes = 468080 > >> Sep 22 20:19:07 nzhmlfpr04 kernel: XFS (snumbd11d): Corruption > > ^^^^^^^^^ > >> detected. Unmount and run xfs_repair > > > > Note the different device names the errors are for? So the log space > > warnings are from different filesystems to the one that corruption > > has been found on. IOWs, unrelated. > > There are 4 xfs filesystems mounted on that machine. According to the logs, there are at least 5: dm-{2,3,4,5} and snumbd11d. > >> and what else > >> could have cause the 2nd ? > > > > Don't know. There's no stack trace in the error message, so I don't > > even know where it came from. have you modified the xfs_error_level > > sysctl to turn off verbose reporting? > > sysctl.conf is default for CentOS. So there's an error that isn't reporting a stack by default. That means it is probably a directory read that is triggering it - knowing what errors xfs_repair reported would help narrow it down. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Sep 24 06:36:07 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8OBa7Cr136635 for ; Mon, 24 Sep 2012 06:36:07 -0500 X-ASG-Debug-ID: 1348486641-04cbb07ce5692f30001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id nj79asy0QfNAUqJd for ; Mon, 24 Sep 2012 04:37:21 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AgwKAMtEYFB5Lafp/2dsb2JhbABFvSIDgQaBCYIgAQEEATocIwULCAMOCi4UJQMhE4d/BQy3eRSLCHyFLgOVZJAkgnk Received: from ppp121-45-167-233.lns20.syd6.internode.on.net (HELO dastard) ([121.45.167.233]) by ipmail04.adl6.internode.on.net with ESMTP; 24 Sep 2012 21:07:19 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TG6yU-0005MM-Mj; Mon, 24 Sep 2012 21:37:18 +1000 Date: Mon, 24 Sep 2012 21:37:18 +1000 From: Dave Chinner To: Dmitry Monakhov Cc: Eric Sandeen , linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, hch@lst.de Subject: Re: [PATCH 1/6] xfstest: add fio git submodule Message-ID: <20120924113718.GK20960@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/6] xfstest: add fio git submodule References: <1348428276-13161-1-git-send-email-dmonakhov@openvz.org> <505FD0A9.3090601@redhat.com> <87lifzd9fl.fsf@openvz.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <87lifzd9fl.fsf@openvz.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1348486641 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109446 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Sep 24, 2012 at 02:03:42PM +0400, Dmitry Monakhov wrote: > On Sun, 23 Sep 2012 22:16:57 -0500, Eric Sandeen wrote: > > On 9/23/12 2:24 PM, Dmitry Monakhov wrote: > > > FIO is very flexible io generator, i would call it IO swiss knife. > > > Currently we have tonnes of hardcoded application which reproduces > > > some predefined scenario. This approach has obvious dissadvantages > > > 1) Lack of flexability: once written it is hard to modify it in future > > > 2) Code base is large, many routines written again and again > > > > > > At the same time add new fio based tast is just add simle INI file. > > > This greatly simplify code review. I do beleve that some day we will > > > replace most of hardcoded io binaries with fio. > > > > The submodule approach is interesting, but I wonder - we have quite a few > > dependencies on other binaries already; what are the pros and cons of creating > > this as a git submodule vs. simply expecting fio to be installed on the > > system like any of the other dependencies we have today? > Pro: > P1) allow to specify exact commit as a submodule HEAD this guarantee > that we will have known version and functionality regardless to > distribution package manager (which are known to be very conservative) You haven't provided a method to do this in this patch. All you've provided is a submodule that tracks the fio tree head. All this needs to be properly documented in the README file, at minimum. And conservative is good, too. I don't want tests to fail because of rapid changes in the fio tree causing regressions in fio itself. The tools that xfstests depends on need to be stable and relatively unchanging, because we're not testing them - we're testing the filesystem. The less the environemnt changes around the things we're actually supposed to be regression testing, the better. > P2) Prevent duplicating of source code (fsstress.c/aio-stress.c and > etc). If some one want to add new feature to submodule he > simply push it to official submodule repo and move submodule HEAD > In that both parties(submodule maintainer and project maintainer) > will benefit because new features will be available to every > submodule user > Cons: > C1) New dependencies > C2) Learn people how to work with submodules > > I'll not assume (C2) as a serious argument because this is just one more > git's command. For most users should just add new option to clone: > git clone --recursive git://git.kernel.org/pub/scm/fs/xfs/xfstests-dev.git Doesn't work for me. I keep local mirrors of all git trees that I use regularly and update them by cron jobs so that I don't have to go to the internet for every local tree that I clone or update. That's particularly important for me because I'm a *long* way from the US or Europe and cloning from scratch over the internet takes a long time and suck up a lot of bandwidth. I don't even allow my test machines to access the internet - they only know about the local network and mirrors. I'd have to overide the fio submodule URL in the xfstests repository on every test machine, and that gets messy in a hurry. Also, we distribute xfstests as a tarball, and there has been talk of proper packaging (rpm/deb) as well. In those cases, the git submodule approach does not work as we have to depend on the distro supplied fio packages... > (C1) Is not big deal in case of Fio because we already depends from > libaio. There's also a fio version dependency. i.e. _require_fio has to detect whether the currently installed fio is of sufficiently recent version for the tests to run. > (P2) Makes xfstest coverage larger because all new tests which use new > submodules functionality will start to work by default (today it > silently ignored). As i already told fio is under rapid > development Jens Axboe does very good job so (P2) really works for > me, new features i need for xfstets was reviewed and accepted by Jens > http://git.kernel.dk/?p=fio.git;a=commit;h=8b28bd41375930664a0ff9ff9b101a88ac416ac5 > http://git.kernel.dk/?p=fio.git;a=commit;h=9c25d2e3f498707c4fd5a4bb0adf9867ecb17768 > http://git.kernel.dk/?p=fio.git;a=commit;h=e615ceafbe3962a35b7a7e06a0c8f4e2c0652c65 For me, that's not a "pro" - that's a "con" as i explained above. > > (I package fio for Fedora, is it not commonly available on other > > distros?) Available for Debian, which means all it's derivatives also have it. In short, I'd prefer we continue to use package level dependencies detected through configure/_require_foo infrastructure than using source tree level dependencies. Package level dependencies are much, much easier to manage for most people and don't require everyone to have internet access on the machines that xfstests is being built on.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From greg.freemyer@gmail.com Mon Sep 24 07:22:18 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_DKIM_INVALID autolearn=unavailable version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8OCMIPp141138 for ; Mon, 24 Sep 2012 07:22:18 -0500 X-ASG-Debug-ID: 1348489414-04cb6c56855ab460001-NocioJ Received: from mail-vc0-f181.google.com (mail-vc0-f181.google.com [209.85.220.181]) by cuda.sgi.com with ESMTP id DdHXkr6YYdnIXEFh (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 24 Sep 2012 05:23:34 -0700 (PDT) X-Barracuda-Envelope-From: greg.freemyer@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.220.181 X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.181] Received: by vchn11 with SMTP id n11so6349121vch.26 for ; Mon, 24 Sep 2012 05:23:34 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.181] X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.181] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc:content-type; bh=Un2EaovKh5bFnfm4AN5RDXF7Hu/eVHxRQem+1yhWjto=; b=QKuWHCBOxx8D0T4Qe4qZQkGSP8el5/85XIMyJ76uW5/KLq+isGUPzfIFG4O4bSj/CH 51WPC4NExhTJpZRHCa85VYv03UwsNfSqKmTqHUa0WU7JDCcaSIi0tt1IOZS6N82beELd sBNe0lkuQaQEe4b3SqqY0OFzNy6Fy1JMGBY8vf8CzxByFt/S+jFC6nLVyP53wUdiRx9s uZXluKxk6MC8SHm/vgt/TTS4HgeLMRK4/SZnu55uumQIYr+VThhp+JUPv58h8N8+kenC DmXqvo2xie52fbfw3ZXRqvCjCytlcEE4eEkjTznA5OsdjEsW1N5hX3eiON4mt+QDa8n+ 5IOQ== Received: by 10.220.150.16 with SMTP id w16mr7205341vcv.65.1348489414262; Mon, 24 Sep 2012 05:23:34 -0700 (PDT) MIME-Version: 1.0 Received: by 10.58.56.134 with HTTP; Mon, 24 Sep 2012 05:23:04 -0700 (PDT) In-Reply-To: <505FD0A9.3090601@redhat.com> References: <1348428276-13161-1-git-send-email-dmonakhov@openvz.org> <505FD0A9.3090601@redhat.com> From: Greg Freemyer Date: Mon, 24 Sep 2012 08:23:04 -0400 Message-ID: Subject: Re: [PATCH 1/6] xfstest: add fio git submodule To: Eric Sandeen X-ASG-Orig-Subj: Re: [PATCH 1/6] xfstest: add fio git submodule Cc: Dmitry Monakhov , linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, hch@lst.de, xfs@oss.sgi.com Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: mail-vc0-f181.google.com[209.85.220.181] X-Barracuda-Start-Time: 1348489414 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109450 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Sun, Sep 23, 2012 at 11:16 PM, Eric Sandeen wrote: > (I package fio for Fedora, is it not commonly available on other > distros?) opensuse has it in the benchmarking repo, but not in the main release repos. If it is getting regular updates and users will want to have the latest version, it makes sense for opensuse to leave it that way. This discussion may change that. As of a year ago, xfstests dependencies could all be met from the main repos. (see howto http://en.opensuse.org/SDB:XFStests) I believe a basic set of xfstests is run as part of the QA process for every factory build (factory is similar to rawhide). At least it was during 12.1 pre-release testing a year ago. http://openqa.opensuse.org/results/ Not a huge deal, but having xfstests tests which depend on fio would either mean opensuse dropping those tests that depend on fio from its routine QA testing, or it would mean adding fio to the main distro. How far into xfstests is fio likely to integrate? If it is to become a core tool and it is not going to be provided by xfstests itself, I can try to submit fio to factory. It will just have to kept new enough to satisfy xfstests version requirements. I do hope that if the distro has to provide a fio package, then xfstests only depend on the version, not the git check-in. Greg From rjevskiy@gmail.com Mon Sep 24 07:36:49 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_DKIM_INVALID autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8OCamZP142968 for ; Mon, 24 Sep 2012 07:36:49 -0500 X-ASG-Debug-ID: 1348490282-04bdf0067d5a8330001-NocioJ Received: from mail-lb0-f181.google.com (mail-lb0-f181.google.com [209.85.217.181]) by cuda.sgi.com with ESMTP id 19dzcUfm9POlo3FV (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 24 Sep 2012 05:38:04 -0700 (PDT) X-Barracuda-Envelope-From: rjevskiy@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.217.181 X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.181] Received: by lbbgg6 with SMTP id gg6so1911822lbb.26 for ; Mon, 24 Sep 2012 05:38:02 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.181] X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.181] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:in-reply-to:references:user-agent:date :message-id:mime-version:content-type; bh=a9DYHoWZhFb8fc6WSmqEhwkbvR+XsdBAO4SZ0NWX/d8=; b=RxoDKwm4t3hIc5NvUMoW6PCufNOhRoQvCt/wrggEqPvwWdixr1wNmFC8SQkdJRfdAc ktWbsEPg/p8rpyclC8qacdUd1qDghZr8EdesXqykQtrIQ/NXx4wmefl2spRLtrD+GSf9 GiFrusiUKmZOLKV1SrhJJPAufDvFGG2x5lRlXRcrafyGyKvMe3AgpRjhEFQqOqRAROFA bzLYskrYEr8m4VSBI9RHhKn1hP9C1XotnT41Apk9PtEnhuwoWyRP0K04aKhDv5M6onFZ y49vmH2znt4nMaqD8bneM98EMf5BnKFN852SwFus6RHov+EgFSG1RQJh5JaqBfdCrvXC mOxQ== Received: by 10.112.9.3 with SMTP id v3mr4356946lba.32.1348490282279; Mon, 24 Sep 2012 05:38:02 -0700 (PDT) Received: from smtp.gmail.com (swsoft-msk-nat.sw.ru. [195.214.232.10]) by mx.google.com with ESMTPS id hz16sm4306729lab.6.2012.09.24.05.38.01 (version=TLSv1/SSLv3 cipher=OTHER); Mon, 24 Sep 2012 05:38:01 -0700 (PDT) Sender: Dmitry Monakhov From: Dmitry Monakhov To: Dave Chinner Cc: Eric Sandeen , linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, hch@lst.de Subject: Re: [PATCH 1/6] xfstest: add fio git submodule In-Reply-To: <20120924113718.GK20960@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/6] xfstest: add fio git submodule References: <1348428276-13161-1-git-send-email-dmonakhov@openvz.org> <505FD0A9.3090601@redhat.com> <87lifzd9fl.fsf@openvz.org> <20120924113718.GK20960@dastard> User-Agent: Notmuch/0.6.1 (http://notmuchmail.org) Emacs/23.3.1 (x86_64-redhat-linux-gnu) Date: Mon, 24 Sep 2012 16:38:00 +0400 Message-ID: <87txun1tqv.fsf@openvz.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Barracuda-Connect: mail-lb0-f181.google.com[209.85.217.181] X-Barracuda-Start-Time: 1348490283 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109450 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Mon, 24 Sep 2012 21:37:18 +1000, Dave Chinner wrote: > On Mon, Sep 24, 2012 at 02:03:42PM +0400, Dmitry Monakhov wrote: > > On Sun, 23 Sep 2012 22:16:57 -0500, Eric Sandeen wrote: > > > On 9/23/12 2:24 PM, Dmitry Monakhov wrote: > > > > FIO is very flexible io generator, i would call it IO swiss knife. > > > > Currently we have tonnes of hardcoded application which reproduces > > > > some predefined scenario. This approach has obvious dissadvantages > > > > 1) Lack of flexability: once written it is hard to modify it in future > > > > 2) Code base is large, many routines written again and again > > > > > > > > At the same time add new fio based tast is just add simle INI file. > > > > This greatly simplify code review. I do beleve that some day we will > > > > replace most of hardcoded io binaries with fio. > > > > > > The submodule approach is interesting, but I wonder - we have quite a few > > > dependencies on other binaries already; what are the pros and cons of creating > > > this as a git submodule vs. simply expecting fio to be installed on the > > > system like any of the other dependencies we have today? > > Pro: > > P1) allow to specify exact commit as a submodule HEAD this guarantee > > that we will have known version and functionality regardless to > > distribution package manager (which are known to be very conservative) > > You haven't provided a method to do this in this patch. All > you've provided is a submodule that tracks the fio tree head. > All this needs to be properly documented in the README file, at > minimum. > > And conservative is good, too. I don't want tests to fail because of > rapid changes in the fio tree causing regressions in fio itself. The > tools that xfstests depends on need to be stable and relatively > unchanging, because we're not testing them - we're testing the > filesystem. The less the environemnt changes around the things we're > actually supposed to be regression testing, the better. Yes, but we do not have to advance submodule update unless we need it. Project may goes forward but we still can use old commit if needed. > > > P2) Prevent duplicating of source code (fsstress.c/aio-stress.c and > > etc). If some one want to add new feature to submodule he > > simply push it to official submodule repo and move submodule HEAD > > In that both parties(submodule maintainer and project maintainer) > > will benefit because new features will be available to every > > submodule user > > Cons: > > C1) New dependencies > > C2) Learn people how to work with submodules > > > > I'll not assume (C2) as a serious argument because this is just one more > > git's command. For most users should just add new option to clone: > > git clone --recursive git://git.kernel.org/pub/scm/fs/xfs/xfstests-dev.git > > Doesn't work for me. I keep local mirrors of all git trees that I > use regularly and update them by cron jobs so that I don't have to > go to the internet for every local tree that I clone or update. > > That's particularly important for me because I'm a *long* way from > the US or Europe and cloning from scratch over the internet takes a > long time and suck up a lot of bandwidth. I don't even allow my test > machines to access the internet - they only know about the local > network and mirrors. I'd have to overide the fio submodule URL in > the xfstests repository on every test machine, and that gets messy > in a hurry. > > Also, we distribute xfstests as a tarball, and there has been talk of > proper packaging (rpm/deb) as well. In those cases, the git > submodule approach does not work as we have to depend on the distro > supplied fio packages... Yes, if this is mandatory. it makes packaging harder but not too complex. > > > (C1) Is not big deal in case of Fio because we already depends from > > libaio. > > There's also a fio version dependency. i.e. _require_fio has to > detect whether the currently installed fio is of sufficiently recent > version for the tests to run. > > > (P2) Makes xfstest coverage larger because all new tests which use new > > submodules functionality will start to work by default (today it > > silently ignored). As i already told fio is under rapid > > development Jens Axboe does very good job so (P2) really works for > > me, new features i need for xfstets was reviewed and accepted by Jens > > http://git.kernel.dk/?p=fio.git;a=commit;h=8b28bd41375930664a0ff9ff9b101a88ac416ac5 > > http://git.kernel.dk/?p=fio.git;a=commit;h=9c25d2e3f498707c4fd5a4bb0adf9867ecb17768 > > http://git.kernel.dk/?p=fio.git;a=commit;h=e615ceafbe3962a35b7a7e06a0c8f4e2c0652c65 > > For me, that's not a "pro" - that's a "con" as i explained above. > > > > (I package fio for Fedora, is it not commonly available on other > > > distros?) > > Available for Debian, which means all it's derivatives also have it. > > In short, I'd prefer we continue to use package level dependencies > detected through configure/_require_foo infrastructure than using > source tree level dependencies. Package level dependencies are much, > much easier to manage for most people and don't require everyone to > have internet access on the machines that xfstests is being built > on.... Ok i'll go back to _require_fio $VER approach, but it is reasonable to add prep script which will fetch or install all necessary packages so user can explicitly run it if internet is available. > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > -- > To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html From rjevskiy@gmail.com Mon Sep 24 07:40:29 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_DKIM_INVALID autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8OCeTjk143562 for ; Mon, 24 Sep 2012 07:40:29 -0500 X-ASG-Debug-ID: 1348490503-04cb6c56885ac490001-NocioJ Received: from mail-lb0-f181.google.com (mail-lb0-f181.google.com [209.85.217.181]) by cuda.sgi.com with ESMTP id qfwklrBO19DYaobO (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 24 Sep 2012 05:41:44 -0700 (PDT) X-Barracuda-Envelope-From: rjevskiy@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.217.181 X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.181] Received: by lbbgg6 with SMTP id gg6so1917106lbb.26 for ; Mon, 24 Sep 2012 05:41:43 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.181] X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.181] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:in-reply-to:references:user-agent:date :message-id:mime-version:content-type; bh=rwxwY76dWhQpO4h0CKuvc0jOIrxmrbe3OPsgjH3GXF0=; b=QNwX0h+yd3o2q9qW1swCfq+AF6VlUSl+XuXK9pLbNo8Kjhd1xD4KxtR+moaFbqMnS7 OCzt9lw4bsNzAUftNflWKSblnA8sIPlq2Ul/OIHBXY65TWRycH3mjXlQXxfd6anlZvSe Czyb8Ye3wLXC4ye498x7ieYVUX5YJV6BnFKSI+vFVTxN4nny6rEP1/RKfzHTQIv4wV/F qatMjDxeyKFrqZEbAkAe/URQlszix4J2mPkFfn+e01PrdTniNKYc5b6Bqv1oUV8AyAUI +xYN+l19jhr2Y0fC6f1jGO5YLLo7P5Iy3+ceX7CxRrwFPrZEQ1vXxkHmfaIKqj9QBa8V aOBA== Received: by 10.152.128.137 with SMTP id no9mr2487675lab.5.1348490503293; Mon, 24 Sep 2012 05:41:43 -0700 (PDT) Received: from smtp.gmail.com (swsoft-msk-nat.sw.ru. [195.214.232.10]) by mx.google.com with ESMTPS id mt19sm4298555lab.17.2012.09.24.05.41.42 (version=TLSv1/SSLv3 cipher=OTHER); Mon, 24 Sep 2012 05:41:42 -0700 (PDT) Sender: Dmitry Monakhov From: Dmitry Monakhov To: Greg Freemyer , Eric Sandeen Cc: linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org, hch@lst.de, xfs@oss.sgi.com Subject: Re: [PATCH 1/6] xfstest: add fio git submodule In-Reply-To: X-ASG-Orig-Subj: Re: [PATCH 1/6] xfstest: add fio git submodule References: <1348428276-13161-1-git-send-email-dmonakhov@openvz.org> <505FD0A9.3090601@redhat.com> User-Agent: Notmuch/0.6.1 (http://notmuchmail.org) Emacs/23.3.1 (x86_64-redhat-linux-gnu) Date: Mon, 24 Sep 2012 16:41:42 +0400 Message-ID: <87r4pr1tkp.fsf@openvz.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Barracuda-Connect: mail-lb0-f181.google.com[209.85.217.181] X-Barracuda-Start-Time: 1348490504 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109450 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Mon, 24 Sep 2012 08:23:04 -0400, Greg Freemyer wrote: > On Sun, Sep 23, 2012 at 11:16 PM, Eric Sandeen wrote: > > (I package fio for Fedora, is it not commonly available on other > > distros?) > > opensuse has it in the benchmarking repo, but not in the main release > repos. If it is getting regular updates and users will want to have > the latest version, it makes sense for opensuse to leave it that way. > This discussion may change that. > > As of a year ago, xfstests dependencies could all be met from the main > repos. (see howto http://en.opensuse.org/SDB:XFStests) > > I believe a basic set of xfstests is run as part of the QA process for > every factory build (factory is similar to rawhide). At least it was > during 12.1 pre-release testing a year ago. > http://openqa.opensuse.org/results/ > > Not a huge deal, but having xfstests tests which depend on fio would > either mean opensuse dropping those tests that depend on fio from its > routine QA testing, or it would mean adding fio to the main distro. > > How far into xfstests is fio likely to integrate? If it is to become > a core tool and it is not going to be provided by xfstests itself, I > can try to submit fio to factory. It will just have to kept new > enough to satisfy xfstests version requirements. As far as i can say fio potentially can replace most of hardcoded regression binaries. > > I do hope that if the distro has to provide a fio package, then > xfstests only depend on the version, not the git check-in. > > Greg > -- > To unsubscribe from this list: send the line "unsubscribe linux-ext4" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html From tiwarikanand@gmail.com Mon Sep 24 07:49:48 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=BAYES_00,FREEMAIL_FROM, HTML_MESSAGE,T_DKIM_INVALID autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8OCnmFs144964 for ; Mon, 24 Sep 2012 07:49:48 -0500 X-ASG-Debug-ID: 1348491063-04cbb07ce4696f50001-NocioJ Received: from mail-vc0-f181.google.com (mail-vc0-f181.google.com [209.85.220.181]) by cuda.sgi.com with ESMTP id 1HbUEJ6NTlNw3jm7 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 24 Sep 2012 05:51:03 -0700 (PDT) X-Barracuda-Envelope-From: tiwarikanand@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.220.181 X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.181] Received: by vchn11 with SMTP id n11so6381522vch.26 for ; Mon, 24 Sep 2012 05:51:03 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.181] X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.181] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=/9nUqJOyxznMGYPe/qIkQyDNDVFoBZVF625RcbuNEbw=; b=WwmCofw2C2lue2jLX2GQdXOrhOQNGhNjI+kDF3lDZoH7c8oC+u/wcsuB6CnuU/fhcg Yk51Pi1J1MQg2PVNZjpIr/djmYhZQBfEYJ+gOPNBFJ42xTv3zYbbZpVRuC96gReAkYVk QkSX0RI0fIlVkIIeeNdaWx6866JdOkGXwme/1ePzhxAtdEC+E/oszIkcqIiaWBFjxSxU D/Febdv3niTIsaXpYIwVqQVlWrvy1k5Ufa2nY6TchnXbwXAWuRD0NwhunGwNq1jQx/7M TiG5vABj1vRO7d83Mg27ZENsTFyTagZ73pxnLjMg/fOXK/GbCfLuzfcLKVSvQMqgtPiF xCGQ== MIME-Version: 1.0 Received: by 10.52.64.226 with SMTP id r2mr6222343vds.53.1348491063555; Mon, 24 Sep 2012 05:51:03 -0700 (PDT) Received: by 10.58.35.10 with HTTP; Mon, 24 Sep 2012 05:51:03 -0700 (PDT) In-Reply-To: <20120924075551.GF20960@dastard> References: <505BF45D.5050909@sandeen.net> <20120924075551.GF20960@dastard> Date: Mon, 24 Sep 2012 06:51:03 -0600 Message-ID: Subject: Re: xfs_repair deleting realtime files. From: Anand Tiwari X-ASG-Orig-Subj: Re: xfs_repair deleting realtime files. To: Dave Chinner Cc: Eric Sandeen , xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=bcaec5015e8bd3754104ca720af9 X-Barracuda-Connect: mail-vc0-f181.google.com[209.85.220.181] X-Barracuda-Start-Time: 1348491063 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109452 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message --bcaec5015e8bd3754104ca720af9 Content-Type: text/plain; charset=ISO-8859-1 On Mon, Sep 24, 2012 at 1:55 AM, Dave Chinner wrote: > On Fri, Sep 21, 2012 at 12:00:13AM -0500, Eric Sandeen wrote: > > On 9/20/12 7:40 PM, Anand Tiwari wrote: > > > Hi All, > > > > > > I have been looking into an issue with xfs_repair with realtime sub > volume. some times while running xfs_repair I see following errors > > > > > > ---------------------------- > > > data fork in rt inode 134 claims used rt block 19607 > > > bad data fork in inode 134 > > > would have cleared inode 134 > > > data fork in rt inode 135 claims used rt block 29607 > > > bad data fork in inode 135 > > > would have cleared inode 135 > ..... > > > xfs_db> inode 135 > > > xfs_db> bmap > > > data offset 0 startblock 13062144 (12/479232) count 2097000 flag 0 > > > data offset 2097000 startblock 15159144 (14/479080) count 2097000 flag > 0 > > > data offset 4194000 startblock 17256144 (16/478928) count 2097000 flag > 0 > > > data offset 6291000 startblock 19353144 (18/478776) count 2097000 flag > 0 > > > data offset 8388000 startblock 21450144 (20/478624) count 2097000 flag > 0 > > > data offset 10485000 startblock 23547144 (22/478472) count 2097000 > flag 0 > > > data offset 12582000 startblock 25644144 (24/478320) count 2097000 > flag 0 > > > data offset 14679000 startblock 27741144 (26/478168) count 2097000 > flag 0 > > > data offset 16776000 startblock 29838144 (28/478016) count 2097000 > flag 0 > > > data offset 18873000 startblock 31935144 (30/477864) count 1607000 > flag 0 > > > xfs_db> inode 134 > > > xfs_db> bmap > > > data offset 0 startblock 7942144 (7/602112) count 2097000 flag 0 > > > data offset 2097000 startblock 10039144 (9/601960) count 2097000 flag 0 > > > data offset 4194000 startblock 12136144 (11/601808) count 926000 flag 0 > > > > It's been a while since I thought about realtime, but - > > > > That all seems fine, I don't see anything overlapping there, they are > > all perfectly adjacent, though of interesting size. > > Yeah, the size is the problem. > > .... > > Every extent above is length 2097000 blocks, and they are adjacent. > > But you say your realtime extent size is 512 blocks ... which doesn't go > > into 2097000 evenly. So that's odd, at least. > > Once you realise that the bmapbt is recording multiples of FSB (4k) > rather than rtextsz (2MB), it becomes more obvious what the problem > is: rounding of the extent size at MAXEXTLEN - 2097000 is only 152 > blocks short of 2^21 (2097152). > > I haven't looked at the kernel code yet to work out why it is > rounding to a non-rtextsz multiple, but that is the source of the > problem. > > The repair code is detecting that extents are not of the > correct granularity, but the error message indicates that this was > only ever expected for duplicate blocks occurring rather than a > kernel bug. So "fixing repair" is not what is needd here - finding > and fixing the kernel bug is what you shoul be looking at. > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > thanks, I started looking at allocator code and and will report if see something --bcaec5015e8bd3754104ca720af9 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable

On Mon, Sep 24, 2012 at 1:55 AM, Dave Ch= inner <david@fromorbit.com> wrote:
On Fri, Sep 21, 2012 at 12:00:13AM -0500, Eric Sandeen wr= ote:
> On 9/20/12 7:40 PM, Anand Tiwari wrote:
> > Hi All,
> >
> > I have been looking into an issue with xfs_repair with realtime s= ub volume. some times while running xfs_repair I see following errors
> >
> > ----------------------------
> > data fork in rt inode 134 claims used rt block 19607
> > bad data fork in inode 134
> > would have cleared inode 134
> > data fork in rt inode 135 claims used rt block 29607
> > bad data fork in inode 135
> > would have cleared inode 135
.....
> > xfs_db> inode 135
> > xfs_db> bmap
> > data offset 0 startblock 13062144 (12/479232) count 2097000 flag = 0
> > data offset 2097000 startblock 15159144 (14/479080) count 2097000= flag 0
> > data offset 4194000 startblock 17256144 (16/478928) count 2097000= flag 0
> > data offset 6291000 startblock 19353144 (18/478776) count 2097000= flag 0
> > data offset 8388000 startblock 21450144 (20/478624) count 2097000= flag 0
> > data offset 10485000 startblock 23547144 (22/478472) count 209700= 0 flag 0
> > data offset 12582000 startblock 25644144 (24/478320) count 209700= 0 flag 0
> > data offset 14679000 startblock 27741144 (26/478168) count 209700= 0 flag 0
> > data offset 16776000 startblock 29838144 (28/478016) count 209700= 0 flag 0
> > data offset 18873000 startblock 31935144 (30/477864) count 160700= 0 flag 0
> > xfs_db> inode 134
> > xfs_db> bmap
> > data offset 0 startblock 7942144 (7/602112) count 2097000 flag 0<= br> > > data offset 2097000 startblock 10039144 (9/601960) count 2097000 = flag 0
> > data offset 4194000 startblock 12136144 (11/601808) count 926000 = flag 0
>
> It's been a while since I thought about realtime, but -
>
> That all seems fine, I don't see anything overlapping there, they = are
> all perfectly adjacent, though of interesting size.

Yeah, the size is the problem.

....
> Every extent above is length 2097000 blocks, and the= y are adjacent.
> But you say your realtime extent size is 512 blocks ... which doesn= 9;t go
> into 2097000 evenly. =A0 So that's odd, at least.

Once you realise that the bmapbt is recording multiples of FSB (4k) rather than rtextsz (2MB), it becomes more obvious what the problem
is: rounding of the extent size at MAXEXTLEN - 2097000 is only 152
blocks short of 2^21 (2097152).

I haven't looked at the kernel code yet to work out why it is
rounding to a non-rtextsz multiple, but that is the source of the
problem.

The repair code is detecting that extents are not of the
correct granularity, but the error message indicates that this was
only ever expected for duplicate blocks occurring rather than a
kernel bug. So "fixing repair" is not what is needd here - findin= g
and fixing the kernel bug is what you shoul be looking at.

Cheers,

Dave.
--
Dave Chinner
david@fromorbit.com


thanks, I started = looking at allocator code and and will report if see something=A0
--bcaec5015e8bd3754104ca720af9-- From david@fromorbit.com Mon Sep 24 08:20:01 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8ODK15q148533 for ; Mon, 24 Sep 2012 08:20:01 -0500 X-ASG-Debug-ID: 1348492875-04cb6c56875afc80001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id Wl2IFJo8kiLxKUwC for ; Mon, 24 Sep 2012 06:21:16 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AhQKAPBdYFB5Lafp/2dsb2JhbABFhSK4EAOBB4EJgiABAQQBOhwjBQsIAxguFCUDIROHfwW4CRSLCBQIYIJVglkDlWSQJIJaH4FIAQ Received: from ppp121-45-167-233.lns20.syd6.internode.on.net (HELO dastard) ([121.45.167.233]) by ipmail04.adl6.internode.on.net with ESMTP; 24 Sep 2012 22:51:15 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TG8b3-0005b1-J7; Mon, 24 Sep 2012 23:21:13 +1000 Date: Mon, 24 Sep 2012 23:21:13 +1000 From: Dave Chinner To: Volker Cc: xfs@oss.sgi.com Subject: Re: OOM on quotacheck (again?) Message-ID: <20120924132113.GL20960@dastard> X-ASG-Orig-Subj: Re: OOM on quotacheck (again?) References: <5059D2B4.8010300@blafoo.org> <20120919205924.GC31501@dastard> <505AE2A1.5060703@blafoo.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <505AE2A1.5060703@blafoo.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1348492875 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109454 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Sep 20, 2012 at 11:32:17AM +0200, Volker wrote: > Hi, > > > Which implies you are running a 32 bit kernel even on 64 bit CPUs > > (e.g. R710). > > My mistake. That is not yet the case, but the plan for the future. > Thanks for pointing that out. > > > No surprise if you are running an i686 kernel (32 bit). You've got > > way more inodes than can fit in the kernel memory segment. > > Could you slightly elaborate on that or give me a link or two which > explain the matter? The kernel segment is limited to 960MB of RAM on ia32 bit machines unless you build with special config options that allow for up to 3GB of kernel memory. The trade off is that you've only got 4GB of RAM in teh process address space, so by default you have 3GB of RAM for each process (i.e. 960MB/3GB kernel/user split). If you change that to a 3GB/1GB split, you'll have problems with applications that are memory hogs running out of memory. As to the memory used by the inode cache, inodes tend to use between 1-1.5k of RAM each. Hence for a 960MB kernel segment, you *might* be able to cache 500,000 inodes if you don't cache anything else. Typically it will be 25-30% of that number (200-300MB of RAM in caching inodes during filesystem traversal). Seeing as you have millions of inodes, that's way more than you can cache in available kernel memory... > If a 32bit kernel is not supposed to work because of the number of > inodes, why does the 2.6.39.4-kernel work flawlessy on quota-checks on > the same filesystem a 3.6.0-rc5 32bit (which is supposed to work) fails on? Because inode reclaim on 2.6.39 is running during the quotacheck. > Doesn't that imply, that the fix submitted for 2.6.39.4 fixed a problem > which was "reinvented" by the later patch, which is now being worked > around by using a 64bit kernel for more memory? It's called a regression, and we do try to avoid them. However, ia32 gets relatively little attention due to it's limitations and hence changes that work fine on x86-64 but cause regressions on ia32 might go unnoticed for some time because relatively few people are running ia32 servers anymore. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Sep 24 08:24:28 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_65 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8ODORVA149102 for ; Mon, 24 Sep 2012 08:24:27 -0500 X-ASG-Debug-ID: 1348493141-04bdf06cd04b4df0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id yaDUQdGf6Px8qjM6 for ; Mon, 24 Sep 2012 06:25:42 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AhQKAB9fYFB5Lafp/2dsb2JhbAA9CIUiuBADgQeBCYIgAQEFJxMcIxAIAxUDLhQlAzSIBLgDFIsIFQFmglWCWQOSNIMwkCSCWh+BSAED Received: from ppp121-45-167-233.lns20.syd6.internode.on.net (HELO dastard) ([121.45.167.233]) by ipmail04.adl6.internode.on.net with ESMTP; 24 Sep 2012 22:55:20 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TG8f1-0005bl-Dn; Mon, 24 Sep 2012 23:25:19 +1000 Date: Mon, 24 Sep 2012 23:25:19 +1000 From: Dave Chinner To: tinguely@sgi.com Cc: xfs@oss.sgi.com Subject: Re: [PATCH 0/3] xfs: allocation worker causes freelist buffer lock hang Message-ID: <20120924132519.GM20960@dastard> X-ASG-Orig-Subj: Re: [PATCH 0/3] xfs: allocation worker causes freelist buffer lock hang References: <20120919163133.097340199@sgi.com> <20120919233435.GF31501@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20120919233435.GF31501@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1348493141 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109454 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header On Thu, Sep 20, 2012 at 09:34:35AM +1000, Dave Chinner wrote: > On Wed, Sep 19, 2012 at 11:31:33AM -0500, tinguely@sgi.com wrote: > > We have experience file system hangs on the IA64, X86_32 and X86_64 > > environments caused by a deadlock on AGF buffers. > > > > The below stack frames is a simple example of the deadlock. This example > > was taken from the current OSS Linux 3.6 sources on a x86_32 machine that > > was suffering from a daemon storm at the time: > > I hit it last night via test 113 on a RHEL6 backport that has the > old workqueue implementation and so only has one worker per CPU. ..... > > I traced the callers of xfs_alloc_vextent(), noting transaction creation, > > commits and cancels; I noted loops in the callers and which were marked > > as metadata/userdata. I can send this document to reviewers. > > No need, I can see the (generic) problem now that it has been > pointed out. > > Basically, this is what the rescuer thread is kind of for - it works > around the inability to allocate a new worker thread due to a OOM > situation. This doesn't help us here because that rescuer would > simply block like the others. Hence a rescuer thread concept doesn't > solve the problem at all. > > So lets go back to the case at hand. We block because this is the > first attempt to lock the AGF in an allocation, and the > XFS_ALLOC_FLAG_TRYLOCK flag is not set. This indicates we are asking > for allocation in a specific AG from __xfs_alloc_vextent(), and we > can't do that until some other allocation completes. Given that AGF > locking orders are strictly enforced, we know that the holder of the > AGF will not deadlock as long as it can be scheduled to run. > > IOWs, it is not safe to block forever on a lock in a worker thread > when there are outside dependencies on that lock being released to > make progress. To me that's not really a deadlock in the traditional > sense - it's more akin to a priority inversion that prevents the > resource holder from making progress. i.e. blocked threads hold the > worker resources, which prevent the lock holder from being able to > run and release the lock. > > Hmmm. I think there are other ways to trigger this as well. > Anything that holds the AGF locked for a period of time is going to > cause allocations to back up like this, regardless of whether we > queue at xfs_alloc_vexent() or xfs_bmapi_write(). For example, > FITRIM holds the AGF locked for as long as it takes to issue all the > discard operations. That could stall enough allocations to run us > out of worker threads and hence effectively stop data allocations > from being run for some period of time. It won't deadlock, but it > certainly is sub-optimal behaviour. > > I suspect the only way to fix this is to re-use the old workqueue > method of avoiding blocking on the workqueue indefinitely. That is, > if we fail to get the lock in this case, we return with EGAIN and > requeue the work. __xfs_alloc_vextent() and xfs_alloc_fix_freelist() > already have trylock support, so this should be fairly easy to do. > If I also convert the work to delayed work, I can easily add a > backoff that will prevent busy looping on the workqueue. > > I'll have a quick look at this and see what falls out.... Here's what fell out. I've smoke tested it on a couple of different machines with xfstests, and all seems fine so far. Cheers, Dave. -- Dave Chinner david@fromorbit.com xfs: don't block xfs_alloc_wq on AGF locks From: Dave Chinner When the workqueue runs out of worker threads because all the allocations are blockd on the AGF lock, the AGF lock holder cannot run to complete the allocation transaction that will unlock the AGF. As a result, allocations stop making progress. Raising the workqueue concurrency limit does not solve the problem, just raises the number of allocations that need to block before we hit the starvation issue. To avoid workqueue starvation, instead of blocking on the AGF lock only try to lock the AGF when caled from worker thread context. If we fail to get the lock on all the AGs we are allowed to try, return an EAGAIN error and have the worker requeue the allocation work for a short time in the future when progress has been made. Because we no longer block worker threads, we avoid the issue of starving allocations requests of service and hence will always make progress. Because the trylock semantics are now slightly different, add a "try-harder" flag to ensure that we avoid conflating the new "trylock" with the existing "avoid allocating data in a metadata prefered AG" semantics. The "try-harder" flag is now used to indicate data allocation in metadata-preferred AGs is allowed. Signed-off-by: Dave Chinner --- fs/xfs/xfs_alloc.c | 65 +++++++++++++++++++++++++++++++++++++--------------- fs/xfs/xfs_alloc.h | 3 ++- 2 files changed, 48 insertions(+), 20 deletions(-) diff --git a/fs/xfs/xfs_alloc.c b/fs/xfs/xfs_alloc.c index 4f33c32..37cd31d 100644 --- a/fs/xfs/xfs_alloc.c +++ b/fs/xfs/xfs_alloc.c @@ -1764,9 +1764,9 @@ xfs_alloc_fix_freelist( xfs_trans_t *tp; /* transaction pointer */ mp = args->mp; - pag = args->pag; tp = args->tp; + if (!pag->pagf_init) { if ((error = xfs_alloc_read_agf(mp, tp, args->agno, flags, &agbp))) @@ -1775,7 +1775,7 @@ xfs_alloc_fix_freelist( ASSERT(flags & XFS_ALLOC_FLAG_TRYLOCK); ASSERT(!(flags & XFS_ALLOC_FLAG_FREEING)); args->agbp = NULL; - return 0; + return EAGAIN; } } else agbp = NULL; @@ -1786,7 +1786,7 @@ xfs_alloc_fix_freelist( * try harder at this point */ if (pag->pagf_metadata && args->userdata && - (flags & XFS_ALLOC_FLAG_TRYLOCK)) { + (flags & XFS_ALLOC_FLAG_TRYHARD)) { ASSERT(!(flags & XFS_ALLOC_FLAG_FREEING)); args->agbp = NULL; return 0; @@ -1822,7 +1822,7 @@ xfs_alloc_fix_freelist( ASSERT(flags & XFS_ALLOC_FLAG_TRYLOCK); ASSERT(!(flags & XFS_ALLOC_FLAG_FREEING)); args->agbp = NULL; - return 0; + return EAGAIN; } } /* @@ -2208,7 +2208,8 @@ xfs_alloc_read_agf( */ int /* error */ __xfs_alloc_vextent( - xfs_alloc_arg_t *args) /* allocation argument structure */ + xfs_alloc_arg_t *args, + bool trylock) { xfs_agblock_t agsize; /* allocation group size */ int error; @@ -2249,6 +2250,7 @@ __xfs_alloc_vextent( } minleft = args->minleft; + flags = trylock ? XFS_ALLOC_FLAG_TRYLOCK : 0; switch (type) { case XFS_ALLOCTYPE_THIS_AG: case XFS_ALLOCTYPE_NEAR_BNO: @@ -2259,7 +2261,7 @@ __xfs_alloc_vextent( args->agno = XFS_FSB_TO_AGNO(mp, args->fsbno); args->pag = xfs_perag_get(mp, args->agno); args->minleft = 0; - error = xfs_alloc_fix_freelist(args, 0); + error = xfs_alloc_fix_freelist(args, flags); args->minleft = minleft; if (error) { trace_xfs_alloc_vextent_nofix(args); @@ -2309,7 +2311,7 @@ __xfs_alloc_vextent( args->agno = XFS_FSB_TO_AGNO(mp, args->fsbno); args->type = XFS_ALLOCTYPE_THIS_AG; sagno = 0; - flags = 0; + flags |= XFS_ALLOC_FLAG_TRYHARD; } else { if (type == XFS_ALLOCTYPE_START_AG) args->type = XFS_ALLOCTYPE_THIS_AG; @@ -2328,7 +2330,7 @@ __xfs_alloc_vextent( if (no_min) args->minleft = 0; error = xfs_alloc_fix_freelist(args, flags); args->minleft = minleft; - if (error) { + if (error && error != EAGAIN) { trace_xfs_alloc_vextent_nofix(args); goto error0; } @@ -2374,8 +2376,16 @@ __xfs_alloc_vextent( } if (flags == 0) { no_min = 1; + } else if (trylock && + flags == XFS_ALLOC_FLAG_TRYLOCK) { + flags |= XFS_ALLOC_FLAG_TRYHARD; + } else if (trylock && + (flags & XFS_ALLOC_FLAG_TRYHARD)) { + error = EAGAIN; + trace_xfs_alloc_vextent_noagbp(args); + goto error0; } else { - flags = 0; + flags = XFS_ALLOC_FLAG_TRYHARD; if (type == XFS_ALLOCTYPE_START_BNO) { args->agbno = XFS_FSB_TO_AGBNO(mp, args->fsbno); @@ -2417,28 +2427,45 @@ error0: return error; } +/* + * The worker is not allowed to block indefinitely on AGF locks. This prevents + * worker thread starvation from preventing allocation progress from being made. + * This occurs when the transaction holding the AGF cannot be scheduled to run + * in a worker because all worker threads are blocked on the AGF lock and no + * more can be allocated. + */ static void xfs_alloc_vextent_worker( struct work_struct *work) { - struct xfs_alloc_arg *args = container_of(work, + struct delayed_work *dwork = container_of(work, + struct delayed_work, work); + struct xfs_alloc_arg *args = container_of(dwork, struct xfs_alloc_arg, work); unsigned long pflags; + int result; /* we are in a transaction context here */ current_set_flags_nested(&pflags, PF_FSTRANS); - args->result = __xfs_alloc_vextent(args); - complete(args->done); + result = __xfs_alloc_vextent(args, true); + if (result == EAGAIN) { + /* requeue for a later retry */ + queue_delayed_work(xfs_alloc_wq, &args->work, + msecs_to_jiffies(10)); + } else { + args->result = result; + complete(args->done); + } current_restore_flags_nested(&pflags, PF_FSTRANS); } /* * Data allocation requests often come in with little stack to work on. Push - * them off to a worker thread so there is lots of stack to use. Metadata - * requests, OTOH, are generally from low stack usage paths, so avoid the - * context switch overhead here. + * them off to a worker thread so there is lots of stack to use if we are not + * already in a worker thread context. Metadata requests, OTOH, are generally + * from low stack usage paths, so avoid the context switch overhead here. */ int xfs_alloc_vextent( @@ -2446,13 +2473,13 @@ xfs_alloc_vextent( { DECLARE_COMPLETION_ONSTACK(done); - if (!args->userdata) - return __xfs_alloc_vextent(args); + if (!args->userdata || (current->flags & PF_WQ_WORKER)) + return __xfs_alloc_vextent(args, false); args->done = &done; - INIT_WORK_ONSTACK(&args->work, xfs_alloc_vextent_worker); - queue_work(xfs_alloc_wq, &args->work); + INIT_DELAYED_WORK_ONSTACK(&args->work, xfs_alloc_vextent_worker); + queue_delayed_work(xfs_alloc_wq, &args->work, 0); wait_for_completion(&done); return args->result; } diff --git a/fs/xfs/xfs_alloc.h b/fs/xfs/xfs_alloc.h index 93be4a6..047a239 100644 --- a/fs/xfs/xfs_alloc.h +++ b/fs/xfs/xfs_alloc.h @@ -54,6 +54,7 @@ typedef unsigned int xfs_alloctype_t; */ #define XFS_ALLOC_FLAG_TRYLOCK 0x00000001 /* use trylock for buffer locking */ #define XFS_ALLOC_FLAG_FREEING 0x00000002 /* indicate caller is freeing extents*/ +#define XFS_ALLOC_FLAG_TRYHARD 0x00000004 /* also use metadata AGs for data */ /* * In order to avoid ENOSPC-related deadlock caused by @@ -121,7 +122,7 @@ typedef struct xfs_alloc_arg { char userdata; /* set if this is user data */ xfs_fsblock_t firstblock; /* io first block allocated */ struct completion *done; - struct work_struct work; + struct delayed_work work; int result; } xfs_alloc_arg_t; From david@fromorbit.com Mon Sep 24 08:52:23 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8ODqMet152330 for ; Mon, 24 Sep 2012 08:52:23 -0500 X-ASG-Debug-ID: 1348494816-04cb6c56875b2e10001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id HH4A8JO3YGmb9YgL for ; Mon, 24 Sep 2012 06:53:37 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AhQKAA1lYFB5Lafp/2dsb2JhbABFhSK4EAOBB4EJgiABAQQBOhwjEAgDDgouFCUDIRMbA4dhBQy3ehSLCHyCVYJZA5VkkCSCWh8 Received: from ppp121-45-167-233.lns20.syd6.internode.on.net (HELO dastard) ([121.45.167.233]) by ipmail04.adl6.internode.on.net with ESMTP; 24 Sep 2012 23:23:35 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TG96M-0005eq-So; Mon, 24 Sep 2012 23:53:34 +1000 Date: Mon, 24 Sep 2012 23:53:34 +1000 From: Dave Chinner To: Dmitry Monakhov Cc: Eric Sandeen , linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, hch@lst.de Subject: Re: [PATCH 1/6] xfstest: add fio git submodule Message-ID: <20120924135334.GN20960@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/6] xfstest: add fio git submodule References: <1348428276-13161-1-git-send-email-dmonakhov@openvz.org> <505FD0A9.3090601@redhat.com> <87lifzd9fl.fsf@openvz.org> <20120924113718.GK20960@dastard> <87txun1tqv.fsf@openvz.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <87txun1tqv.fsf@openvz.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1348494816 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109456 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Sep 24, 2012 at 04:38:00PM +0400, Dmitry Monakhov wrote: > On Mon, 24 Sep 2012 21:37:18 +1000, Dave Chinner wrote: > > On Mon, Sep 24, 2012 at 02:03:42PM +0400, Dmitry Monakhov wrote: > > > On Sun, 23 Sep 2012 22:16:57 -0500, Eric Sandeen wrote: > > > > On 9/23/12 2:24 PM, Dmitry Monakhov wrote: > > > > > FIO is very flexible io generator, i would call it IO swiss knife. > > > > > Currently we have tonnes of hardcoded application which reproduces > > > > > some predefined scenario. This approach has obvious dissadvantages > > > > > 1) Lack of flexability: once written it is hard to modify it in future > > > > > 2) Code base is large, many routines written again and again > > > > > > > > > > At the same time add new fio based tast is just add simle INI file. > > > > > This greatly simplify code review. I do beleve that some day we will > > > > > replace most of hardcoded io binaries with fio. > > > > > > > > The submodule approach is interesting, but I wonder - we have quite a few > > > > dependencies on other binaries already; what are the pros and cons of creating > > > > this as a git submodule vs. simply expecting fio to be installed on the > > > > system like any of the other dependencies we have today? > > > Pro: > > > P1) allow to specify exact commit as a submodule HEAD this guarantee > > > that we will have known version and functionality regardless to > > > distribution package manager (which are known to be very conservative) > > > > You haven't provided a method to do this in this patch. All > > you've provided is a submodule that tracks the fio tree head. > > All this needs to be properly documented in the README file, at > > minimum. > > > > And conservative is good, too. I don't want tests to fail because of > > rapid changes in the fio tree causing regressions in fio itself. The > > tools that xfstests depends on need to be stable and relatively > > unchanging, because we're not testing them - we're testing the > > filesystem. The less the environemnt changes around the things we're > > actually supposed to be regression testing, the better. > Yes, but we do not have to advance submodule update unless we need it. > Project may goes forward but we still can use old commit if needed. Sure, but that them means we need to track fio closely enough and commit changes to the upstream xfstests repository whenever someone needs to move it forward. It's a centralised solution that doesn't improve the workflow of significant users of xfstests. Indeed, what happens if we take this and run it on an old distro or platform that a current fio hasn't even been tested on (e.g. RHEL 5.x, SLES10.x, MIPSEL or SH)? i.e. what happens when the blessed xfstests fio version doesn't even compile on the test target? It gets messy in a hurry because the xfstests maintainers have to solve that problem. I *much* prefer to have external dependencies handled the same way for all external tools and libraries: if the distro doesn't supply it, then the user needs to download it, install it and get it working themselves. If they don't install it or the installed version is too old, then the tests get skipped. That moves the burden of dealing with fio integration issues to the end user, not onto the xfstests maintainers. End users are scalable, maintainers are not. > > > P2) Prevent duplicating of source code (fsstress.c/aio-stress.c and > > > etc). If some one want to add new feature to submodule he > > > simply push it to official submodule repo and move submodule HEAD > > > In that both parties(submodule maintainer and project maintainer) > > > will benefit because new features will be available to every > > > submodule user > > > Cons: > > > C1) New dependencies > > > C2) Learn people how to work with submodules > > > > > > I'll not assume (C2) as a serious argument because this is just one more > > > git's command. For most users should just add new option to clone: > > > git clone --recursive git://git.kernel.org/pub/scm/fs/xfs/xfstests-dev.git > > > > Doesn't work for me. I keep local mirrors of all git trees that I > > use regularly and update them by cron jobs so that I don't have to > > go to the internet for every local tree that I clone or update. > > > > That's particularly important for me because I'm a *long* way from > > the US or Europe and cloning from scratch over the internet takes a > > long time and suck up a lot of bandwidth. I don't even allow my test > > machines to access the internet - they only know about the local > > network and mirrors. I'd have to overide the fio submodule URL in > > the xfstests repository on every test machine, and that gets messy > > in a hurry. > > > > Also, we distribute xfstests as a tarball, and there has been talk of > > proper packaging (rpm/deb) as well. In those cases, the git > > submodule approach does not work as we have to depend on the distro > > supplied fio packages... > Yes, if this is mandatory. it makes packaging harder but not too > complex. IMO, the submodule approach is an all-or-nothing approach that is difficult to opt-out of or work around. Making it harder to maintain a working test environment for a significant percentage of the xfstests userbase is not a win, IMO. > > > (C1) Is not big deal in case of Fio because we already depends from > > > libaio. > > > > There's also a fio version dependency. i.e. _require_fio has to > > detect whether the currently installed fio is of sufficiently recent > > version for the tests to run. > > > > > (P2) Makes xfstest coverage larger because all new tests which use new > > > submodules functionality will start to work by default (today it > > > silently ignored). As i already told fio is under rapid > > > development Jens Axboe does very good job so (P2) really works for > > > me, new features i need for xfstets was reviewed and accepted by Jens > > > http://git.kernel.dk/?p=fio.git;a=commit;h=8b28bd41375930664a0ff9ff9b101a88ac416ac5 > > > http://git.kernel.dk/?p=fio.git;a=commit;h=9c25d2e3f498707c4fd5a4bb0adf9867ecb17768 > > > http://git.kernel.dk/?p=fio.git;a=commit;h=e615ceafbe3962a35b7a7e06a0c8f4e2c0652c65 > > > > For me, that's not a "pro" - that's a "con" as i explained above. > > > > > > (I package fio for Fedora, is it not commonly available on other > > > > distros?) > > > > Available for Debian, which means all it's derivatives also have it. > > > > In short, I'd prefer we continue to use package level dependencies > > detected through configure/_require_foo infrastructure than using > > source tree level dependencies. Package level dependencies are much, > > much easier to manage for most people and don't require everyone to > > have internet access on the machines that xfstests is being built > > on.... > Ok i'll go back to _require_fio $VER approach, but it is reasonable to > add prep script which will fetch or install all necessary packages > so user can explicitly run it if internet is available. I don't think that a "fetch and build this tool" script is really something that is part of xfstests. Having the configure scripts warn that the required version of fio was not found and giving a pointer to the repository is consistent with the way we curently handle missing external build dependencies. Yes, I dislike autoconf at times, too, but I think it's a better solution to external dependencies at the source level for xfstests than git submodules..... Cheers, Dave. -- Dave Chinner david@fromorbit.com From rjevskiy@gmail.com Mon Sep 24 09:22:10 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_62, J_CHICKENPOX_66,T_DKIM_INVALID autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8OEMA1P155678 for ; Mon, 24 Sep 2012 09:22:10 -0500 X-ASG-Debug-ID: 1348496605-04cbb07ce56a0520001-NocioJ Received: from mail-lb0-f181.google.com (mail-lb0-f181.google.com [209.85.217.181]) by cuda.sgi.com with ESMTP id VnsOCAyrAVCZxxgl (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 24 Sep 2012 07:23:26 -0700 (PDT) X-Barracuda-Envelope-From: rjevskiy@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.217.181 X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.181] Received: by lbbgg6 with SMTP id gg6so2080779lbb.26 for ; Mon, 24 Sep 2012 07:23:25 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.181] X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.181] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:x-mailer; bh=Wnlc3BooUf8QxzyWuxHcA+IPsgJscqVM2B38aADzvRk=; b=dL7tK9JUZVLbsjM2+XJJUCplODZTrfeThmyLe+yA1s84rllZHD+J1LzHAIq9xrDMmJ 2AX/v3LxHmUsX/ZlBQANO47ax4lBUHd+DFnYcm8m5Jh/wNi7w2XFqvK0zF8/BTE1AkQP idCs0XpaTSokEJrpGNXLz8oXpEz4DchgIx+zstY9/EdULMlTNHzTMookn9CVHYCwx4QH Pr1i6VaLhvEoHJpP0VmJJzUF7W+CjQcVeOuoE7SOWAx4eae4NB3xyLCcuGbh9WJiwCbv jGAYaWQo3NekHH23ZHpKTQJKzGn+8vsvpzmoPtGDftNrADmdtncahhMZlO1I3BJZ7MLe JnHA== Received: by 10.112.103.68 with SMTP id fu4mr4455632lbb.56.1348496605203; Mon, 24 Sep 2012 07:23:25 -0700 (PDT) Received: from smtp.gmail.com (swsoft-msk-nat.sw.ru. [195.214.232.10]) by mx.google.com with ESMTPS id u5sm4338609lbg.8.2012.09.24.07.23.24 (version=TLSv1/SSLv3 cipher=OTHER); Mon, 24 Sep 2012 07:23:24 -0700 (PDT) Sender: Dmitry Monakhov From: Dmitry Monakhov To: linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org Cc: xfs@oss.sgi.com, hch@lst.de, Dmitry Monakhov Subject: [PATCH 1/6] xfstests: add fio requirement V2 Date: Mon, 24 Sep 2012 18:23:16 +0400 X-ASG-Orig-Subj: [PATCH 1/6] xfstests: add fio requirement V2 Message-Id: <1348496601-32637-1-git-send-email-dmonakhov@openvz.org> X-Mailer: git-send-email 1.7.7.6 X-Barracuda-Connect: mail-lb0-f181.google.com[209.85.217.181] X-Barracuda-Start-Time: 1348496606 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109458 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature FIO is very flexible io generator, i would call it IO swiss knife. Currently we have tonns of hardcoded application which reproduces some predefined scenario. This approach has obvious dissadvantages 1) Lack of flexability: one written it is hard to modify it in future 2) Code base is large, many routines written again and again At the same time add new fio based tast is just add simle INI file. This greatly simplify code review. I do beleve that some day we will replace most of hardcoded io binaries with fio. One who is planning to run $FIO_PROG should first check that system contains appropriate version which is able to handle jobfile for example: _require_fio 286-job.fio Signed-off-by: Dmitry Monakhov --- common.config | 1 + common.rc | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 0 deletions(-) diff --git a/common.config b/common.config index 7bed1c5..d5c8956 100644 --- a/common.config +++ b/common.config @@ -158,6 +158,7 @@ export XFS_QUOTA_PROG="`set_prog_path xfs_quota`" export KILLALL_PROG="`set_prog_path killall`" export INDENT_PROG="`set_prog_path indent`" export XFS_COPY_PROG="`set_prog_path xfs_copy`" +export FIO_PROG="`set_prog_path fio`" # Generate a comparable xfsprogs version number in the form of # major * 10000 + minor * 100 + release diff --git a/common.rc b/common.rc index 602513a..f5027e7 100644 --- a/common.rc +++ b/common.rc @@ -1758,6 +1758,21 @@ _require_btrfs() [ $? -eq 0 ] || _notrun "$BTRFS_UTIL_PROG too old (must support $cmd)" } +# Check that fio is present, and it is able to execute given jobfile +_require_fio() +{ + job=$1 + + _require_command $FIO_PROG + if [ -z "$1" ]; then + return 1; + fi + + $FIO_PROG --warnings-fatal --showcmd $job >/dev/null 2>&1 + [ $? -eq 0 ] || _notrun "$FIO_PROG too old" +} + + # arg 1 is dev to remove and is output of the below eg. # ls -l /sys/class/block/sdd | rev | cut -d "/" -f 3 | rev _devmgt_remove() -- 1.7.7.6 From rjevskiy@gmail.com Mon Sep 24 09:22:12 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_66, T_DKIM_INVALID autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8OEMC26155691 for ; Mon, 24 Sep 2012 09:22:12 -0500 X-ASG-Debug-ID: 1348496607-04cbb07ce56a0530001-NocioJ Received: from mail-lb0-f181.google.com (mail-lb0-f181.google.com [209.85.217.181]) by cuda.sgi.com with ESMTP id ZG4uBKbxqFRMrA5e (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 24 Sep 2012 07:23:28 -0700 (PDT) X-Barracuda-Envelope-From: rjevskiy@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.217.181 X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.181] Received: by lbbgg6 with SMTP id gg6so2080818lbb.26 for ; Mon, 24 Sep 2012 07:23:27 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.181] X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.181] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references; bh=kxPyBF7PSzpcnMxsBH3ptxlydKfaSUPvCnVSDNs2+Dw=; b=RePldAtSMjhear9GQgWeb2DqEJWASfj7iAtgZOmt6AThndGeUYDGNlpyOhvai64e7n T9E9mOoCyKANszyigrFtXMVV+o3qo8VYC9ku7zRuSG5UIIjtwpanoDy7m+eR9R4SeCcg JILGV2evp/G1Gwk/BcmqYdt7S3ZxIC4NUBgtEYYAp6V0QyCDRmijH6hjZZX1BZ2fniuQ Jy59g7d52QszbTUq+/B/NTlhjVuRRxgLRxMCWb5GWqVRuw/QHvDAKx0X7YHJmCN7dFw9 E1Cqd0NklgxV5b56qsiZD1VoCoEbbhzGPu0wZr6qtpp9Qyt9aXg31qQyRmBZlVc8Y6cm yybA== Received: by 10.152.105.135 with SMTP id gm7mr10820673lab.22.1348496606953; Mon, 24 Sep 2012 07:23:26 -0700 (PDT) Received: from smtp.gmail.com (swsoft-msk-nat.sw.ru. [195.214.232.10]) by mx.google.com with ESMTPS id ly17sm4381713lab.2.2012.09.24.07.23.25 (version=TLSv1/SSLv3 cipher=OTHER); Mon, 24 Sep 2012 07:23:26 -0700 (PDT) Sender: Dmitry Monakhov From: Dmitry Monakhov To: linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org Cc: xfs@oss.sgi.com, hch@lst.de, Dmitry Monakhov Subject: [PATCH 2/6] xfstest: add configurable load factors Date: Mon, 24 Sep 2012 18:23:17 +0400 X-ASG-Orig-Subj: [PATCH 2/6] xfstest: add configurable load factors Message-Id: <1348496601-32637-2-git-send-email-dmonakhov@openvz.org> X-Mailer: git-send-email 1.7.7.6 In-Reply-To: <1348496601-32637-1-git-send-email-dmonakhov@openvz.org> References: <1348496601-32637-1-git-send-email-dmonakhov@openvz.org> X-Barracuda-Connect: mail-lb0-f181.google.com[209.85.217.181] X-Barracuda-Start-Time: 1348496607 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109458 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Most stress test has probable behaviour, the longer test run the larger corner cases will be cover. It is reasonable to allow user to provide some sort of system load factor. This patch introduce two global variables LOAD_FACTOR: Usually means factor number of running tasks TIME_FACTOR: Usually means factor of run time, or number of operations If not speficied both variables defined to 1, so original behaviour preserved. TODO: Change all stress tests to use this variables Signed-off-by: Dmitry Monakhov --- common.config | 8 ++++++++ 1 files changed, 8 insertions(+), 0 deletions(-) diff --git a/common.config b/common.config index d5c8956..cfa7bde 100644 --- a/common.config +++ b/common.config @@ -253,5 +253,13 @@ if [ ! -z "$SCRATCH_MNT" -a ! -d "$SCRATCH_MNT" ]; then exit 1 fi +if [ -z "$LOAD_FACTOR" ]; then + LOAD_FACTOR=1 +fi + +if [ -z "$TIME_FACTOR" ]; then + TIME_FACTOR=1 +fi + # make sure this script returns success /bin/true -- 1.7.7.6 From rjevskiy@gmail.com Mon Sep 24 09:22:13 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_72, LOCAL_GNU_PATCH,T_DKIM_INVALID autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8OEMDl2155699 for ; Mon, 24 Sep 2012 09:22:13 -0500 X-ASG-Debug-ID: 1348496605-04cbb07ce56a0520002-NocioJ Received: from mail-lb0-f181.google.com (mail-lb0-f181.google.com [209.85.217.181]) by cuda.sgi.com with ESMTP id ERlFbNZCOHcDS2HF (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 24 Sep 2012 07:23:28 -0700 (PDT) X-Barracuda-Envelope-From: rjevskiy@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.217.181 X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.181] Received: by mail-lb0-f181.google.com with SMTP id gg6so2080779lbb.26 for ; Mon, 24 Sep 2012 07:23:28 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.181] X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.181] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references; bh=P1rW5gTRl7okNlK3af1DoSkR3hw4lo6j+0UxE8VTThU=; b=yYo7iTA7Zfvema1aH1sj7HiIeZz+GQpkEJyKsgbcZBJKAbCCLfymFkxd3eJinAZf4g x6UTtyU0eBLZMzsE9mPt9C1zikNcCuPbzc1Y+R0o2gUCFFjddLwdKQC1DJ9PJ3NrGDVz o6ICJEaeK7ugzWQWFK7yfE05F38Xvkn5Gr5gQZRI1PFmH7rsCmvrHZ9OP2Nqul8fZhMb wROEJl3z9snqW4l82GvZNtq5YTwwKppVmSXDZMjTmHbaEs7qjulo9IhPsEv4B/+nH7US D1gbxwfGGGvKPEKQpE5YjWh834+03OVUW+EJzZbQpPHqDtkw0ickI2NLsLJylCrr7+Lv 2NDA== Received: by 10.152.111.227 with SMTP id il3mr10646753lab.23.1348496608274; Mon, 24 Sep 2012 07:23:28 -0700 (PDT) Received: from smtp.gmail.com (swsoft-msk-nat.sw.ru. [195.214.232.10]) by mx.google.com with ESMTPS id u10sm4335963lbf.11.2012.09.24.07.23.27 (version=TLSv1/SSLv3 cipher=OTHER); Mon, 24 Sep 2012 07:23:27 -0700 (PDT) Sender: Dmitry Monakhov From: Dmitry Monakhov To: linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org Cc: xfs@oss.sgi.com, hch@lst.de, Dmitry Monakhov Subject: [PATCH 3/6] xfstest: allow fsstress to use load factor where appropriate Date: Mon, 24 Sep 2012 18:23:18 +0400 X-ASG-Orig-Subj: [PATCH 3/6] xfstest: allow fsstress to use load factor where appropriate Message-Id: <1348496601-32637-3-git-send-email-dmonakhov@openvz.org> X-Mailer: git-send-email 1.7.7.6 In-Reply-To: <1348496601-32637-1-git-send-email-dmonakhov@openvz.org> References: <1348496601-32637-1-git-send-email-dmonakhov@openvz.org> X-Barracuda-Connect: mail-lb0-f181.google.com[209.85.217.181] X-Barracuda-Start-Time: 1348496607 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109458 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Signed-off-by: Dmitry Monakhov --- 017 | 5 ++++- 068 | 4 ++-- 070 | 4 +++- 076 | 5 ++++- 083 | 4 ++-- 087 | 10 ++++++---- 104 | 4 ++-- 114 | 5 +++-- 167 | 4 ++-- 232 | 5 +++-- 233 | 5 +++-- 269 | 7 ++++--- 270 | 7 ++++--- 276 | 11 ++++++----- 14 files changed, 48 insertions(+), 32 deletions(-) diff --git a/017 b/017 index 9ca0e72..8d35ee8 100755 --- a/017 +++ b/017 @@ -67,7 +67,10 @@ echo "*** test" for l in 0 1 2 3 4 do echo " *** test $l" - $FSSTRESS_PROG -d $SCRATCH_MNT -n 1000 $FSSTRESS_AVOID >>$seq.full + NUM=$((1000 * TIME_FACTOR)) + CPU=$((1 * LOAD_FACTOR)) + $FSSTRESS_PROG -d $SCRATCH_MNT -n $NUM -p $CPU \ + $FSSTRESS_AVOID >>$seq.full _scratch_mount -o remount,ro \ || _fail "remount ro failed" diff --git a/068 b/068 index b595d1d..9a01100 100755 --- a/068 +++ b/068 @@ -75,8 +75,8 @@ touch $tmp.running STRESS_DIR="$SCRATCH_MNT/fsstress_test_dir" mkdir "$STRESS_DIR" - procs=2 - nops=200 + procs=$((2 * LOAD_FACTOR)) + nops=$((200 * TIME_FACTOR)) while [ -f "$tmp.running" ] do # We do both read & write IO - not only is this more realistic, diff --git a/070 b/070 index f48c33c..286ae90 100755 --- a/070 +++ b/070 @@ -62,7 +62,9 @@ $FSSTRESS_PROG \ -f unresvsp=0 \ -f attr_set=100 \ -f attr_remove=100 \ - -p 1 -n 10000 -S c >$seq.full 2>&1 + -p $((LOAD_FACTOR)) \ + -n $((10000 * TIME_FACTOR)) \ + -S c >$seq.full 2>&1 status=$? exit diff --git a/076 b/076 index e472b26..fa1a916 100755 --- a/076 +++ b/076 @@ -74,7 +74,10 @@ echo "*** test concurrent block/fs access" cat $SCRATCH_DEV >/dev/null & pid=$! -$FSSTRESS_PROG -d $SCRATCH_MNT -p 2 -n 2000 $FSSTRESS_AVOID >>$seq.full +num=$((2000 * TIME_FACTOR)) +proc=$((2 * LOAD_FACTOR)) + +$FSSTRESS_PROG -d $SCRATCH_MNT -p $proc -n $num $FSSTRESS_AVOID >>$seq.full _lets_get_pidst _check_scratch_fs diff --git a/083 b/083 index e0670b9..7af7c08 100755 --- a/083 +++ b/083 @@ -66,8 +66,8 @@ workout() { fsz=$1 ags=$2 - procs=$3 - nops=$4 + procs=$(($3 * LOAD_FACTOR)) + nops=$(($4 * TIME_FACTOR)) umount $SCRATCH_DEV >/dev/null 2>&1 echo "*** mkfs -dsize=$fsz,agcount=$ags" >>$seq.full diff --git a/087 b/087 index 48e5eaa..5c67f5e 100755 --- a/087 +++ b/087 @@ -43,11 +43,13 @@ trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15 _do_meta() { out=$SCRATCH_MNT/fsstress - count=10000 - param="-p 4 -z -f rmdir=10 -f link=10 -f creat=10 -f mkdir=10 \ + count=$((10000 * TIME_FACTOR)) + proc=$((4 * LOAD_FACTOR)) + param="-z -f rmdir=10 -f link=10 -f creat=10 -f mkdir=10 \ -f rename=30 -f stat=30 -f unlink=30 -f truncate=20" - _echofull "calling fsstress $param -m8 -n $count" - if ! $FSSTRESS_PROG $param $FSSTRESS_AVOID -m 8 -n $count -d $out >>$seq.full 2>&1 + _echofull "calling fsstress $param -m8 -p $proc -n $count" + if ! $FSSTRESS_PROG $param $FSSTRESS_AVOID -m 8 -p $proc \ + -n $count -d $out >>$seq.full 2>&1 then _echofull "fsstress failed" fi diff --git a/104 b/104 index 14f2669..abc9705 100755 --- a/104 +++ b/104 @@ -61,8 +61,8 @@ _fill_scratch() _stress_scratch() { - procs=3 - nops=1000 + procs=$((3 * LOAD_FACTOR)) + nops=$((1000 * TIME_FACTOR)) # -w ensures that the only ops are ones which cause write I/O $FSSTRESS_PROG -d $SCRATCH_MNT -w -p $procs -n $nops $FSSTRESS_AVOID > /dev/null & } diff --git a/114 b/114 index 7679222..348f992 100755 --- a/114 +++ b/114 @@ -245,12 +245,13 @@ _test_fsstress() echo "" out=$SCRATCH_MNT/fsstress.$$ - count=1000 + count=$((1000 * TIME_FACTOR)) + proc=$((3 * LOAD_FACTOR)) args="-z \ -f rmdir=10 -f link=10 -f creat=10 \ -f mkdir=10 -f rename=30 -f unlink=10 \ -f symlink=10 \ --n $count -d $out -p 3" +-n $count -d $out -p $proc" echo "fsstress $args" | sed -e "s#$out#outdir#" if ! $FSSTRESS_PROG $args | _filter_num diff --git a/167 b/167 index ccb6c2a..ad5fcd0 100755 --- a/167 +++ b/167 @@ -42,8 +42,8 @@ _cleanup() workout() { - procs=100 - nops=15000 + procs=$((100 * LOAD_FACTOR)) + nops=$((15000 * TIME_FACTOR)) $FSSTRESS_PROG -d $SCRATCH_MNT -p $procs -n $nops $FSSTRESS_AVOID \ >>$seq.full & sleep 2 diff --git a/232 b/232 index 2795da7..6cd0171 100755 --- a/232 +++ b/232 @@ -53,8 +53,9 @@ _fsstress() echo "" out=$SCRATCH_MNT/fsstress.$$ - count=2000 - args="-n $count -d $out -p 7" + count=$((2000*TIME_FACTOR)) + CPU=$((7 * LOAD_FACTOR)) + args="-n $count -d $out -p $CPU" echo "fsstress $args" | tee -a $here/$seq.full | sed -e "s#$out#outdir#" if ! $FSSTRESS_PROG $args | tee -a $here/$seq.full | _filter_num diff --git a/233 b/233 index 28e6ac7..e30d9cc 100755 --- a/233 +++ b/233 @@ -57,11 +57,12 @@ _fsstress() echo "" out=$SCRATCH_MNT/fsstress.$$ - count=5000 + count=$((5000 * TIME_FACTOR)) + proc=$((7 * LOAD_FACTOR)) args="-z \ -f rmdir=20 -f link=10 -f creat=10 -f mkdir=10 -f unlink=20 -f symlink=10 \ -f rename=10 -f fsync=2 -f write=15 -f dwrite=15 \ --n $count -d $out -p 7" +-n $count -d $out -p $proc" echo "fsstress $args" | tee -a $here/$seq.full | sed -e "s#$out#outdir#" if ! su $qa_user -c "$FSSTRESS_PROG $args" | tee -a $here/$seq.full | _filter_num diff --git a/269 b/269 index 7e13ed9..ca2700c 100755 --- a/269 +++ b/269 @@ -42,10 +42,11 @@ _workout() echo "" echo "Run fsstress" echo "" - num_iterations=10 - enospc_time=2 + num_iterations=$((10 * TIME_FACTOR)) + enospc_time=$((2 * TIME_FACTOR)) + proc=$((128 * LOAD_FACTOR)) out=$SCRATCH_MNT/fsstress.$$ - args="-p128 -n999999999 -f setattr=1 $FSSTRESS_AVOID -d $out" + args="-p $proc -n999999999 -f setattr=1 $FSSTRESS_AVOID -d $out" echo "fsstress $args" >> $here/$seq.full $FSSTRESS_PROG $args > /dev/null 2>&1 & pid=$! diff --git a/270 b/270 index b9ada27..5197910 100755 --- a/270 +++ b/270 @@ -45,10 +45,11 @@ _workout() echo "" echo "Run fsstress" echo "" - num_iterations=10 - enospc_time=2 + num_iterations=$((10 * TIME_FACTOR)) + enospc_time=$((2 * TIME_FACTOR)) + proc=$((128 * LOAD_FACTOR)) out=$SCRATCH_MNT/fsstress.$$ - args="-p128 -n999999999 -f setattr=1 $FSSTRESS_AVOID -d $out" + args="-p$proc -n999999999 -f setattr=1 $FSSTRESS_AVOID -d $out" echo "fsstress $args" >> $here/$seq.full # Grant chown capability cp $FSSTRESS_PROG $tmp.fsstress.bin diff --git a/276 b/276 index 082f943..551bef7 100755 --- a/276 +++ b/276 @@ -175,7 +175,8 @@ workout() { fsz=$1 nfiles=$2 - procs=$3 + procs=$(($3 * LOAD_FACTOR)) + num=$((1000* TIME_FACTOR)) snap_name=$4 umount $SCRATCH_DEV >/dev/null 2>&1 @@ -185,8 +186,8 @@ workout() || _fail "size=$fsz mkfs failed" run_check _scratch_mount # -w ensures that the only ops are ones which cause write I/O - run_check $FSSTRESS_PROG -d $SCRATCH_MNT -w -p $procs -n 1000 \ - $FSSTRESS_AVOID + run_check $FSSTRESS_PROG -d $SCRATCH_MNT -w -p $procs -n $num \ + $FSSTRESS_AVOID run_check $BTRFS_UTIL_PROG subvol snap $SCRATCH_MNT \ $SCRATCH_MNT/$snap_name @@ -196,13 +197,13 @@ workout() # make some noise but ensure we're not touching existing data # extents. - run_check $FSSTRESS_PROG -d $SCRATCH_MNT -p $procs -n 2000 \ + run_check $FSSTRESS_PROG -d $SCRATCH_MNT -p $procs -n $((num*2)) \ -z -f chown=3 -f link=1 -f mkdir=2 -f mknod=2 \ -f rename=2 -f setxattr=1 -f symlink=2 clean_dir="$SCRATCH_MNT/next" mkdir $clean_dir # now make more files to get a higher tree - run_check $FSSTRESS_PROG -d $clean_dir -w -p $procs -n 2000 \ + run_check $FSSTRESS_PROG -d $clean_dir -w -p $procs -n $((num*2)) \ $FSSTRESS_AVOID run_check umount $SCRATCH_DEV >/dev/null 2>&1 run_check _scratch_mount "-o atime" -- 1.7.7.6 From rjevskiy@gmail.com Mon Sep 24 09:22:15 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_DKIM_INVALID autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8OEMEpH155716 for ; Mon, 24 Sep 2012 09:22:14 -0500 X-ASG-Debug-ID: 1348496607-04cbb07ce56a0530002-NocioJ Received: from mail-lb0-f181.google.com (mail-lb0-f181.google.com [209.85.217.181]) by cuda.sgi.com with ESMTP id I4B5iGuRBcVdt1ok (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 24 Sep 2012 07:23:30 -0700 (PDT) X-Barracuda-Envelope-From: rjevskiy@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.217.181 X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.181] Received: by mail-lb0-f181.google.com with SMTP id gg6so2080818lbb.26 for ; Mon, 24 Sep 2012 07:23:30 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.181] X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.181] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references; bh=aQAJTgPtiJG8v25I0kHCvzag0l7sBuO4aOzcFTykl+0=; b=kfZJTQuaw/s6GlKR8tkova+OKRoqHt4Ln6UfwO9NH43jazQkLTQaSjggFRBoMuOPx1 mzUm7gIketw3hV2ZgAwdwYdkMS25EMaqAzc5lhSWrXA6tNC1KvtFenG+TVQTvCz3eTSe IT7GisOVQIFK0DgXBFzZLQgi9e37ymKo1g8Dt68a2JJ2bMFcKN736fFu/dkTE4dAnIBm 0jVNiODWpU4Eo14CJGmxt5YF556h6kyBsGxMq4JPAyNOLEt3qpMB+kTExKI7+35RWXaQ ob3br+SaUpS38iLFXdPNiY2HKROQetnx6tVG8fFSJj6CnO9G1PXjsATp3iqgeME56T0P CI8g== Received: by 10.112.25.99 with SMTP id b3mr4457461lbg.114.1348496609982; Mon, 24 Sep 2012 07:23:29 -0700 (PDT) Received: from smtp.gmail.com (swsoft-msk-nat.sw.ru. [195.214.232.10]) by mx.google.com with ESMTPS id n6sm2428468lbm.0.2012.09.24.07.23.28 (version=TLSv1/SSLv3 cipher=OTHER); Mon, 24 Sep 2012 07:23:29 -0700 (PDT) Sender: Dmitry Monakhov From: Dmitry Monakhov To: linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org Cc: xfs@oss.sgi.com, hch@lst.de, Dmitry Monakhov Subject: [PATCH 4/6] add fallocate/truncate vs AIO/DIO stress test Date: Mon, 24 Sep 2012 18:23:19 +0400 X-ASG-Orig-Subj: [PATCH 4/6] add fallocate/truncate vs AIO/DIO stress test Message-Id: <1348496601-32637-4-git-send-email-dmonakhov@openvz.org> X-Mailer: git-send-email 1.7.7.6 In-Reply-To: <1348496601-32637-1-git-send-email-dmonakhov@openvz.org> References: <1348496601-32637-1-git-send-email-dmonakhov@openvz.org> X-Barracuda-Connect: mail-lb0-f181.google.com[209.85.217.181] X-Barracuda-Start-Time: 1348496609 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109458 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Run DIO, fallocate and truncate threads on a common file in parallel. If race exist old dio request may rewrite blocks after it was allocated to another file, we will catch that by verifying blocks content. this patch known to catch deadlock for ext4 http://lists.openwall.net/linux-ext4/2012/09/06/3 Signed-off-by: Dmitry Monakhov --- 286 | 154 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 286.out | 5 ++ group | 1 + 3 files changed, 160 insertions(+), 0 deletions(-) create mode 100755 286 create mode 100644 286.out diff --git a/286 b/286 new file mode 100755 index 0000000..8802c56 --- /dev/null +++ b/286 @@ -0,0 +1,154 @@ +#! /bin/bash +# FSQA Test No. 286 +# +# Test various aio dio vs truncate +# +#----------------------------------------------------------------------- +# Copyright (c) 2006 Silicon Graphics, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +#----------------------------------------------------------------------- +# +# creator +owner=dmonakhov@openvz.org + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter +run_check() +{ + echo "# $@" >> $seq.full 2>&1 + "$@" >> $seq.full 2>&1 || _fail "failed: '$@'" +} + + +NUM_JOBS=$((4*LOAD_FACTOR)) +BLK_DEV_SIZE=`blockdev --getsz $SCRATCH_DEV` +FILE_SIZE=$((BLK_DEV_SIZE * 512)) + +cat >$tmp-$seq.fio <> $seq.full + run_check $FIO_PROG $tmp-$seq.fio >> $seq.full & + pid=$! + echo "Start fallocate/truncate loop" + for ((i=0; ; i++)) + do + for ((k=1; k <= NUM_JOBS; k++)) + do + fallocate -l $FILE_SIZE $SCRATCH_MNT/direct_aio.$k.0 \ + >> $seq.full 2>&1 + done + for ((k=1; k <= NUM_JOBS; k++)) + do + truncate -s 0 $SCRATCH_MNT/direct_aio.$k.0 + done + # One fio exit we can stop fallocate/truncate loop + kill -0 $pid > /dev/null 2>&1 || break + done + wait $pid +} + +# real QA test starts here +_supported_fs generic +_supported_os Linux +_need_to_be_root +_require_scratch +_require_fio $tmp-$seq.fio + +_scratch_mkfs >> $seq.full 2>&1 +_scratch_mount + +if ! _workout; then + umount $SCRATCH_DEV 2>/dev/null + exit +fi + +if ! _scratch_unmount; then + echo "failed to umount" + status=1 + exit +fi +_check_scratch_fs +status=$? +exit diff --git a/286.out b/286.out new file mode 100644 index 0000000..d721996 --- /dev/null +++ b/286.out @@ -0,0 +1,5 @@ +QA output created by 286 + +Run fio with random aio-dio pattern + +Start fallocate/truncate loop diff --git a/group b/group index 697269b..2469f80 100644 --- a/group +++ b/group @@ -404,3 +404,4 @@ deprecated 283 dump ioctl auto quick 284 auto 285 auto dump quota quick +286 auto rw enospc aio -- 1.7.7.6 From rjevskiy@gmail.com Mon Sep 24 09:22:15 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,T_DKIM_INVALID autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8OEMFjM155723 for ; Mon, 24 Sep 2012 09:22:15 -0500 X-ASG-Debug-ID: 1348496605-04cbb07ce56a0520003-NocioJ Received: from mail-lb0-f181.google.com (mail-lb0-f181.google.com [209.85.217.181]) by cuda.sgi.com with ESMTP id tnfFHfWgi4xnHmPJ (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 24 Sep 2012 07:23:31 -0700 (PDT) X-Barracuda-Envelope-From: rjevskiy@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.217.181 X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.181] Received: by mail-lb0-f181.google.com with SMTP id gg6so2080779lbb.26 for ; Mon, 24 Sep 2012 07:23:31 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.181] X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.181] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references; bh=Zlea0yYEsHYqI//43RT9S4zPE0BEaPhGAsrSMNPu4Og=; b=Ut3qPqygCGLmytPtnSKaBb5/TBc4ZUKXhLG2OsrmKgo7yY4kAM3thBaHPN8098er+y 9EMN4jJx4mVd7KLVFi4ixHLuOOXBlWf+aqFQQEz2PT2iVfpNzOPavqvvAH3krhA/DM1f ypv1oBXQYh/VUEfc/qICB8XgAWCHNF+0eaWIWqFZShsvtMVDSlADylL3Qug5CXDJOj/s FvwiIoS8Tf0dlT0RBgaZH3z5mcj2qRst1cVCbakV7RL3+uDoF2CcGgmnC+LMElODc9oC l2kZrWpfUY0vTQlYbNLfn093PaoeQ64SsK9zbsTq7cJlGSbIwMpSEYvFp39eI0HzeKpx MMAw== Received: by 10.152.105.206 with SMTP id go14mr10583878lab.37.1348496611280; Mon, 24 Sep 2012 07:23:31 -0700 (PDT) Received: from smtp.gmail.com (swsoft-msk-nat.sw.ru. [195.214.232.10]) by mx.google.com with ESMTPS id gd18sm4382516lab.1.2012.09.24.07.23.30 (version=TLSv1/SSLv3 cipher=OTHER); Mon, 24 Sep 2012 07:23:30 -0700 (PDT) Sender: Dmitry Monakhov From: Dmitry Monakhov To: linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org Cc: xfs@oss.sgi.com, hch@lst.de, Dmitry Monakhov Subject: [PATCH 5/6] add fallocate/punch_hole vs AIO/DIO stress test Date: Mon, 24 Sep 2012 18:23:20 +0400 X-ASG-Orig-Subj: [PATCH 5/6] add fallocate/punch_hole vs AIO/DIO stress test Message-Id: <1348496601-32637-5-git-send-email-dmonakhov@openvz.org> X-Mailer: git-send-email 1.7.7.6 In-Reply-To: <1348496601-32637-1-git-send-email-dmonakhov@openvz.org> References: <1348496601-32637-1-git-send-email-dmonakhov@openvz.org> X-Barracuda-Connect: mail-lb0-f181.google.com[209.85.217.181] X-Barracuda-Start-Time: 1348496609 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109458 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Run DIO, fallocate and punch_hole threads on a common file in parallel. If race exist old dio request may rewrite punched block after it was allocated to another file, we will catch that by verifying blocks content. Signed-off-by: Dmitry Monakhov --- 287 | 156 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ group | 1 + 2 files changed, 157 insertions(+), 0 deletions(-) create mode 100755 287 diff --git a/287 b/287 new file mode 100755 index 0000000..7f6823f --- /dev/null +++ b/287 @@ -0,0 +1,156 @@ +#! /bin/bash +# FSQA Test No. 287 +# +# Test various races AIO/DIO vs fallocate/punch_hole +# +#----------------------------------------------------------------------- +# Copyright (c) 2006 Silicon Graphics, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +#----------------------------------------------------------------------- +# +# creator +owner=dmonakhov@openvz.org + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter +run_check() +{ + echo "# $@" >> $seq.full 2>&1 + "$@" >> $seq.full 2>&1 || _fail "failed: '$@'" +} + + +NUM_JOBS=$((4*LOAD_FACTOR)) +BLK_DEV_SIZE=`blockdev --getsz $SCRATCH_DEV` +if [ $((BLK_DEV_SIZE)) -gt 1048576 ] +then + BLK_DEV_SIZE=1048576 +fi +FS_SIZE=$((BLK_DEV_SIZE * 512)) + +cat >$tmp-$seq.fio <> $seq.full + run_check $FIO_PROG $tmp-$seq.fio >> $seq.full +} + +# real QA test starts here +_supported_fs generic +_supported_os Linux +_need_to_be_root +_require_scratch +_require_fio $tmp-$seq.fio + +_scratch_mkfs_sized $FS_SIZE >> $seq.full 2>&1 +_scratch_mount + +if ! _workout; then + umount $SCRATCH_DEV 2>/dev/null + exit +fi + +if ! _scratch_unmount; then + echo "failed to umount" + status=1 + exit +fi +_check_scratch_fs +status=$? +exit diff --git a/group b/group index 2469f80..37f3256 100644 --- a/group +++ b/group @@ -405,3 +405,4 @@ deprecated 284 auto 285 auto dump quota quick 286 auto rw enospc aio +287 auto rw enospc aio prealloc -- 1.7.7.6 From rjevskiy@gmail.com Mon Sep 24 09:22:17 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_16, J_CHICKENPOX_36,T_DKIM_INVALID autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8OEMH7f155740 for ; Mon, 24 Sep 2012 09:22:17 -0500 X-ASG-Debug-ID: 1348496607-04cbb07ce56a0530003-NocioJ Received: from mail-lb0-f181.google.com (mail-lb0-f181.google.com [209.85.217.181]) by cuda.sgi.com with ESMTP id cyIG7Gp4ecevPiKs (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Mon, 24 Sep 2012 07:23:32 -0700 (PDT) X-Barracuda-Envelope-From: rjevskiy@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.217.181 X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.181] Received: by mail-lb0-f181.google.com with SMTP id gg6so2080818lbb.26 for ; Mon, 24 Sep 2012 07:23:32 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.181] X-Barracuda-IPDD: Level1 [gmail.com/209.85.217.181] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references; bh=KNo/zM/nUEnGYqz3TrVsfsA/LDlYE8TDcnMcREu/5uA=; b=rHBjg5h5O7gJUOjWKE9tJhOfTiQJXnpE9h75I7OaSjcc/et/LD9t8FBYdmC56Vx6fw h9kYKLrNdPpdEL2c6duiYu5eLPl2U3ywxwYo5Oe+9+8JPJjR2AxfyN+0JUuN21RGL94t HHs/RT6Y2HYO5dJKYJY6Wr4CsHobjvctLoYvN0bCRKXyDnEL7XpGa1JO96haUL0Nry8U jhv6GUO2fmAHS3XhiDxNIqQzIHbUpuZC1N9c+P0nVk65s+WSBlE96fhCapHSv+nUfSyp JW64YJLnDz3eZ2JbhhGmahDzKGq7/7o72TKqB1Z0fjwktn6B+uzsQg3XxHtAUJBQsPOG tQJA== Received: by 10.112.83.97 with SMTP id p1mr4453824lby.94.1348496612603; Mon, 24 Sep 2012 07:23:32 -0700 (PDT) Received: from smtp.gmail.com (swsoft-msk-nat.sw.ru. [195.214.232.10]) by mx.google.com with ESMTPS id mt19sm4368150lab.17.2012.09.24.07.23.31 (version=TLSv1/SSLv3 cipher=OTHER); Mon, 24 Sep 2012 07:23:32 -0700 (PDT) Sender: Dmitry Monakhov From: Dmitry Monakhov To: linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org Cc: xfs@oss.sgi.com, hch@lst.de, Dmitry Monakhov Subject: [PATCH 6/6] add defragmentation stress test for ext4 Date: Mon, 24 Sep 2012 18:23:21 +0400 X-ASG-Orig-Subj: [PATCH 6/6] add defragmentation stress test for ext4 Message-Id: <1348496601-32637-6-git-send-email-dmonakhov@openvz.org> X-Mailer: git-send-email 1.7.7.6 In-Reply-To: <1348496601-32637-1-git-send-email-dmonakhov@openvz.org> References: <1348496601-32637-1-git-send-email-dmonakhov@openvz.org> X-Barracuda-Connect: mail-lb0-f181.google.com[209.85.217.181] X-Barracuda-Start-Time: 1348496611 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109458 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Perform various regression tests for ext4defrag subsystem Test1: Defragment file while other task does direct AIO Test2: Perform defragmentation on file under buffered AIO while third task does direct AIO to donor file Test3: Two defrag tasks use common donor file. Test4: Stress defragmentation. Several threads pefrorm fragmentation at random position use inplace=1 will allocate and free blocks inside defrag event improve load pressure. This test known to caught most known e4defrag bugs. Signed-off-by: Dmitry Monakhov --- 288 | 278 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 288.out | 4 + group | 1 + 3 files changed, 283 insertions(+), 0 deletions(-) create mode 100755 288 create mode 100644 288.out diff --git a/288 b/288 new file mode 100755 index 0000000..c51f563 --- /dev/null +++ b/288 @@ -0,0 +1,278 @@ +#! /bin/bash +# FSQA Test No. 288 +# +# Ext4 defragmentatio stress test +# +#----------------------------------------------------------------------- +# Copyright (c) 2006 Silicon Graphics, Inc. All Rights Reserved. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it would be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +#----------------------------------------------------------------------- +# +# creator +owner=dmonakhov@openvz.org + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! +trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter +run_check() +{ + echo "# $@" >> $seq.full 2>&1 + "$@" >> $seq.full 2>&1 || _fail "failed: '$@'" +} + + +NUM_JOBS=$((4*LOAD_FACTOR)) +BLK_DEV_SIZE=`blockdev --getsz $SCRATCH_DEV` +# We need space for 8 files +FILE_SIZE=$((BLK_DEV_SIZE * (512 /12))) + +cat >$tmp-$seq.fio <> $seq.full + run_check $FIO_PROG $tmp-$seq.fio >> $seq.full +} + +# real QA test starts here +_supported_fs generic +_supported_os Linux +_supported_fs ext4 +_need_to_be_root +_require_scratch +_require_fio $tmp-$seq.fio + +_scratch_mkfs >> $seq.full 2>&1 +_scratch_mount + +if ! _workout; then + umount $SCRATCH_DEV 2>/dev/null + exit +fi + +if ! _scratch_unmount; then + echo "failed to umount" + status=1 + exit +fi +_check_scratch_fs +status=$? +exit diff --git a/288.out b/288.out new file mode 100644 index 0000000..b215a3f --- /dev/null +++ b/288.out @@ -0,0 +1,4 @@ +QA output created by 288 + + Start defragment activity + diff --git a/group b/group index 37f3256..8bd5c21 100644 --- a/group +++ b/group @@ -406,3 +406,4 @@ deprecated 285 auto dump quota quick 286 auto rw enospc aio 287 auto rw enospc aio prealloc +288 auto rw aio -- 1.7.7.6 From mail@blafoo.org Mon Sep 24 09:46:12 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: ** X-Spam-Status: No, score=2.1 required=5.0 tests=BAYES_00,MISSING_HEADERS, TO_NO_BRKTS_PCNT autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8OEkCbP157913 for ; Mon, 24 Sep 2012 09:46:12 -0500 X-ASG-Debug-ID: 1348498047-04bdf0067d5b4190001-NocioJ Received: from vwp1161.webpack.hosteurope.de (vwp1161.webpack.hosteurope.de [87.230.104.173]) by cuda.sgi.com with ESMTP id oIFq7oh1yVIbb8mz for ; Mon, 24 Sep 2012 07:47:28 -0700 (PDT) X-Barracuda-Envelope-From: mail@blafoo.org X-Barracuda-Apparent-Source-IP: 87.230.104.173 Received: from vs.bk.hosteurope.de ([10.20.3.39]); authenticated by vwp1161.webpack.hosteurope.de running ExIM with esmtpsa (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) id 1TG9wT-0002NZ-TW; Mon, 24 Sep 2012 16:47:25 +0200 Message-ID: <5060727D.4000009@blafoo.org> Date: Mon, 24 Sep 2012 16:47:25 +0200 From: Volker User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:15.0) Gecko/20120907 Thunderbird/15.0.1 MIME-Version: 1.0 CC: xfs@oss.sgi.com Subject: Re: OOM on quotacheck (again?) References: <5059D2B4.8010300@blafoo.org> <20120919205924.GC31501@dastard> <505AE2A1.5060703@blafoo.org> <20120924132113.GL20960@dastard> X-ASG-Orig-Subj: Re: OOM on quotacheck (again?) In-Reply-To: <20120924132113.GL20960@dastard> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-bounce-key: webpack.hosteurope.de;mail@blafoo.org;1348498048;ac77bf8f; X-Barracuda-Connect: vwp1161.webpack.hosteurope.de[87.230.104.173] X-Barracuda-Start-Time: 1348498047 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 1.21 X-Barracuda-Spam-Status: No, SCORE=1.21 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MISSING_HEADERS X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109458 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.21 MISSING_HEADERS Missing To: header Hi, >> Could you slightly elaborate on that or give me a link or two which >> explain the matter? > > The kernel segment is limited to 960MB of RAM on ia32 bit machines > unless you build with special config options that allow for up to > 3GB of kernel memory. The trade off is that you've only got 4GB of > RAM in teh process address space, so by default you have 3GB of RAM > for each process (i.e. 960MB/3GB kernel/user split). If you change > that to a 3GB/1GB split, you'll have problems with applications > that are memory hogs running out of memory. Interesting! > As to the memory used by the inode cache, inodes tend to use between > 1-1.5k of RAM each. Hence for a 960MB kernel segment, you *might* be > able to cache 500,000 inodes if you don't cache anything else. > Typically it will be 25-30% of that number (200-300MB of RAM in > caching inodes during filesystem traversal). Seeing as you have > millions of inodes, that's way more than you can cache in available > kernel memory... Great! That answered all my questions! Thanks a lot! 3.6.0-rc6-x64 ist currently running fine on 6 machines. -volker From bpm@sgi.com Mon Sep 24 12:10:46 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8OHAjmV180842 for ; Mon, 24 Sep 2012 12:10:45 -0500 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay2.corp.sgi.com (Postfix) with ESMTP id D71A1304051; Mon, 24 Sep 2012 10:11:59 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id B4D014266DC; Mon, 24 Sep 2012 12:11:59 -0500 (CDT) Date: Mon, 24 Sep 2012 12:11:59 -0500 From: Ben Myers To: tinguely@sgi.com Cc: xfs@oss.sgi.com Subject: Re: [PATCH 0/3] xfs: allocation worker causes freelist buffer lock hang Message-ID: <20120924171159.GG1140@sgi.com> References: <20120919163133.097340199@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20120919163133.097340199@sgi.com> User-Agent: Mutt/1.5.20 (2009-06-14) Hi Mark, On Wed, Sep 19, 2012 at 11:31:33AM -0500, tinguely@sgi.com wrote: ... > I traced the callers of xfs_alloc_vextent(), noting transaction creation, > commits and cancels; I noted loops in the callers and which were marked > as metadata/userdata. I can send this document to reviewers. I'd like to see the doc of xfs_alloc_vextent callers and which of them loop. Can you post your doc to the list? Regards, Ben From bpm@sgi.com Mon Sep 24 12:36:10 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8OHaAxu188078 for ; Mon, 24 Sep 2012 12:36:10 -0500 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay3.corp.sgi.com (Postfix) with ESMTP id 3788FAC001; Mon, 24 Sep 2012 10:37:24 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 9DBA64266DC; Mon, 24 Sep 2012 12:37:23 -0500 (CDT) Date: Mon, 24 Sep 2012 12:37:23 -0500 From: Ben Myers To: Mark Tinguely Cc: Dave Chinner , xfs@oss.sgi.com Subject: Re: [PATCH 1/3] xfs: restrict allocate worker to x86_64 Message-ID: <20120924173723.GH1140@sgi.com> References: <20120919163133.097340199@sgi.com> <20120919163145.367256258@sgi.com> <20120919215405.GE31501@dastard> <505B546A.6070105@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <505B546A.6070105@sgi.com> User-Agent: Mutt/1.5.20 (2009-06-14) Hey, On Thu, Sep 20, 2012 at 12:37:46PM -0500, Mark Tinguely wrote: > On 09/19/12 16:54, Dave Chinner wrote: > >On Wed, Sep 19, 2012 at 11:31:34AM -0500, tinguely@sgi.com wrote: > >>Restrict the allocation worker to X86_64 machines. This will improve > >>performance on non-X86-64 machines and avoid the AGF buffer hang. > >> > >>Signed-off-by: Mark Tinguely > > > >NACK. > > > >The stack overflow problems that this works around are not limited > >to x86-64. In the past we've seen overflows on i686 (even with 8k > >stacks), s390 and other platforms, so it's not an isolated issue. > > > >It either works or it doesn't - let's not start down the rathole of > >having different code paths and behaviours for different platforms. > > > >Cheers, > > > >Dave. > > Well, I was expecting a 4 letter word from Dave on this patch and > "NACK" was surprisingly mild. > > When the allocation worker was placed into XFS, even Christoph > wanted a kernel configure switch to be able turn it off. > > Dave has already placed a switch in the code that turns it off for > over half of the direct callers xfs_alloc_vextent() because a > performance issue. > > We are just finding places where it causes serious issues. > > This is worker is an "necessary evil" (I think those were > Christoph's review comment). We should limit the evil to where it is > necessary. I tend to agree that it is undesireble to have platform specific behaviors in XFS. Dave has a good point. Mark and Christoph also have valid points. This is a platform specific problem so it's reasonable that the solution can be platform specific too. If the list of platforms which are broken by having so little stack available in the kernel is larger than we'd like... well that's unfortunate. But it's not something we're the cause of, and it speaks to how important it is to fix the more general problem. We shouldn't penalize those who are using platforms which are not affected by this problem for the limitations of the other platforms. OTOH, if we have multiple behaviors our testing becomes more difficult. Nobody wins. I think it is desireable to be able to turn this off so that users can choose how they prefer to lose, and so that this hack continues to be easily removable if the time ever comes when we can do so. -Ben From tinguely@eagdhcp-232-125.americas.sgi.com Mon Sep 24 13:07:52 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8OI7qwB194118 for ; Mon, 24 Sep 2012 13:07:52 -0500 Received: from eagdhcp-232-125.americas.sgi.com (eagdhcp-232-125.americas.sgi.com [128.162.232.125]) by relay1.corp.sgi.com (Postfix) with ESMTP id 69CB78F806F; Mon, 24 Sep 2012 11:09:06 -0700 (PDT) Received: from eagdhcp-232-125.americas.sgi.com (localhost [127.0.0.1]) by eagdhcp-232-125.americas.sgi.com (8.14.5/8.14.5) with ESMTP id q8OI94U3003324; Mon, 24 Sep 2012 13:09:04 -0500 (CDT) (envelope-from tinguely@eagdhcp-232-125.americas.sgi.com) Received: (from tinguely@localhost) by eagdhcp-232-125.americas.sgi.com (8.14.5/8.14.5/Submit) id q8OI94s3003323; Mon, 24 Sep 2012 13:09:04 -0500 (CDT) (envelope-from tinguely) Date: Mon, 24 Sep 2012 13:09:04 -0500 (CDT) From: Mark Tinguely Message-Id: <201209241809.q8OI94s3003323@eagdhcp-232-125.americas.sgi.com> To: bpm@sgi.com, tinguely@sgi.com Subject: Re: [PATCH 0/3] xfs: allocation worker causes freelist buffer lock hang Cc: xfs@oss.sgi.com In-Reply-To: <20120924171159.GG1140@sgi.com> > From bpm@sgi.com Mon Sep 24 12:11:59 2012 > Date: Mon, 24 Sep 2012 12:11:59 -0500 > From: Ben Myers > To: > Subject: Re: [PATCH 0/3] xfs: allocation worker causes freelist buffer lock > hang > Cc: > > Hi Mark, > > On Wed, Sep 19, 2012 at 11:31:33AM -0500, tinguely@sgi.com wrote: > ... > > I traced the callers of xfs_alloc_vextent(), noting transaction creation, > > commits and cancels; I noted loops in the callers and which were marked > > as metadata/userdata. I can send this document to reviewers. > > I'd like to see the doc of xfs_alloc_vextent callers and which of them loop. > Can you post your doc to the list? > > Regards, > Ben Here are the Linux 3.6.x callers of xfs_alloc_vextent() stopping at the transaction commit/cancel level. XFS_BMAPI_METADATA *not* being set implies user data. Userdata being set is the community designated indication that an allocate worker is needed to prevent the overflow of the kernel stack. Calling xfs_alloc_vextent() several times with the same transaction can cause a dead lock if a new allocation worker can not be allocated. I noted where the loops occur. xfs_alloc_vextent() can call itself, those calls must be in the same allocation worker. As a bonus, consolidating the loops into one worker actually gives a slight performance advantage. Sorry this is wider than 80 characters wide. --- xfs_bmap_btalloc(xfs_bmalloca_t) ! xfs_bmap_alloc(xfs_bmalloca_t) ! ! xfs_bmapi_allocate(xfs_bmalloca_t, ...) ! ! ! xfs_bmapi_write(xfs_trans_t ...) loops over above ! ! ! ! xfs_attr_rmtval_set(xfs_da_args_t) loops over bmapi_write (xfs_attr_set_int) **XFS_BMAPI_METADATA** ! ! ! ! ! xfs_attr_leaf_addname(xfs_da_args_t) may do a trans_roll ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel ! ! ! ! ! xfs_attr_node_addname(xfs_da_args_t) may do a trans_roll ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel ! ! ! ! ! ! xfs_attr_leaf_addname(xfs_da_args_t) may do a trans_roll ! ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel ! ! ! ! xfs_da_grow_inode_int(xfs_da_args_t) loops over bmapi_write **XFS_BMAPI_METADATA** ! ! ! ! ! xfs_dir2_grow_inode(struct xfs_da_args) ! ! ! ! ! ! xfs_dir2_sf_to_block(xfs_da_args_t) ! ! ! ! ! ! ! xfs_bmap_add_attrfork_local(xfs_trans_t ..) ! ! ! ! ! ! ! ! xfs_bmap_add_attrfork(...) trans alloc, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! xfs_dir2_sf_addname((xfs_da_args_t) ! ! ! ! ! ! ! ! xfs_dir_createname(xfs_trans_t) ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! xfs_dir_canenter(xfs_trans_t ...) ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! xfs_dir2_leaf_addname(xfs_da_args_t) ! ! ! ! ! ! ! xfs_dir_createname(xfs_trans_t) ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! xfs_dir_canenter(xfs_trans_t) ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! xfs_dir2_block_addname(xfs_da_args_t) ! ! ! ! ! ! ! xfs_dir_createname(xfs_trans_t) ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! xfs_dir_canenter(xfs_trans_t ...) ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! xfs_dir2_sf_addname((xfs_da_args_t) ! ! ! ! ! ! ! ! xfs_dir_createname(xfs_trans_t) ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! xfs_dir_canenter(xfs_trans_t ...) ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! xfs_dir2_leaf_to_node(xfs_da_args_t) ! ! ! ! ! ! ! xfs_dir2_leaf_addname(xfs_da_args_t) ! ! ! ! ! ! ! ! xfs_dir_createname(xfs_trans_t) ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! xfs_dir_canenter(xfs_trans_t ...) ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! xfs_dir2_block_addname(xfs_da_args_t) ! ! ! ! ! ! ! ! ! xfs_dir_createname(xfs_trans_t) ! ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! xfs_dir_canenter(xfs_trans_t ...) ! ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! xfs_dir2_sf_addname((xfs_da_args_t) ! ! ! ! ! ! ! ! ! ! xfs_dir_createname(xfs_trans_t) ! ! ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! ! xfs_dir_canenter(xfs_trans_t ...) ! ! ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! xfs_dir2_node_addname_int(xfs_da_args_t ...) ! ! ! ! ! ! ! xfs_dir2_node_addname(xfs_da_args_t) ! ! ! ! ! ! ! ! xfs_dir_createname(xfs_trans_t) ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! xfs_dir_canenter(xfs_trans_t ...) ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! xfs_dir2_leaf_addname(xfs_da_args_t) ! ! ! ! ! ! ! ! ! xfs_dir_createname(xfs_trans_t) ! ! ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! xfs_dir_canenter(xfs_trans_t) ! ! ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! xfs_da_grow_inode(xfs_da_args) ! ! ! ! ! ! xfs_attr_shortform_to_leaf(xfs_da_args_t) ! ! ! ! ! ! ! xfs_attr_set_int(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! xfs_attr_leaf_to_node(xfs_da_args_t) ! ! ! ! ! ! ! xfs_attr_leaf_addname(xfs_da_args_t) may do a trans_roll ! ! ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel ! ! ! ! ! ! ! xfs_attr_node_addname(xfs_da_args_t) may do a trans_roll ! ! ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel ! ! ! ! ! ! ! ! xfs_attr_leaf_addname(xfs_da_args_t) may do a trans_roll ! ! ! ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel ! ! ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel ! ! ! ! ! ! xfs_attr_leaf_split(xfs_da_state_t ...) ! ! ! ! ! ! ! xfs_da_split(xfs_da_state_t) loops over xfs_attr_leaf_split ! ! ! ! ! ! ! ! xfs_attr_node_addname(xfs_da_args_t) trans_roll ! ! ! ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel ! ! ! ! ! ! ! ! ! xfs_attr_leaf_addname(xfs_da_args_t) may do a trans_roll ! ! ! ! ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel ! ! ! ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel ! ! ! ! ! ! ! ! xfs_dir2_node_addname(xfs_da_args_t) ! ! ! ! ! ! ! ! ! xfs_dir_createname(xfs_trans_t) ! ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! xfs_dir_canenter(xfs_trans_t ...) ! ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! xfs_dir2_leaf_addname(xfs_da_args_t) ! ! ! ! ! ! ! ! ! ! xfs_dir_createname(xfs_trans_t) ! ! ! ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! ! xfs_dir_canenter(xfs_trans_t) ! ! ! ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! xfs_da_root_split(xfs_da_state_t ...) ! ! ! ! ! ! ! xfs_da_split(xfs_da_state_t) loops over xfs_attr_leaf_split ! ! ! ! ! ! ! ! xfs_attr_node_addname(xfs_da_args_t) trans_roll ! ! ! ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel ! ! ! ! ! ! ! ! ! xfs_attr_leaf_addname(xfs_da_args_t) may do a trans_roll ! ! ! ! ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel ! ! ! ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel ! ! ! ! ! ! xfs_da_node_split(xfs_da_state_t ...) ! ! ! ! ! ! ! ! xfs_da_split(xfs_da_state_t) loops over xfs_attr_leaf_split ! ! ! ! ! ! ! ! ! xfs_attr_node_addname(xfs_da_args_t) trans_roll ! ! ! ! ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel ! ! ! ! ! ! ! ! ! ! xfs_attr_leaf_addname(xfs_da_args_t) may do a trans_roll ! ! ! ! ! ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel ! ! ! ! ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel ! ! ! ! ! ! xfs_dir2_block_to_leaf(xfs_da_args_t ...) ! ! ! ! ! ! ! xfs_dir2_block_addname(xfs_da_args_t) ! ! ! ! ! ! ! ! xfs_dir_createname(xfs_trans_t) ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! xfs_dir_canenter(xfs_trans_t ...) ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! xfs_dir2_sf_addname((xfs_da_args_t) ! ! ! ! ! ! ! ! ! xfs_dir_createname(xfs_trans_t) ! ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! xfs_dir_canenter(xfs_trans_t ...) ! ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! xfs_dir2_leafn_split(xfs_da_state_t...) ! ! ! ! ! ! ! xfs_da_split(xfs_da_state_t) loops over xfs_attr_leaf_split ! ! ! ! ! ! ! ! xfs_attr_node_addname(xfs_da_args_t) trans_roll ! ! ! ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel ! ! ! ! ! ! ! ! ! xfs_attr_leaf_addname(xfs_da_args_t) may do a trans_roll ! ! ! ! ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel ! ! ! ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel ! ! ! ! xfs_qm_dqalloc(xfs_trans_t ...) does a xfs_bmap_finish/cancel **XFS_BMAPI_METADATA** ! ! ! ! ! xfs_qm_dqtobp(xfs_trans_t ...) ! ! ! ! ! ! xfs_qm_dqread(...) does the trans_alloc/commit/cancel ! ! ! ! xfs_iomap_write_direct(...) alloc trans, xfs_trans_commit/cancel ! ! ! ! xfs_iomap_write_allocate(...) alloc trans, xfs_trans_commit/cancel safe loop ! ! ! ! xfs_iomap_write_unwritten(..) alloc trans, xfs_trans_commit/cancel safe loop ! ! ! ! xfs_growfs_rt_alloc(..) alloc trans, xfs_trans_commit/cancel safe loop ! ! ! ! xfs_symlink(...) allocates trans does a xfs_trans_commit/cancel ! ! ! ! xfs_alloc_file_space(...) alloc trans, xfs_trans_commit/cancel safe loop xfs_bmap_extents_to_btree(xfs_trans_t ...) <- set userdata to 0 (patch 3) ! xfs_bmap_add_attrfork_extents(xfs_trans_t ...) ! ! xfs_bmap_add_attrfork(...) allocates trans does a xfs_trans_commit/cancel ! xfs_bmap_add_extent_delay_real(fs_bmalloca) ! ! xfs_bmapi_allocate(xfs_bmalloca_t, ...) ! ! ! ! xfs_bmap_add_extent_unwritten_real(xfs_trans_t ...) ! ! xfs_bmapi_convert_unwritten(xfs_bmalloca ...) ! ! ! xfs_bmapi_write(xfs_trans ...) calls xfs_bmapi_convert_unwritten in loop XFS_BMAPI_METADATA ! ! ! ! ... ! ! xfs_bunmapi(xfs_trans_t ...) XFS_BMAPI_METADATA ! ! ! xfs_attr_rmtval_remove(xfs_da_args_t) loops calling xfs_bunmapi **XFS_BMAPI_METADATA** ! ! ! ! xfs_attr_leaf_addname(xfs_da_args_t) may do a trans_roll ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel ! ! ! ! xfs_attr_node_addname(xfs_da_args_t) trans_roll ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel ! ! ! ! ! xfs_attr_leaf_addname(xfs_da_args_t) may do a trans_roll ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel ! ! ! ! xfs_attr_node_removename(xfs_da_args_t) ! ! ! ! ! xfs_attr_remove_int(...) allocates trans does a xfs_trans_commit/cancel ! ! ! xfs_dir2_shrink_inode(xfs_da_args_t) **XFS_BMAPI_METADATA** ! ! ! ! xfs_dir2_leaf_trim_data(xfs_da_args_t) ! ! ! ! ! xfs_dir2_leaf_to_block(xfs_da_args_t ...) ! ! ! ! ! ! xfs_dir2_leaf_removename(xfs_da_args_t) ! ! ! ! ! ! ! xfs_dir_removename(xfs_trans ...) ! ! ! ! ! ! ! ! xfs_remove(...) allocates trans does a xfs_trans_commit/cancel ! ! ! ! xfs_dir2_leaf_trim_data(xfs_da_args_t) ! ! ! ! ! xfs_dir2_leaf_to_block(xfs_da_args_t ...) ! ! ! ! ! ! xfs_dir2_leaf_removename(xfs_da_args_t) ! ! ! ! ! ! ! xfs_dir_removename(xfs_trans ...) ! ! ! ! ! ! ! ! xfs_remove(...) allocates trans does a xfs_trans_commit/cancel ! ! ! ! ! ! xfs_dir2_node_to_leaf(xfs_da_state_t) ! ! ! ! ! ! ! xfs_dir2_node_removename(xfs_da_args_t) ! ! ! ! ! ! ! ! xfs_dir_removename(xfs_trans_t ...) creates the xfs_da_args_t ! ! ! ! ! ! ! ! ! xfs_remove(...) allocates trans does a xfs_trans_commit/cancel ! ! ! ! xfs_dir2_node_to_leaf(xfs_da_state_t) ! ! ! ! ! xfs_dir2_node_removename(xfs_da_args_t) ! ! ! ! ! ! xfs_dir_removename(xfs_trans_t ...) creates the xfs_da_args_t ! ! ! ! ! ! ! xfs_remove(...) allocates trans does a xfs_trans_commit/cancel ! ! ! xfs_bmap_punch_delalloc_range(...) loops calling xfs_bunmapi with NULL tp ! ! ! xfs_da_shrink_inode(xfs_da_args_t) loops calling xfs_bunmapi **XFS_BMAPI_METADATA** ! ! ! ! xfs_dir2_leaf_to_block(xfs_da_args_t ...) ! ! ! ! ! xfs_dir2_leaf_removename(xfs_da_args_t) ! ! ! ! ! ! xfs_dir_removename(xfs_trans ...) ! ! ! ! ! ! ! xfs_remove(...) allocates trans does a xfs_trans_commit/cancel ! ! ! xfs_itruncate_extents(xfs_trans ...) loops calling xfs_bunmapi with new tp ! ! ! xfs_inactive_symlink_rmt(..., xfs_trans_t) does a trans_commit and trans_dup ! ! ! xfs_free_file_space(...) loops calling xfs_bmapi with new tp ! xfs_bmap_add_extent_hole_real(xfs_bmalloca ...) ! ! xfs_bmapi_allocate(xfs_bmalloca_t, ...) ! ! ! ... ! xfs_bunmapi(xfs_trans_t ...) XFS_BMAPI_METADATA ! ! ... xfs_bmap_local_to_extents(xfs_trans_t ...) <- set userdata to 0 (patch 3) ! xfs_bmap_add_attrfork_local(xfs_trans_t ..) ! ! xfs_bmap_add_attrfork(...) trans alloc, bmap_finish trans_commit/cancel ! xfs_bmapi_write(xfs_trans_t ...) XFS_BMAPI_METADATA ! ! ... xfs_ialloc_ag_alloc(xfs_trans_t ...) userdata == 0 ! xfs_dialloc(xfs_trans ...) loops over the above ! ! xfs_ialloc(xfs_trans ...) ! ! ! xfs_dir_ialloc(xfs_trans ...) ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel xfs_bmbt_alloc_block(xfs_btree_cur, ...) userdata == 0 ! xfs_btree_split(xfs_btree_cur, ...) ! ! xfs_btree_make_block_unfull ! ! ! xfs_btree_insrec(xfs_btree_cur, ...) ! ! ! ! xfs_btree_insert(xfs_btree_cur, ...) ! ! ! ! ! xfs_alloc_fixup_trees(xfs_btree_cur, ...) ! ! ! ! ! ! xfs_alloc_ag_vextent_exact(xfs_alloc_arg) ! ! ! ! ! ! ! xfs_alloc_ag_vextent(xfs_alloc_arg) ! ! ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) ! ! ! ! ! ! xfs_alloc_ag_vextent_near(xfs_alloc_arg) ! ! ! ! ! ! ! xfs_alloc_ag_vextent(xfs_alloc_arg) ! ! ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) ! ! ! ! ! ! xfs_alloc_ag_vextent_size(xfs_alloc_arg) ! ! ! ! ! ! ! xfs_alloc_ag_vextent(xfs_alloc_arg) ! ! ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) ! ! ! ! ! xfs_free_ag_extent(xfs_trans ...) ! ! ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) ! ! ! ! ! xfs_bmap_add_extent_delay_real(xfs_bmalloca) ! ! ! ! ! ! xfs_bmapi_allocate(xfs_bmalloca_t, ...) ! ! ! ! ! ! ! ! ... ! ! ! ! ! xfs_bmap_add_extent_hole_real(xfs_bmalloca) ! ! ! ! ! ! xfs_bmapi_allocate(xfs_bmalloca_t, ...) ! ! ! ! ! ! ! ! ... ! ! ! ! ! xfs_bmap_add_extent_unwritten_real(xfs_trans, ...) ! ! ! ! ! ! xfs_bunmapi(xfs_trans_t ...) XFS_BMAPI_METADATA ! ! ! ! ! ! ! ... ! ! ! ! ! ! xfs_bmapi_convert_unwritten(xfs_bmalloca, ...) ! ! ! ! ! ! ! xfs_bmapi_write(xfs_trans_t ...) loop over the above ! ! ! ! ! ! ! ! ... ! ! ! ! ! xfs_bmap_del_extent(xfs_trans, ...) ! ! ! ! ! ! xfs_bunmapi(xfs_trans_t ...) XFS_BMAPI_METADATA ! ! ! ! ! ! ! ... ! ! ! ! ! xfs_ialloc_ag_alloc(xfs_trans, ...) loops over the above ! ! ! ! ! ! xfs_dialloc(xfs_trans ...) loops over the above ! ! ! ! ! ! ! xfs_ialloc(xfs_trans ...) ! ! ! ! ! ! ! ! xfs_dir_ialloc(xfs_trans ...) ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel ! xfs_btree_new_iroot(xfs_btree_cur, ...) ! ! xfs_btree_make_block_unfull(xfs_btree_cur, ...) ! ! ! xfs_btree_insrec(xfs_btree_cur, ...) ! ! ! ! xfs_btree_insert(xfs_btree_cur, ...) ! ! ! ! ! xfs_alloc_fixup_trees(xfs_btree_cur, ...) ! ! ! ! ! ! xfs_alloc_ag_vextent_exact(xfs_alloc_arg) ! ! ! ! ! ! ! xfs_alloc_ag_vextent(xfs_alloc_arg) ! ! ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) ! ! ! ! ! ! xfs_alloc_ag_vextent_near(xfs_alloc_arg) ! ! ! ! ! ! ! xfs_alloc_ag_vextent(xfs_alloc_arg) ! ! ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) ! ! ! ! ! ! xfs_alloc_ag_vextent_size(xfs_alloc_arg) ! ! ! ! ! ! ! xfs_alloc_ag_vextent(xfs_alloc_arg) ! ! ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) ! ! xfs_bmap_add_attrfork_btree(xfs_trans_t ...) ! ! ! xfs_bmap_add_attrfork(...) allocates trans does a xfs_trans_commit/cancel ! xfs_btree_new_root(xfs_btree_cur, ...) ! ! xfs_btree_insrec(xfs_btree_cur, ...) ! ! ! xfs_btree_insert(xfs_btree_cur, ...) ! ! ! xfs_alloc_fixup_trees(xfs_btree_cur, ...) ! ! ! ! xfs_alloc_ag_vextent_exact(xfs_alloc_arg) ! ! ! ! ! xfs_alloc_ag_vextent(xfs_alloc_arg) ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) ! ! ! ! xfs_alloc_ag_vextent_near(xfs_alloc_arg) ! ! ! ! ! xfs_alloc_ag_vextent(xfs_alloc_arg) ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) ! ! ! ! xfs_alloc_ag_vextent_size(xfs_alloc_arg) ! ! ! ! ! xfs_alloc_ag_vextent(xfs_alloc_arg) ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) xfs_inobt_alloc_block(xfs_btree_cur, ...) userdata == 0 ! xfs_btree_split(xfs_btree_cur, ...) ! ! xfs_btree_make_block_unfull ! ! ! xfs_btree_insrec(xfs_btree_cur, ...) ! ! ! ! xfs_btree_insert(xfs_btree_cur, ...) ! ! ! ! ! xfs_alloc_fixup_trees(xfs_btree_cur, ...) ! ! ! ! ! ! xfs_alloc_ag_vextent_exact(xfs_alloc_arg) ! ! ! ! ! ! ! xfs_alloc_ag_vextent(xfs_alloc_arg) ! ! ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) ! ! ! ! ! ! xfs_alloc_ag_vextent_near(xfs_alloc_arg) ! ! ! ! ! ! ! xfs_alloc_ag_vextent(xfs_alloc_arg) ! ! ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) ! ! ! ! ! ! xfs_alloc_ag_vextent_size(xfs_alloc_arg) ! ! ! ! ! ! ! xfs_alloc_ag_vextent(xfs_alloc_arg) ! ! ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) ! ! ! ! ! xfs_free_ag_extent(xfs_trans ...) ! ! ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) ! ! ! ! ! xfs_bmap_add_extent_delay_real(xfs_bmalloca) ! ! ! ! ! ! xfs_bmapi_allocate(xfs_bmalloca_t, ...) ! ! ! ! ! ! ! ! ... ! ! ! ! ! xfs_bmap_add_extent_hole_real(xfs_bmalloca) ! ! ! ! ! ! xfs_bmapi_allocate(xfs_bmalloca_t, ...) ! ! ! ! ! ! ! ! ... ! ! ! ! ! xfs_bmap_add_extent_unwritten_real(xfs_trans, ...) ! ! ! ! ! ! xfs_bunmapi(xfs_trans_t ...) XFS_BMAPI_METADATA ! ! ! ! ! ! ! ... ! ! ! ! ! ! xfs_bmapi_convert_unwritten(xfs_bmalloca, ...) ! ! ! ! ! ! ! xfs_bmapi_write(xfs_trans_t ...) loop over the above ! ! ! ! ! ! ! ! ... ! ! ! ! ! xfs_bmap_del_extent(xfs_trans, ...) ! ! ! ! ! ! xfs_bunmapi(xfs_trans_t ...) XFS_BMAPI_METADATA ! ! ! ! ! ! ! ... ! ! ! ! ! xfs_ialloc_ag_alloc(xfs_trans, ...) loops over the above ! ! ! ! ! ! xfs_dialloc(xfs_trans ...) loops over the above ! ! ! ! ! ! ! xfs_ialloc(xfs_trans ...) ! ! ! ! ! ! ! ! xfs_dir_ialloc(xfs_trans ...) ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel ! xfs_btree_new_iroot(xfs_btree_cur, ...) ! ! xfs_btree_make_block_unfull(xfs_btree_cur, ...) ! ! ! xfs_btree_insrec(xfs_btree_cur, ...) ! ! ! ! xfs_btree_insert(xfs_btree_cur, ...) ! ! ! ! ! xfs_alloc_fixup_trees(xfs_btree_cur, ...) ! ! ! ! ! ! xfs_alloc_ag_vextent_exact(xfs_alloc_arg) ! ! ! ! ! ! ! xfs_alloc_ag_vextent(xfs_alloc_arg) ! ! ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) ! ! ! ! ! ! xfs_alloc_ag_vextent_near(xfs_alloc_arg) ! ! ! ! ! ! ! xfs_alloc_ag_vextent(xfs_alloc_arg) ! ! ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) ! ! ! ! ! ! xfs_alloc_ag_vextent_size(xfs_alloc_arg) ! ! ! ! ! ! ! xfs_alloc_ag_vextent(xfs_alloc_arg) ! ! ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) ! ! xfs_bmap_add_attrfork_btree(xfs_trans_t ...) ! ! ! xfs_bmap_add_attrfork(...) allocates trans does a xfs_trans_commit/cancel ! xfs_btree_new_root(xfs_btree_cur, ...) ! ! xfs_btree_insrec(xfs_btree_cur, ...) ! ! ! xfs_btree_insert(xfs_btree_cur, ...) ! ! ! xfs_alloc_fixup_trees(xfs_btree_cur, ...) ! ! ! ! xfs_alloc_ag_vextent_exact(xfs_alloc_arg) ! ! ! ! ! xfs_alloc_ag_vextent(xfs_alloc_arg) ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) ! ! ! ! xfs_alloc_ag_vextent_near(xfs_alloc_arg) ! ! ! ! ! xfs_alloc_ag_vextent(xfs_alloc_arg) ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) ! ! ! ! xfs_alloc_ag_vextent_size(xfs_alloc_arg) ! ! ! ! ! xfs_alloc_ag_vextent(xfs_alloc_arg) ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) --Mark. From tinguely@sgi.com Mon Sep 24 16:20:04 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8OLK43i211976 for ; Mon, 24 Sep 2012 16:20:04 -0500 Received: from [128.162.232.125] (eagdhcp-232-125.americas.sgi.com [128.162.232.125]) by relay2.corp.sgi.com (Postfix) with ESMTP id 3653C304032; Mon, 24 Sep 2012 14:21:18 -0700 (PDT) Message-ID: <5060CECB.3070100@sgi.com> Date: Mon, 24 Sep 2012 16:21:15 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: jeff.liu@oracle.com CC: xfs@oss.sgi.com Subject: Re: [PATCH] xfstests: fix a compile warning at seek_sanity_test.c References: <4FCA2422.90804@oracle.com> In-Reply-To: <4FCA2422.90804@oracle.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 06/02/12 09:33, Jeff Liu wrote: > Hello, > > Compiler report warning at seek_sanity_test.c: > seek_sanity_test.c:46:3: warning: format '%lx' expects type 'long unsigned int', but argument 3 has type 'int' > > Below patch can fix it. > > Signed-off-by: Jie Liu > > --- Committed to git://oss.sgi.com/xfs/cmds/xfstests.git, master branch. --Mark. From tinguely@sgi.com Mon Sep 24 16:22:57 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8OLMvHX212349 for ; Mon, 24 Sep 2012 16:22:57 -0500 Received: from [128.162.232.125] (eagdhcp-232-125.americas.sgi.com [128.162.232.125]) by relay2.corp.sgi.com (Postfix) with ESMTP id ACA0C304032; Mon, 24 Sep 2012 14:24:14 -0700 (PDT) Message-ID: <5060CF7C.5010500@sgi.com> Date: Mon, 24 Sep 2012 16:24:12 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: jeff.liu@oracle.com CC: xfs@oss.sgi.com Subject: Re: [PATCH v2] xfstests: improve test 286 for repeated unwritten/hole extents. References: <4FF31296.8050406@oracle.com> In-Reply-To: <4FF31296.8050406@oracle.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Enlarge the test coverage of 286 to includes file mapping with repeated hole/unwritten/unwritten_without_data/data intersections. Those two new sub-tests could help verifying the current seek_data/seek_hole improvements. Signed-off-by: Jie Liu Reviewed-by: Mark Tinguely Reviewed-by: Christoph Hellwig Committed to git://oss.sgi.com/xfs/cmds/xfstests.git, master branch. --Mark. From tinguely@sgi.com Mon Sep 24 16:50:02 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8OLo2Uq216516 for ; Mon, 24 Sep 2012 16:50:02 -0500 Received: from [128.162.232.125] (eagdhcp-232-125.americas.sgi.com [128.162.232.125]) by relay2.corp.sgi.com (Postfix) with ESMTP id 020DD304032; Mon, 24 Sep 2012 14:51:19 -0700 (PDT) Message-ID: <5060D5D5.80602@sgi.com> Date: Mon, 24 Sep 2012 16:51:17 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 0/3] xfs_io: new functions References: <1343255450-28559-1-git-send-email-david@fromorbit.com> In-Reply-To: <1343255450-28559-1-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 07/25/12 17:30, Dave Chinner wrote: > This is just a couple of additional functions for xfs_io I have had > sitting around for a while. The first is an interface to > sync_file_range() for better control of file writeback. The second > and third introduce vectored pread/pwrite so that I could simulate > the same style of vectored IO that KVM does via direct IO (hint - > tracing indicated that the generic direct IO code doesn't handle > this particularly efficiently). > > _____________________________________________ This series has been committed to git://oss.sgi.com/xfs/cmds/xfsprogs.git -Mark. From tinguely@sgi.com Mon Sep 24 16:54:01 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8OLs1Qu217487 for ; Mon, 24 Sep 2012 16:54:01 -0500 Received: from [128.162.232.125] (eagdhcp-232-125.americas.sgi.com [128.162.232.125]) by relay2.corp.sgi.com (Postfix) with ESMTP id 06723304059; Mon, 24 Sep 2012 14:55:18 -0700 (PDT) Message-ID: <5060D6C4.3000406@sgi.com> Date: Mon, 24 Sep 2012 16:55:16 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Mike Frysinger CC: xfs@oss.sgi.com Subject: Re: [PATCH] libxcmd: link against readline References: <1345936050-15139-1-git-send-email-vapier@gentoo.org> In-Reply-To: <1345936050-15139-1-git-send-email-vapier@gentoo.org> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 08/25/12 18:07, Mike Frysinger wrote: > This library uses readline funcs (the input.c file), so we need to link > this shared library against it. > > URL: https://bugs.gentoo.org/432644 > Reported-by: David Badia > Signed-off-by: Mike Frysinger > Reviewed-by: Mark Tinguely Committed to git://oss.sgi.com/xfs/cmds/xfsprogs.git master branch. --Mark. From vapier@gentoo.org Mon Sep 24 18:38:20 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_74, J_CHICKENPOX_75 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8ONcJb1229927 for ; Mon, 24 Sep 2012 18:38:20 -0500 X-ASG-Debug-ID: 1348529975-04cbb012270d5c0001-NocioJ Received: from smtp.gentoo.org (smtp.gentoo.org [140.211.166.183]) by cuda.sgi.com with ESMTP id aDlq18pdZU2WFAGb (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 24 Sep 2012 16:39:36 -0700 (PDT) X-Barracuda-Envelope-From: vapier@gentoo.org X-Barracuda-Apparent-Source-IP: 140.211.166.183 Received: from localhost.localdomain (localhost [127.0.0.1]) by smtp.gentoo.org (Postfix) with ESMTP id 48BB733D3E0 for ; Mon, 24 Sep 2012 23:39:35 +0000 (UTC) From: Mike Frysinger To: xfs@oss.sgi.com Subject: [PATCH 2/3] respect DESTDIR when installing Date: Mon, 24 Sep 2012 19:39:37 -0400 X-ASG-Orig-Subj: [PATCH 2/3] respect DESTDIR when installing Message-Id: <1348529978-30048-2-git-send-email-vapier@gentoo.org> X-Mailer: git-send-email 1.7.12 In-Reply-To: <1348529978-30048-1-git-send-email-vapier@gentoo.org> References: <1348529978-30048-1-git-send-email-vapier@gentoo.org> X-Barracuda-Connect: smtp.gentoo.org[140.211.166.183] X-Barracuda-Start-Time: 1348529976 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109493 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- This makes the `make install DESTDIR=...` form work. It keeps support for all previous forms too (like DIST_ROOT). Signed-off-by: Mike Frysinger --- include/install-sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/install-sh b/include/install-sh index 18c051f..c952a71 100755 --- a/include/install-sh +++ b/include/install-sh @@ -85,6 +85,8 @@ REAL_UID=$OWNER INSTALL=true MANIFEST=: +: ${DIST_ROOT:=${DESTDIR}} + [ -n "$DIST_MANIFEST" -a -z "$DIST_ROOT" ] && INSTALL=false [ -n "$DIST_MANIFEST" ] && MANIFEST="_manifest" -- 1.7.12 From vapier@gentoo.org Mon Sep 24 18:38:20 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8ONcKSH229928 for ; Mon, 24 Sep 2012 18:38:20 -0500 X-ASG-Debug-ID: 1348529976-04cb6c49710d390001-NocioJ Received: from smtp.gentoo.org (smtp.gentoo.org [140.211.166.183]) by cuda.sgi.com with ESMTP id SKmO859letRNoieH (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 24 Sep 2012 16:39:36 -0700 (PDT) X-Barracuda-Envelope-From: vapier@gentoo.org X-Barracuda-Apparent-Source-IP: 140.211.166.183 Received: from localhost.localdomain (localhost [127.0.0.1]) by smtp.gentoo.org (Postfix) with ESMTP id CB1A733D704 for ; Mon, 24 Sep 2012 23:39:35 +0000 (UTC) From: Mike Frysinger To: xfs@oss.sgi.com Subject: [PATCH 3/3] install shared libs with +x bits Date: Mon, 24 Sep 2012 19:39:38 -0400 X-ASG-Orig-Subj: [PATCH 3/3] install shared libs with +x bits Message-Id: <1348529978-30048-3-git-send-email-vapier@gentoo.org> X-Mailer: git-send-email 1.7.12 In-Reply-To: <1348529978-30048-1-git-send-email-vapier@gentoo.org> References: <1348529978-30048-1-git-send-email-vapier@gentoo.org> X-Barracuda-Connect: smtp.gentoo.org[140.211.166.183] X-Barracuda-Start-Time: 1348529976 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109493 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- These are shared libs w/executable code, so make sure they have +x bits set on them. Some kernels will proactively disallow executable mmaps if the files lack +x bits. It's also the right thing to do. Signed-off-by: Mike Frysinger --- include/buildmacros | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/buildmacros b/include/buildmacros index 31c7eb0..7a01880 100644 --- a/include/buildmacros +++ b/include/buildmacros @@ -58,7 +58,7 @@ ifeq ($(ENABLE_SHARED),yes) INSTALL_LTLIB = \ cd $(TOPDIR)/$(LIBNAME)/.libs; \ ../$(INSTALL) -m 755 -d $(PKG_ROOT_LIB_DIR); \ - ../$(INSTALL) -m 644 -T so_dot_version $(LIBNAME).lai $(PKG_ROOT_LIB_DIR); \ + ../$(INSTALL) -m 755 -T so_dot_version $(LIBNAME).lai $(PKG_ROOT_LIB_DIR); \ ../$(INSTALL) -T so_dot_current $(LIBNAME).lai $(PKG_ROOT_LIB_DIR) endif -- 1.7.12 From vapier@gentoo.org Mon Sep 24 18:38:22 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.9 required=5.0 tests=BAYES_00,J_CHICKENPOX_92, TO_NO_BRKTS_PCNT,URIBL_BLACK autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8ONcMk3229951 for ; Mon, 24 Sep 2012 18:38:22 -0500 X-ASG-Debug-ID: 1348529975-04cbb012240d5b0001-NocioJ Received: from smtp.gentoo.org (smtp.gentoo.org [140.211.166.183]) by cuda.sgi.com with ESMTP id KUqm8BuhjROJbslS (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Mon, 24 Sep 2012 16:39:35 -0700 (PDT) X-Barracuda-Envelope-From: vapier@gentoo.org X-Barracuda-Apparent-Source-IP: 140.211.166.183 Received: from localhost.localdomain (localhost [127.0.0.1]) by smtp.gentoo.org (Postfix) with ESMTP id B0C5C33D6EB for ; Mon, 24 Sep 2012 23:39:34 +0000 (UTC) From: Mike Frysinger To: xfs@oss.sgi.com Subject: [PATCH 1/3] rename configure.in to configure.ac Date: Mon, 24 Sep 2012 19:39:36 -0400 X-ASG-Orig-Subj: [PATCH 1/3] rename configure.in to configure.ac Message-Id: <1348529978-30048-1-git-send-email-vapier@gentoo.org> X-Mailer: git-send-email 1.7.12 X-Barracuda-Connect: smtp.gentoo.org[140.211.166.183] X-Barracuda-Start-Time: 1348529975 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109493 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Newer autotools warn and start to error with the older name. Signed-off-by: Mike Frysinger --- configure.in => configure.ac | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename configure.in => configure.ac (100%) diff --git a/configure.in b/configure.ac similarity index 100% rename from configure.in rename to configure.ac -- 1.7.12 From david@fromorbit.com Mon Sep 24 19:12:53 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_35 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8P0Crro233935 for ; Mon, 24 Sep 2012 19:12:53 -0500 X-ASG-Debug-ID: 1348532048-04cbb012250ede0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id ntHdDCFTvLBjyIGr for ; Mon, 24 Sep 2012 17:14:08 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ArENAED2YFB5LGEv/2dsb2JhbABFhSK4NgIBgQuBCYIgAQEEATocIwULCAMOCi4UJQMhExQHh2QFqEqQVBSLBxQBBgVjgUODHGADlWSJOIZsgnmBSAE Received: from ppp121-44-97-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.97.47]) by ipmail06.adl6.internode.on.net with ESMTP; 25 Sep 2012 09:44:07 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TGImr-0006yu-8Y; Tue, 25 Sep 2012 10:14:05 +1000 Date: Tue, 25 Sep 2012 10:14:05 +1000 From: Dave Chinner To: Ben Myers Cc: Mark Tinguely , xfs@oss.sgi.com Subject: Re: [PATCH 1/3] xfs: restrict allocate worker to x86_64 Message-ID: <20120925001405.GA23520@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/3] xfs: restrict allocate worker to x86_64 References: <20120919163133.097340199@sgi.com> <20120919163145.367256258@sgi.com> <20120919215405.GE31501@dastard> <505B546A.6070105@sgi.com> <20120924173723.GH1140@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20120924173723.GH1140@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1348532048 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109496 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Sep 24, 2012 at 12:37:23PM -0500, Ben Myers wrote: > Hey, > > On Thu, Sep 20, 2012 at 12:37:46PM -0500, Mark Tinguely wrote: > > On 09/19/12 16:54, Dave Chinner wrote: > > >On Wed, Sep 19, 2012 at 11:31:34AM -0500, tinguely@sgi.com wrote: > > >>Restrict the allocation worker to X86_64 machines. This will improve > > >>performance on non-X86-64 machines and avoid the AGF buffer hang. > > >> > > >>Signed-off-by: Mark Tinguely > > > > > >NACK. > > > > > >The stack overflow problems that this works around are not limited > > >to x86-64. In the past we've seen overflows on i686 (even with 8k > > >stacks), s390 and other platforms, so it's not an isolated issue. > > > > > >It either works or it doesn't - let's not start down the rathole of > > >having different code paths and behaviours for different platforms. > > > > > >Cheers, > > > > > >Dave. > > > > Well, I was expecting a 4 letter word from Dave on this patch and > > "NACK" was surprisingly mild. > > > > When the allocation worker was placed into XFS, even Christoph > > wanted a kernel configure switch to be able turn it off. > > > > Dave has already placed a switch in the code that turns it off for > > over half of the direct callers xfs_alloc_vextent() because a > > performance issue. > > > > We are just finding places where it causes serious issues. > > > > This is worker is an "necessary evil" (I think those were > > Christoph's review comment). We should limit the evil to where it is > > necessary. > > I tend to agree that it is undesireble to have platform specific behaviors in > XFS. Dave has a good point. Mark and Christoph also have valid points. > > This is a platform specific problem so it's reasonable that the solution can be > platform specific too. It's not really platform specific. it's just harder to hit on some platforms than others. The stack usage of XFS on 32 bt platforms is only about 25% less than on 64 bit platforms through the problematic allocation path as most of the on stack structures are the same size on 32 bit and 64 bit - only the size of pointers and registers change, and they are the miniority of stack usage. Stuff like xfs_bmalloc_args, xfs_alloc_args and so on only shrink by a few bytes. I've seen the x86-64 stack overrung by 3.5k - that's almost a 50% overrun. That means even if the stack usage is reduces by 25% on Seeing as we are smashing the 8k x86-64 stack by over 25%, that same path will smash an 8k stack. We just haven't had anyone report it because ia32 users are in the minority. Hence for all the 32 bit platforms with 8k stacks (i.e. all ARM, MIPS, SH, etc) there is a still a significant risk of stack overruns. Given the prevalence of XFS on these architectures for NAS and DVR functionality, there's every chance that stack overflows occur quite regularly that nobody ever reports or can report.... And even on other 64 bit platforms we know that s390 stack usage is an issue because each function call on the stack has a base register frame of 128 bytes, plus whatever stack is used by the function. Hence when we are looking at a function call chain of 70-80 functions deep, they really only have half of their available stack space available for the code usage. i.e. about 8k. Sparc has the same issue. Power and ia64 are probably the only arches that don'thave problems because of their default 64k page size. IOWs, there are quite a few architectures where XFS is commonly used that are at risk of stack overflows through the worst case XFS writeback/allocation path (i.e. when you have a non-trivial allocation like a double bmbt/abt split, bmbt split with readahead in the abt, etc). Just because we don't have reports of them occurring doesn't mean the problem doesn't exist. We simply get reports from x86-64 users because they make up the vast majority of XFS deployments and so rare problems are seen (correspondingly) more frequently.... > If the list of platforms which are broken by having so > little stack available in the kernel is larger than we'd like... well that's > unfortunate. But it's not something we're the cause of, and it speaks to how > important it is to fix the more general problem. I've been trying to raise awareness of the problem - the wider storage community understand that there is a problem, but we're getting no traction at all with core kernel folk. As far as they are conerned, it's our problem, not a general problem. > We shouldn't penalize those who are using platforms which are not affected by > this problem for the limitations of the other platforms. OTOH, if we have > multiple behaviors our testing becomes more difficult. Nobody wins. You're forgetting that the performance problems were platform specific! It only showed up on certain CPUs (i.e. AMD, not intel) and only on low CPU count (1-4p) machines. So by your argument that we should only enable this for platforms that don't see performance issues, we should only do this stack switch for intel x86-64. See where categorising issues by hardware platform leads? it's a rat-hole. > I think it is desireable to be able to turn this off so that users > can choose how they prefer to lose, and so that this hack > continues to be easily removable if the time ever comes when we > can do so. This is not an option that should be left to users - it is our responsibility to provide a fit-for-purpose filesystem that doesn't randomly crash, and one of those responsibilities is to take changes that you don't like but are necessary for stability across the wider user base. I'm not going to change my opinion - if you do make this allocation workqueue code platform specific, the first thing I'll be doing on any kernel I'm responsible for is reverting the commit so I know users are not going to have random outages caused by allocation related stack overflows. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Mon Sep 24 19:55:19 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8P0tJ9v239345 for ; Mon, 24 Sep 2012 19:55:19 -0500 X-ASG-Debug-ID: 1348534594-04cbb0122410320001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id C8cyYKbc5ACUbGBc for ; Mon, 24 Sep 2012 17:56:34 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ArINAEYAYVB5LGEv/2dsb2JhbABFhSK4NgIBgQqBCYIgAQEEATocIwULCAMRAwECAS4UJQMTDhMUh2sFqFKQWBSLB4EDgUODHGADlWSQJIJ5gUgE Received: from ppp121-44-97-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.97.47]) by ipmail06.adl6.internode.on.net with ESMTP; 25 Sep 2012 10:26:33 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TGJRw-00072m-Qv; Tue, 25 Sep 2012 10:56:32 +1000 Date: Tue, 25 Sep 2012 10:56:32 +1000 From: Dave Chinner To: Mark Tinguely Cc: bpm@sgi.com, tinguely@sgi.com, xfs@oss.sgi.com Subject: Re: [PATCH 0/3] xfs: allocation worker causes freelist buffer lock hang Message-ID: <20120925005632.GB23520@dastard> X-ASG-Orig-Subj: Re: [PATCH 0/3] xfs: allocation worker causes freelist buffer lock hang References: <20120924171159.GG1140@sgi.com> <201209241809.q8OI94s3003323@eagdhcp-232-125.americas.sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <201209241809.q8OI94s3003323@eagdhcp-232-125.americas.sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1348534594 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109500 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Sep 24, 2012 at 01:09:04PM -0500, Mark Tinguely wrote: > > From bpm@sgi.com Mon Sep 24 12:11:59 2012 > > Date: Mon, 24 Sep 2012 12:11:59 -0500 > > From: Ben Myers > > To: > > Subject: Re: [PATCH 0/3] xfs: allocation worker causes freelist buffer lock > > hang > > Cc: > > > > Hi Mark, > > > > On Wed, Sep 19, 2012 at 11:31:33AM -0500, tinguely@sgi.com wrote: > > ... > > > I traced the callers of xfs_alloc_vextent(), noting transaction creation, > > > commits and cancels; I noted loops in the callers and which were marked > > > as metadata/userdata. I can send this document to reviewers. > > > > I'd like to see the doc of xfs_alloc_vextent callers and which of them loop. > > Can you post your doc to the list? > > > > Regards, > > Ben > > > Here are the Linux 3.6.x callers of xfs_alloc_vextent() stopping at the > transaction commit/cancel level. > > XFS_BMAPI_METADATA *not* being set implies user data. > > Userdata being set is the community designated indication that an allocate > worker is needed to prevent the overflow of the kernel stack. > > Calling xfs_alloc_vextent() several times with the same transaction can cause > a dead lock if a new allocation worker can not be allocated. I noted where the > loops occur. xfs_alloc_vextent() can call itself, those calls must be in the > same allocation worker. > > As a bonus, consolidating the loops into one worker actually gives a slight > performance advantage. Can you quantify it? > Sorry this is wider than 80 characters wide. > --- > xfs_bmap_btalloc(xfs_bmalloca_t) > ! xfs_bmap_alloc(xfs_bmalloca_t) > ! ! xfs_bmapi_allocate(xfs_bmalloca_t, ...) > ! ! ! xfs_bmapi_write(xfs_trans_t ...) loops over above > ! ! ! ! xfs_attr_rmtval_set(xfs_da_args_t) loops over bmapi_write (xfs_attr_set_int) **XFS_BMAPI_METADATA** > ! ! ! ! xfs_da_grow_inode_int(xfs_da_args_t) loops over bmapi_write **XFS_BMAPI_METADATA** > ! ! ! ! xfs_qm_dqalloc(xfs_trans_t ...) does a xfs_bmap_finish/cancel **XFS_BMAPI_METADATA** > ! ! ! ! xfs_iomap_write_direct(...) alloc trans, xfs_trans_commit/cancel > ! ! ! ! xfs_iomap_write_allocate(...) alloc trans, xfs_trans_commit/cancel safe loop > ! ! ! ! xfs_iomap_write_unwritten(..) alloc trans, xfs_trans_commit/cancel safe loop > ! ! ! ! xfs_growfs_rt_alloc(..) alloc trans, xfs_trans_commit/cancel safe loop > ! ! ! ! xfs_symlink(...) allocates trans does a xfs_trans_commit/cancel > ! ! ! ! xfs_alloc_file_space(...) alloc trans, xfs_trans_commit/cancel safe loop So the only data path callers though here are xfs_iomap_write_direct(), xfs_iomap_write_allocate() and xfs_iomap_write_unwritten() and xfs_alloc_file_space(). Everything else is metadata, so won't use > xfs_bmap_extents_to_btree(xfs_trans_t ...) <- set userdata to 0 (patch 3) > ! xfs_bmap_add_attrfork_extents(xfs_trans_t ...) > ! ! xfs_bmap_add_attrfork(...) allocates trans does a xfs_trans_commit/cancel > ! xfs_bmap_add_extent_delay_real(fs_bmalloca) > ! ! xfs_bmapi_allocate(xfs_bmalloca_t, ...) > ! ! ! > ! xfs_bmap_add_extent_unwritten_real(xfs_trans_t ...) > ! ! xfs_bmapi_convert_unwritten(xfs_bmalloca ...) > ! ! ! xfs_bmapi_write(xfs_trans ...) calls xfs_bmapi_convert_unwritten in loop XFS_BMAPI_METADATA > ! ! ! ! ... ..... > ! xfs_bmap_add_extent_hole_real(xfs_bmalloca ...) > ! ! xfs_bmapi_allocate(xfs_bmalloca_t, ...) > ! ! ! ... So it's bmbt modification that looks to be the problem here, right? > xfs_bmap_local_to_extents(xfs_trans_t ...) <- set userdata to 0 (patch 3) > ! xfs_bmap_add_attrfork_local(xfs_trans_t ..) > ! ! xfs_bmap_add_attrfork(...) trans alloc, bmap_finish trans_commit/cancel > ! xfs_bmapi_write(xfs_trans_t ...) XFS_BMAPI_METADATA > ! ! ... Same here. That's all I can see as problematic - maybe I read the output wrong and there's others? i.e. all other xfs_alloc_vextent() callers are either in metadata context (so don't use the workqueue) or commit the transaction directly after xfs_bmapi_write returns so will unlock the AGF buffer before calling into xfs_bmapi_write a second time. If these are the only loops, then patch 3 is all that is necessary to avoid the problem of blocking on workqueue resource while we are already on the workqueue, right? i.e. bmbt allocation is a metadata allocation, even though the context is a data allocation, and ensuring it is metadata means that the current transaction won't get blocked waiting for workqueue resources... What am I missing? Cheers, Dave. -- Dave Chinner david@fromorbit.com From BATV+be449632378855f78443+3320+infradead.org+hch@bombadil.srs.infradead.org Tue Sep 25 04:25:40 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8P9PeR8036641 for ; Tue, 25 Sep 2012 04:25:40 -0500 X-ASG-Debug-ID: 1348565216-04cbb0122625530001-NocioJ Received: from bombadil.infradead.org (173-166-109-252-newengland.hfc.comcastbusiness.net [173.166.109.252]) by cuda.sgi.com with ESMTP id 42ItkeFR1PqicePu (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO); Tue, 25 Sep 2012 02:26:56 -0700 (PDT) X-Barracuda-Envelope-From: BATV+be449632378855f78443+3320+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 173.166.109.252 Received: from hch by bombadil.infradead.org with local (Exim 4.76 #1 (Red Hat Linux)) id 1TGRPr-0002MY-3M; Tue, 25 Sep 2012 09:26:55 +0000 Date: Tue, 25 Sep 2012 05:26:55 -0400 From: Christoph Hellwig To: Dave Chinner Cc: Mark Tinguely , xfs@oss.sgi.com Subject: Re: [PATCH V2 00/13] xfs: remove the xfssyncd mess Message-ID: <20120925092654.GA9046@infradead.org> X-ASG-Orig-Subj: Re: [PATCH V2 00/13] xfs: remove the xfssyncd mess References: <1346328017-2795-1-git-send-email-david@fromorbit.com> <5040C3A0.2050107@sgi.com> <20120903040523.GP15292@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20120903040523.GP15292@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: 173-166-109-252-newengland.hfc.comcastbusiness.net[173.166.109.252] X-Barracuda-Start-Time: 1348565216 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109532 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS Any chance to get a repost of this so that we can get it into 3.7? From BATV+be449632378855f78443+3320+infradead.org+hch@bombadil.srs.infradead.org Tue Sep 25 04:28:20 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8P9SKEN036866 for ; Tue, 25 Sep 2012 04:28:20 -0500 X-ASG-Debug-ID: 1348565376-04cb6c497322670001-NocioJ Received: from bombadil.infradead.org (173-166-109-252-newengland.hfc.comcastbusiness.net [173.166.109.252]) by cuda.sgi.com with ESMTP id ySFRckOa8EofifPe (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO); Tue, 25 Sep 2012 02:29:36 -0700 (PDT) X-Barracuda-Envelope-From: BATV+be449632378855f78443+3320+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 173.166.109.252 Received: from hch by bombadil.infradead.org with local (Exim 4.76 #1 (Red Hat Linux)) id 1TGRSS-0002QO-0Z; Tue, 25 Sep 2012 09:29:36 +0000 Date: Tue, 25 Sep 2012 05:29:35 -0400 From: Christoph Hellwig To: Eric Sandeen Cc: Ben Myers , Christoph Hellwig , xfs@oss.sgi.com Subject: Re: userspace trees Message-ID: <20120925092935.GA9189@infradead.org> X-ASG-Orig-Subj: Re: userspace trees References: <20120913075026.GA27256@infradead.org> <5052142B.3010601@sandeen.net> <20120913175316.GR3274@sgi.com> <50521DCE.7020203@sandeen.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50521DCE.7020203@sandeen.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: 173-166-109-252-newengland.hfc.comcastbusiness.net[173.166.109.252] X-Barracuda-Start-Time: 1348565376 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109532 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS On Thu, Sep 13, 2012 at 12:54:22PM -0500, Eric Sandeen wrote: > hch, you want to remove or somehow deprecate the kernel.org trees? I'll replace them with a Checkin that just has a file mentioning that the trees have moved. From BATV+be449632378855f78443+3320+infradead.org+hch@bombadil.srs.infradead.org Tue Sep 25 04:32:29 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8P9WS31037359 for ; Tue, 25 Sep 2012 04:32:28 -0500 X-ASG-Debug-ID: 1348565625-04cbb0122525b20001-NocioJ Received: from bombadil.infradead.org (173-166-109-252-newengland.hfc.comcastbusiness.net [173.166.109.252]) by cuda.sgi.com with ESMTP id UyhC6smPXp7dxhBo (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 25 Sep 2012 02:33:46 -0700 (PDT) X-Barracuda-Envelope-From: BATV+be449632378855f78443+3320+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 173.166.109.252 Received: from hch by bombadil.infradead.org with local (Exim 4.76 #1 (Red Hat Linux)) id 1TGRWS-0003VQ-NJ; Tue, 25 Sep 2012 09:33:44 +0000 Date: Tue, 25 Sep 2012 05:33:44 -0400 From: Christoph Hellwig To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH] xfstests: add _require_freeze and minor cleanups Message-ID: <20120925093344.GB9189@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfstests: add _require_freeze and minor cleanups References: <505A4D04.2080105@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <505A4D04.2080105@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: 173-166-109-252-newengland.hfc.comcastbusiness.net[173.166.109.252] X-Barracuda-Start-Time: 1348565625 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109532 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS Looks good, Reviewed-by: Christoph Hellwig From BATV+be449632378855f78443+3320+infradead.org+hch@bombadil.srs.infradead.org Tue Sep 25 04:33:06 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8P9X62q037428 for ; Tue, 25 Sep 2012 04:33:06 -0500 X-ASG-Debug-ID: 1348565662-04bdf04fbf21610001-NocioJ Received: from bombadil.infradead.org (173-166-109-252-newengland.hfc.comcastbusiness.net [173.166.109.252]) by cuda.sgi.com with ESMTP id hajdFx7KWKkKv5pw (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 25 Sep 2012 02:34:22 -0700 (PDT) X-Barracuda-Envelope-From: BATV+be449632378855f78443+3320+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 173.166.109.252 Received: from hch by bombadil.infradead.org with local (Exim 4.76 #1 (Red Hat Linux)) id 1TGRX3-0003WT-Rr; Tue, 25 Sep 2012 09:34:21 +0000 Date: Tue, 25 Sep 2012 05:34:21 -0400 From: Christoph Hellwig To: Carlos Maiolino Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/6] xfs: Fix m_agirotor reset during AG selection Message-ID: <20120925093421.GC9189@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 1/6] xfs: Fix m_agirotor reset during AG selection References: <1348147961-7520-1-git-send-email-cmaiolino@redhat.com> <1348147961-7520-2-git-send-email-cmaiolino@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1348147961-7520-2-git-send-email-cmaiolino@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: 173-166-109-252-newengland.hfc.comcastbusiness.net[173.166.109.252] X-Barracuda-Start-Time: 1348565662 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109532 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS Looks good, Reviewed-by: Christoph Hellwig From david@fromorbit.com Tue Sep 25 04:33:59 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8P9XxDO037587 for ; Tue, 25 Sep 2012 04:33:59 -0500 X-ASG-Debug-ID: 1348565715-04cbb0122425c90001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id YsdOqRTlNYY3YtgQ for ; Tue, 25 Sep 2012 02:35:15 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AgQPAM55YVB5LGEv/2dsb2JhbABFhSK4NwECAYEKgQmCIAEBBTocIxAIAw4KLhQlAyETiASoJJEBFIsHTzQTgTCDHGADlWSQJYJ5 Received: from ppp121-44-97-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.97.47]) by ipmail04.adl6.internode.on.net with ESMTP; 25 Sep 2012 19:05:14 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TGRXu-0007yv-5O; Tue, 25 Sep 2012 19:35:14 +1000 Date: Tue, 25 Sep 2012 19:35:14 +1000 From: Dave Chinner To: Christoph Hellwig Cc: Mark Tinguely , xfs@oss.sgi.com Subject: Re: [PATCH V2 00/13] xfs: remove the xfssyncd mess Message-ID: <20120925093514.GD29154@dastard> X-ASG-Orig-Subj: Re: [PATCH V2 00/13] xfs: remove the xfssyncd mess References: <1346328017-2795-1-git-send-email-david@fromorbit.com> <5040C3A0.2050107@sgi.com> <20120903040523.GP15292@dastard> <20120925092654.GA9046@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20120925092654.GA9046@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1348565715 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109532 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Sep 25, 2012 at 05:26:55AM -0400, Christoph Hellwig wrote: > Any chance to get a repost of this so that we can get it into 3.7? That's tomorrow's job. Cheers, Dave. -- Dave Chinner david@fromorbit.com From BATV+be449632378855f78443+3320+infradead.org+hch@bombadil.srs.infradead.org Tue Sep 25 04:34:40 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8P9YeGl037708 for ; Tue, 25 Sep 2012 04:34:40 -0500 X-ASG-Debug-ID: 1348565756-04cb6c497322a90001-NocioJ Received: from bombadil.infradead.org (173-166-109-252-newengland.hfc.comcastbusiness.net [173.166.109.252]) by cuda.sgi.com with ESMTP id JzjEsfOtzpcJCzoP (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 25 Sep 2012 02:35:57 -0700 (PDT) X-Barracuda-Envelope-From: BATV+be449632378855f78443+3320+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 173.166.109.252 Received: from hch by bombadil.infradead.org with local (Exim 4.76 #1 (Red Hat Linux)) id 1TGRYa-0004Xg-Li; Tue, 25 Sep 2012 09:35:56 +0000 Date: Tue, 25 Sep 2012 05:35:56 -0400 From: Christoph Hellwig To: Carlos Maiolino Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/6] xfs: make inode64 as the default allocation mode Message-ID: <20120925093556.GD9189@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 2/6] xfs: make inode64 as the default allocation mode References: <1348147961-7520-1-git-send-email-cmaiolino@redhat.com> <1348147961-7520-3-git-send-email-cmaiolino@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=unknown-8bit Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <1348147961-7520-3-git-send-email-cmaiolino@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: 173-166-109-252-newengland.hfc.comcastbusiness.net[173.166.109.252] X-Barracuda-Start-Time: 1348565757 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109532 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS On Thu, Sep 20, 2012 at 10:32:37AM -0300, Carlos Maiolino wrote: > since 64-bit inodes can be accessed while using inode32, and these can also be > used on 32-bit kernels, there is no reason to still keep inode32 as the default > mount option. > If the filesystem cannot handle 64bit inode numbers (i.e CONFIG_LBDAF is not > enabled and BITS_PER_LONG == 32), XFS_MOUNT_SMALL_INUMS will still be set by > default, so inode64 is not an unconditional default value. Btw, I think we should kill the !BIG_INUMS mode and just require CONFIG_LBDAF on 32-bit, as the small in-core inums are å codepath that rarely if ever is tested and not really useful these days. But that should be a separate patch, so: Reviewed-by: Christoph Hellwig From BATV+be449632378855f78443+3320+infradead.org+hch@bombadil.srs.infradead.org Tue Sep 25 04:35:12 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8P9ZC0b037752 for ; Tue, 25 Sep 2012 04:35:12 -0500 X-ASG-Debug-ID: 1348565788-04bdf04fbd217a0001-NocioJ Received: from bombadil.infradead.org (173-166-109-252-newengland.hfc.comcastbusiness.net [173.166.109.252]) by cuda.sgi.com with ESMTP id BRx0xy3rK4NeJ0mq (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 25 Sep 2012 02:36:28 -0700 (PDT) X-Barracuda-Envelope-From: BATV+be449632378855f78443+3320+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 173.166.109.252 Received: from hch by bombadil.infradead.org with local (Exim 4.76 #1 (Red Hat Linux)) id 1TGRZ6-0004YU-2N; Tue, 25 Sep 2012 09:36:28 +0000 Date: Tue, 25 Sep 2012 05:36:28 -0400 From: Christoph Hellwig To: Carlos Maiolino Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/6] xfs: reduce code duplication handling inode32/64 options Message-ID: <20120925093627.GE9189@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 3/6] xfs: reduce code duplication handling inode32/64 options References: <1348147961-7520-1-git-send-email-cmaiolino@redhat.com> <1348147961-7520-4-git-send-email-cmaiolino@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1348147961-7520-4-git-send-email-cmaiolino@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: 173-166-109-252-newengland.hfc.comcastbusiness.net[173.166.109.252] X-Barracuda-Start-Time: 1348565788 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109532 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS On Thu, Sep 20, 2012 at 10:32:38AM -0300, Carlos Maiolino wrote: > Add xfs_set_inode32() to be used to enable inode32 allocation mode. this will > reduce the amount of duplicated code needed to mount/remount a filesystem with > inode32 option. > This patch also changes xfs_set_inode64() to return the maximum AG number that > inodes can be allocated instead of set mp->m_maxagi by itself, so that the > behaviour is the same as xfs_set_inode32(). > This simplifies code that calls these functions and needs to know the maximum > AG that inodes can be allocated in. Looks good, Reviewed-by: Christoph Hellwig From BATV+be449632378855f78443+3320+infradead.org+hch@bombadil.srs.infradead.org Tue Sep 25 04:35:58 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8P9Zw0b037905 for ; Tue, 25 Sep 2012 04:35:58 -0500 X-ASG-Debug-ID: 1348565835-04cbb0122525e20001-NocioJ Received: from bombadil.infradead.org (173-166-109-252-newengland.hfc.comcastbusiness.net [173.166.109.252]) by cuda.sgi.com with ESMTP id CnW7odz7ZszzhHYh (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 25 Sep 2012 02:37:15 -0700 (PDT) X-Barracuda-Envelope-From: BATV+be449632378855f78443+3320+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 173.166.109.252 Received: from hch by bombadil.infradead.org with local (Exim 4.76 #1 (Red Hat Linux)) id 1TGRZr-0004aB-2g; Tue, 25 Sep 2012 09:37:15 +0000 Date: Tue, 25 Sep 2012 05:37:15 -0400 From: Christoph Hellwig To: Carlos Maiolino Cc: xfs@oss.sgi.com Subject: Re: [PATCH 4/6] xfs: Fix mp->m_maxagi update during inode64 remount Message-ID: <20120925093715.GF9189@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 4/6] xfs: Fix mp->m_maxagi update during inode64 remount References: <1348147961-7520-1-git-send-email-cmaiolino@redhat.com> <1348147961-7520-5-git-send-email-cmaiolino@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1348147961-7520-5-git-send-email-cmaiolino@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: 173-166-109-252-newengland.hfc.comcastbusiness.net[173.166.109.252] X-Barracuda-Start-Time: 1348565835 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109532 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS On Thu, Sep 20, 2012 at 10:32:39AM -0300, Carlos Maiolino wrote: > With the changes made on xfs_set_inode64(), to make it behave as > xfs_set_inode32() (now leaving to the caller the responsibility to update > mp->m_maxagi), we use the return value of xfs_set_inode64() to update > mp->m_maxagi during remount. > > Signed-off-by: Carlos Maiolino Shouldn;t this be part of the previous patch? Otherwise looks good. From BATV+be449632378855f78443+3320+infradead.org+hch@bombadil.srs.infradead.org Tue Sep 25 04:36:18 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8P9aIr9037962 for ; Tue, 25 Sep 2012 04:36:18 -0500 X-ASG-Debug-ID: 1348565854-04cb6c497222ba0001-NocioJ Received: from bombadil.infradead.org (173-166-109-252-newengland.hfc.comcastbusiness.net [173.166.109.252]) by cuda.sgi.com with ESMTP id xoEQaUUeBJhnCKVM (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 25 Sep 2012 02:37:35 -0700 (PDT) X-Barracuda-Envelope-From: BATV+be449632378855f78443+3320+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 173.166.109.252 Received: from hch by bombadil.infradead.org with local (Exim 4.76 #1 (Red Hat Linux)) id 1TGRaA-0004b0-KU; Tue, 25 Sep 2012 09:37:34 +0000 Date: Tue, 25 Sep 2012 05:37:34 -0400 From: Christoph Hellwig To: Carlos Maiolino Cc: xfs@oss.sgi.com Subject: Re: [PATCH 5/6] xfs: add inode64->inode32 transition into xfs_set_inode32() Message-ID: <20120925093734.GG9189@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 5/6] xfs: add inode64->inode32 transition into xfs_set_inode32() References: <1348147961-7520-1-git-send-email-cmaiolino@redhat.com> <1348147961-7520-6-git-send-email-cmaiolino@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1348147961-7520-6-git-send-email-cmaiolino@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: 173-166-109-252-newengland.hfc.comcastbusiness.net[173.166.109.252] X-Barracuda-Start-Time: 1348565855 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109532 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS Looks good, Reviewed-by: Christoph Hellwig From BATV+be449632378855f78443+3320+infradead.org+hch@bombadil.srs.infradead.org Tue Sep 25 04:36:33 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8P9aXcN038099 for ; Tue, 25 Sep 2012 04:36:33 -0500 X-ASG-Debug-ID: 1348565870-04cbb0122725e90001-NocioJ Received: from bombadil.infradead.org (173-166-109-252-newengland.hfc.comcastbusiness.net [173.166.109.252]) by cuda.sgi.com with ESMTP id O8dLpGyKEBVWiuw2 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 25 Sep 2012 02:37:50 -0700 (PDT) X-Barracuda-Envelope-From: BATV+be449632378855f78443+3320+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 173.166.109.252 Received: from hch by bombadil.infradead.org with local (Exim 4.76 #1 (Red Hat Linux)) id 1TGRaP-0004bb-QH; Tue, 25 Sep 2012 09:37:50 +0000 Date: Tue, 25 Sep 2012 05:37:49 -0400 From: Christoph Hellwig To: Carlos Maiolino Cc: xfs@oss.sgi.com Subject: Re: [PATCH 6/6] xfs: Make inode32 a remountable option Message-ID: <20120925093749.GH9189@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 6/6] xfs: Make inode32 a remountable option References: <1348147961-7520-1-git-send-email-cmaiolino@redhat.com> <1348147961-7520-7-git-send-email-cmaiolino@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1348147961-7520-7-git-send-email-cmaiolino@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: 173-166-109-252-newengland.hfc.comcastbusiness.net[173.166.109.252] X-Barracuda-Start-Time: 1348565870 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109532 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS Looks good, Reviewed-by: Christoph Hellwig From BATV+be449632378855f78443+3320+infradead.org+hch@bombadil.srs.infradead.org Tue Sep 25 04:38:58 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8P9cw80038397 for ; Tue, 25 Sep 2012 04:38:58 -0500 X-ASG-Debug-ID: 1348566015-04cb6c497022d20001-NocioJ Received: from bombadil.infradead.org (173-166-109-252-newengland.hfc.comcastbusiness.net [173.166.109.252]) by cuda.sgi.com with ESMTP id JWtdwTiPxTYwe2z6 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 25 Sep 2012 02:40:15 -0700 (PDT) X-Barracuda-Envelope-From: BATV+be449632378855f78443+3320+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 173.166.109.252 Received: from hch by bombadil.infradead.org with local (Exim 4.76 #1 (Red Hat Linux)) id 1TGRcj-0005dX-Kp; Tue, 25 Sep 2012 09:40:13 +0000 Date: Tue, 25 Sep 2012 05:40:13 -0400 From: Christoph Hellwig To: raghu.prabhu13@gmail.com Cc: david@fromorbit.com, Raghavendra D Prabhu , xfs@oss.sgi.com Subject: Re: [PATCH v6] Stop periodic syncing if filesystem is already shutdown. Message-ID: <20120925094013.GI9189@infradead.org> X-ASG-Orig-Subj: Re: [PATCH v6] Stop periodic syncing if filesystem is already shutdown. References: <143becf0f8266fbc8025ec97c8f44476d8fcafc5.1348203015.git.rprabhu@wnohang.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <143becf0f8266fbc8025ec97c8f44476d8fcafc5.1348203015.git.rprabhu@wnohang.net> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: 173-166-109-252-newengland.hfc.comcastbusiness.net[173.166.109.252] X-Barracuda-Start-Time: 1348566015 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MISMATCH_TO, BSF_SC5_MJ1963, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109532 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC0_MISMATCH_TO Envelope rcpt doesn't match header 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 Looks good, but one thing I'd love here is to actually print a useful error for the typical EIO case, as the "error 5 occured" message just confuses the heck out of people. What it means is that we got an EIO error from the block device, and that's what we should print. Probably worth doing in a separate patch, so: Reviewed-by: Christoph Hellwig From BATV+be449632378855f78443+3320+infradead.org+hch@bombadil.srs.infradead.org Tue Sep 25 04:40:01 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.1 required=5.0 tests=BAYES_00,J_CHICKENPOX_92, URIBL_BLACK autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8P9e0Ec038566 for ; Tue, 25 Sep 2012 04:40:00 -0500 X-ASG-Debug-ID: 1348566074-04cbb01224260c0001-NocioJ Received: from bombadil.infradead.org (173-166-109-252-newengland.hfc.comcastbusiness.net [173.166.109.252]) by cuda.sgi.com with ESMTP id Ecz8bG0RxVbrNR7H (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 25 Sep 2012 02:41:14 -0700 (PDT) X-Barracuda-Envelope-From: BATV+be449632378855f78443+3320+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 173.166.109.252 Received: from hch by bombadil.infradead.org with local (Exim 4.76 #1 (Red Hat Linux)) id 1TGRdi-0005g6-05; Tue, 25 Sep 2012 09:41:14 +0000 Date: Tue, 25 Sep 2012 05:41:13 -0400 From: Christoph Hellwig To: Mike Frysinger Cc: xfs@oss.sgi.com Subject: Re: [PATCH 1/3] rename configure.in to configure.ac Message-ID: <20120925094113.GJ9189@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 1/3] rename configure.in to configure.ac References: <1348529978-30048-1-git-send-email-vapier@gentoo.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1348529978-30048-1-git-send-email-vapier@gentoo.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: 173-166-109-252-newengland.hfc.comcastbusiness.net[173.166.109.252] X-Barracuda-Start-Time: 1348566074 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109532 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS On Mon, Sep 24, 2012 at 07:39:36PM -0400, Mike Frysinger wrote: > Newer autotools warn and start to error with the older name. > > Signed-off-by: Mike Frysinger > --- > configure.in => configure.ac | 0 > 1 file changed, 0 insertions(+), 0 deletions(-) > rename configure.in => configure.ac (100%) > > diff --git a/configure.in b/configure.ac > similarity index 100% > rename from configure.in > rename to configure.ac Is there a patch version that can track this now? Otherwise looks good and should go into all of the userspace repos. From BATV+be449632378855f78443+3320+infradead.org+hch@bombadil.srs.infradead.org Tue Sep 25 04:40:23 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8P9eNnK038598 for ; Tue, 25 Sep 2012 04:40:23 -0500 X-ASG-Debug-ID: 1348566099-04cbb0122626110001-NocioJ Received: from bombadil.infradead.org (173-166-109-252-newengland.hfc.comcastbusiness.net [173.166.109.252]) by cuda.sgi.com with ESMTP id U9AWI5I0vVxDKOjA (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 25 Sep 2012 02:41:40 -0700 (PDT) X-Barracuda-Envelope-From: BATV+be449632378855f78443+3320+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 173.166.109.252 Received: from hch by bombadil.infradead.org with local (Exim 4.76 #1 (Red Hat Linux)) id 1TGRe7-0005gw-NN; Tue, 25 Sep 2012 09:41:39 +0000 Date: Tue, 25 Sep 2012 05:41:39 -0400 From: Christoph Hellwig To: Mike Frysinger Cc: xfs@oss.sgi.com Subject: Re: [PATCH 2/3] respect DESTDIR when installing Message-ID: <20120925094139.GK9189@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 2/3] respect DESTDIR when installing References: <1348529978-30048-1-git-send-email-vapier@gentoo.org> <1348529978-30048-2-git-send-email-vapier@gentoo.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1348529978-30048-2-git-send-email-vapier@gentoo.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: 173-166-109-252-newengland.hfc.comcastbusiness.net[173.166.109.252] X-Barracuda-Start-Time: 1348566100 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109532 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS Looks good. I guess this is for xfstests as it should be working for the real tools? From BATV+be449632378855f78443+3320+infradead.org+hch@bombadil.srs.infradead.org Tue Sep 25 04:40:41 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8P9efkN038733 for ; Tue, 25 Sep 2012 04:40:41 -0500 X-ASG-Debug-ID: 1348566118-04cbb0122626130001-NocioJ Received: from bombadil.infradead.org (173-166-109-252-newengland.hfc.comcastbusiness.net [173.166.109.252]) by cuda.sgi.com with ESMTP id x7Cq4M1QDaIrDWWy (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 25 Sep 2012 02:41:59 -0700 (PDT) X-Barracuda-Envelope-From: BATV+be449632378855f78443+3320+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 173.166.109.252 Received: from hch by bombadil.infradead.org with local (Exim 4.76 #1 (Red Hat Linux)) id 1TGReQ-0005iL-Fk; Tue, 25 Sep 2012 09:41:58 +0000 Date: Tue, 25 Sep 2012 05:41:58 -0400 From: Christoph Hellwig To: Mike Frysinger Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/3] install shared libs with +x bits Message-ID: <20120925094158.GL9189@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 3/3] install shared libs with +x bits References: <1348529978-30048-1-git-send-email-vapier@gentoo.org> <1348529978-30048-3-git-send-email-vapier@gentoo.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1348529978-30048-3-git-send-email-vapier@gentoo.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: 173-166-109-252-newengland.hfc.comcastbusiness.net[173.166.109.252] X-Barracuda-Start-Time: 1348566119 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109532 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS On Mon, Sep 24, 2012 at 07:39:38PM -0400, Mike Frysinger wrote: > These are shared libs w/executable code, so make sure they have +x bits > set on them. Some kernels will proactively disallow executable mmaps if > the files lack +x bits. It's also the right thing to do. Looks good, Reviewed-by: Christoph Hellwig From BATV+be449632378855f78443+3320+infradead.org+hch@bombadil.srs.infradead.org Tue Sep 25 04:48:46 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8P9mkuR039831 for ; Tue, 25 Sep 2012 04:48:46 -0500 X-ASG-Debug-ID: 1348566603-04cb6c4972232a0001-NocioJ Received: from bombadil.infradead.org (173-166-109-252-newengland.hfc.comcastbusiness.net [173.166.109.252]) by cuda.sgi.com with ESMTP id ocAvYdeB73szesfO (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 25 Sep 2012 02:50:03 -0700 (PDT) X-Barracuda-Envelope-From: BATV+be449632378855f78443+3320+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 173.166.109.252 Received: from hch by bombadil.infradead.org with local (Exim 4.76 #1 (Red Hat Linux)) id 1TGRmF-0007CT-0s for xfs@oss.sgi.com; Tue, 25 Sep 2012 09:50:03 +0000 Date: Tue, 25 Sep 2012 05:50:02 -0400 From: Christoph Hellwig To: xfs@oss.sgi.com Subject: userspace releases? Message-ID: <20120925095002.GA26583@infradead.org> X-ASG-Orig-Subj: userspace releases? MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: 173-166-109-252-newengland.hfc.comcastbusiness.net[173.166.109.252] X-Barracuda-Start-Time: 1348566603 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 2.60 X-Barracuda-Spam-Status: No, SCORE=2.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA606_DYN_OB, BSF_SC5_MJ1963, RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109534 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS 0.50 BSF_SC5_MJ1963 Custom Rule MJ1963 2.00 BSF_SC0_SA606_DYN_OB Custom Outbreak Rule SA606_DYN_OB It's been 6 month since the last releases, and we've acquired a fair amount of fixes in xfsprogs. I think it's time to put out another release soon. From cmaiolino@redhat.com Tue Sep 25 08:32:16 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_71 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8PDWGSp060375 for ; Tue, 25 Sep 2012 08:32:16 -0500 X-ASG-Debug-ID: 1348580013-04bdf04fbd2c860001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id PJNBml3iq3PoEmYw for ; Tue, 25 Sep 2012 06:33:33 -0700 (PDT) X-Barracuda-Envelope-From: cmaiolino@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8PDXWuk017299 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 25 Sep 2012 09:33:33 -0400 Received: from andromeda.usersys.redhat.com ([10.3.113.16]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q8PDXTxQ029176 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO) for ; Tue, 25 Sep 2012 09:33:32 -0400 Date: Tue, 25 Sep 2012 10:33:29 -0300 From: Carlos Maiolino To: xfs@oss.sgi.com Subject: Re: [PATCH 4/6] xfs: Fix mp->m_maxagi update during inode64 remount Message-ID: <20120925133329.GA10780@andromeda.usersys.redhat.com> X-ASG-Orig-Subj: Re: [PATCH 4/6] xfs: Fix mp->m_maxagi update during inode64 remount Mail-Followup-To: xfs@oss.sgi.com References: <1348147961-7520-1-git-send-email-cmaiolino@redhat.com> <1348147961-7520-5-git-send-email-cmaiolino@redhat.com> <20120925093715.GF9189@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20120925093715.GF9189@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1348580013 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com On Tue, Sep 25, 2012 at 05:37:15AM -0400, Christoph Hellwig wrote: > On Thu, Sep 20, 2012 at 10:32:39AM -0300, Carlos Maiolino wrote: > > With the changes made on xfs_set_inode64(), to make it behave as > > xfs_set_inode32() (now leaving to the caller the responsibility to update > > mp->m_maxagi), we use the return value of xfs_set_inode64() to update > > mp->m_maxagi during remount. > > > > Signed-off-by: Carlos Maiolino > > Shouldn;t this be part of the previous patch? > > Otherwise looks good. > dchinner suggested to keep small changes into different patches, once the xfs_set_inode64() was added previously, adding a separate patche to add xfs_set_inode32() and another one to change the behaviour of both functions looks reasonable to me > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs -- --Carlos From tinguely@sgi.com Tue Sep 25 09:31:24 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8PEVOr1064347 for ; Tue, 25 Sep 2012 09:31:24 -0500 Received: from eagdhcp-232-125.americas.sgi.com (eagdhcp-232-125.americas.sgi.com [128.162.232.125]) by relay2.corp.sgi.com (Postfix) with ESMTP id 17CCD304032 for ; Tue, 25 Sep 2012 07:32:39 -0700 (PDT) Received: from eagdhcp-232-125.americas.sgi.com (localhost [127.0.0.1]) by eagdhcp-232-125.americas.sgi.com (8.14.5/8.14.5) with ESMTP id q8PEWZp6004643 for ; Tue, 25 Sep 2012 09:32:35 -0500 (CDT) (envelope-from tinguely@sgi.com) Received: (from tinguely@localhost) by eagdhcp-232-125.americas.sgi.com (8.14.5/8.14.5/Submit) id q8PEWZZ1004642 for xfs@oss.sgi.com; Tue, 25 Sep 2012 09:32:35 -0500 (CDT) (envelope-from tinguely@sgi.com) X-Authentication-Warning: eagdhcp-232-125.americas.sgi.com: tinguely set sender to tinguely@sgi.com using -f Message-Id: <20120925142421.398175185@sgi.com> User-Agent: quilt/0.51-1 Date: Tue, 25 Sep 2012 09:24:15 -0500 From: Mark Tinguely To: xfs@oss.sgi.com Subject: [PATCH] xfsprog: remove duplicate vector memalign from xfs_io References: <20120925142414.660506845@sgi.com> Content-Disposition: inline; filename=xfsprogs-io_remove_duplicate_vector_memalign.patch The vector feature of xfs_io uses its own memory buffer in the iov structure and does not use the buffer entry. Remove the duplicate memalign. Signed-off-by: Mark Tinguely --- io/pread.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) Index: b/io/pread.c =================================================================== --- a/io/pread.c +++ b/io/pread.c @@ -76,8 +76,7 @@ alloc_iovec( buffersize = 0; for (i = 0; i < vectors; i++) { iov[i].iov_base = memalign(pagesize, bsize); - buffer = memalign(pagesize, bsize); - if (!buffer) { + if (!iov[i].iov_base) { perror("memalign"); goto unwind; } From tinguely@sgi.com Tue Sep 25 10:13:04 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8PFD4t7067433 for ; Tue, 25 Sep 2012 10:13:04 -0500 Received: from [128.162.232.125] (eagdhcp-232-125.americas.sgi.com [128.162.232.125]) by relay2.corp.sgi.com (Postfix) with ESMTP id A9933304062; Tue, 25 Sep 2012 08:14:19 -0700 (PDT) Message-ID: <5061CA48.3040202@sgi.com> Date: Tue, 25 Sep 2012 10:14:16 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: bpm@sgi.com, xfs@oss.sgi.com Subject: Re: [PATCH 0/3] xfs: allocation worker causes freelist buffer lock hang References: <20120924171159.GG1140@sgi.com> <201209241809.q8OI94s3003323@eagdhcp-232-125.americas.sgi.com> <20120925005632.GB23520@dastard> In-Reply-To: <20120925005632.GB23520@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/24/12 19:56, Dave Chinner wrote: > On Mon, Sep 24, 2012 at 01:09:04PM -0500, Mark Tinguely wrote: >>> From bpm@sgi.com Mon Sep 24 12:11:59 2012 >>> Date: Mon, 24 Sep 2012 12:11:59 -0500 >>> From: Ben Myers >>> To: >>> Subject: Re: [PATCH 0/3] xfs: allocation worker causes freelist buffer lock >>> hang >>> Cc: >>> >>> Hi Mark, >>> >>> On Wed, Sep 19, 2012 at 11:31:33AM -0500, tinguely@sgi.com wrote: >>> ... >>>> I traced the callers of xfs_alloc_vextent(), noting transaction creation, >>>> commits and cancels; I noted loops in the callers and which were marked >>>> as metadata/userdata. I can send this document to reviewers. >>> >>> I'd like to see the doc of xfs_alloc_vextent callers and which of them loop. >>> Can you post your doc to the list? >>> >>> Regards, >>> Ben >> >> >> Here are the Linux 3.6.x callers of xfs_alloc_vextent() stopping at the >> transaction commit/cancel level. >> >> XFS_BMAPI_METADATA *not* being set implies user data. >> >> Userdata being set is the community designated indication that an allocate >> worker is needed to prevent the overflow of the kernel stack. >> >> Calling xfs_alloc_vextent() several times with the same transaction can cause >> a dead lock if a new allocation worker can not be allocated. I noted where the >> loops occur. xfs_alloc_vextent() can call itself, those calls must be in the >> same allocation worker. >> >> As a bonus, consolidating the loops into one worker actually gives a slight >> performance advantage. > > Can you quantify it? I was comparing the bonnie and iozone benchmarks outputs. I will see if someone can enlighten me on how to quantify those numbers. > >> Sorry this is wider than 80 characters wide. >> --- >> xfs_bmap_btalloc(xfs_bmalloca_t) >> ! xfs_bmap_alloc(xfs_bmalloca_t) >> ! ! xfs_bmapi_allocate(xfs_bmalloca_t, ...) >> ! ! ! xfs_bmapi_write(xfs_trans_t ...) loops over above >> ! ! ! ! xfs_attr_rmtval_set(xfs_da_args_t) loops over bmapi_write (xfs_attr_set_int) **XFS_BMAPI_METADATA** >> ! ! ! ! xfs_da_grow_inode_int(xfs_da_args_t) loops over bmapi_write **XFS_BMAPI_METADATA** >> ! ! ! ! xfs_qm_dqalloc(xfs_trans_t ...) does a xfs_bmap_finish/cancel **XFS_BMAPI_METADATA** >> ! ! ! ! xfs_iomap_write_direct(...) alloc trans, xfs_trans_commit/cancel >> ! ! ! ! xfs_iomap_write_allocate(...) alloc trans, xfs_trans_commit/cancel safe loop >> ! ! ! ! xfs_iomap_write_unwritten(..) alloc trans, xfs_trans_commit/cancel safe loop >> ! ! ! ! xfs_growfs_rt_alloc(..) alloc trans, xfs_trans_commit/cancel safe loop >> ! ! ! ! xfs_symlink(...) allocates trans does a xfs_trans_commit/cancel >> ! ! ! ! xfs_alloc_file_space(...) alloc trans, xfs_trans_commit/cancel safe loop > > So the only data path callers though here are > xfs_iomap_write_direct(), xfs_iomap_write_allocate() and > xfs_iomap_write_unwritten() and xfs_alloc_file_space(). Everything > else is metadata, so won't use Correct. Only these use the worker. All the other paths directly call the __xfs_alloc_vextent() routine. I saved the xfs_bmalloca and fs_alloc_arg when allocating a buffer. I am quite confident that this is the only path that causes the problem. >> xfs_bmap_extents_to_btree(xfs_trans_t ...)<- set userdata to 0 (patch 3) >> ! xfs_bmap_add_attrfork_extents(xfs_trans_t ...) >> ! ! xfs_bmap_add_attrfork(...) allocates trans does a xfs_trans_commit/cancel >> ! xfs_bmap_add_extent_delay_real(fs_bmalloca) >> ! ! xfs_bmapi_allocate(xfs_bmalloca_t, ...) >> ! ! ! >> ! xfs_bmap_add_extent_unwritten_real(xfs_trans_t ...) >> ! ! xfs_bmapi_convert_unwritten(xfs_bmalloca ...) >> ! ! ! xfs_bmapi_write(xfs_trans ...) calls xfs_bmapi_convert_unwritten in loop XFS_BMAPI_METADATA >> ! ! ! ! ... > ..... >> ! xfs_bmap_add_extent_hole_real(xfs_bmalloca ...) >> ! ! xfs_bmapi_allocate(xfs_bmalloca_t, ...) >> ! ! ! ... > > So it's bmbt modification that looks to be the problem here, right? > >> xfs_bmap_local_to_extents(xfs_trans_t ...)<- set userdata to 0 (patch 3) >> ! xfs_bmap_add_attrfork_local(xfs_trans_t ..) >> ! ! xfs_bmap_add_attrfork(...) trans alloc, bmap_finish trans_commit/cancel >> ! xfs_bmapi_write(xfs_trans_t ...) XFS_BMAPI_METADATA >> ! ! ... > > Same here. > > That's all I can see as problematic - maybe I read the output wrong > and there's others? > > i.e. all other xfs_alloc_vextent() callers are either in metadata > context (so don't use the workqueue) or commit the transaction > directly after xfs_bmapi_write returns so will unlock the AGF buffer > before calling into xfs_bmapi_write a second time. > > If these are the only loops, then patch 3 is all that is > necessary to avoid the problem of blocking on workqueue resource > while we are already on the workqueue, right? i.e. bmbt allocation > is a metadata allocation, even though the context is a data > allocation, and ensuring it is metadata means that the current > transaction won't get blocked waiting for workqueue resources... > > What am I missing? Patch 3 is a clean up. userdata is used by the allocation routines and its value should be correct for those routines. I discovered the uninitialized values tracing the calling list. The fact that the worker routine was using and randomly creating a worker based on the stack value is not a factor in the problem because those paths do not loop on xfs_alloc_vextent(). Patch 2 moves the worker so that when the worker servicing data allocation request gets the lock, it will hold the worker over the loop in xfs_bmapi_write() until it can do a xfs_trans_commit/cancel. If it does not have the lock, then that worker will wait until it can get the lock. Your patch hangs when limiting the available workers on test 109 on the 3 machines (2 x86_64 and a x86_32) that I tried it on. I am trying a fourth machine to be sure. Thanks, --Mark. From bpm@sgi.com Tue Sep 25 10:27:10 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8PFRAW7069649 for ; Tue, 25 Sep 2012 10:27:10 -0500 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay2.corp.sgi.com (Postfix) with ESMTP id E47EB304062; Tue, 25 Sep 2012 08:28:27 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id CEBE84266DC; Tue, 25 Sep 2012 10:28:27 -0500 (CDT) Date: Tue, 25 Sep 2012 10:28:27 -0500 From: Ben Myers To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH] xfstests: add _require_freeze and minor cleanups Message-ID: <20120925152827.GI1140@sgi.com> References: <505A4D04.2080105@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <505A4D04.2080105@redhat.com> User-Agent: Mutt/1.5.20 (2009-06-14) On Wed, Sep 19, 2012 at 05:53:56PM -0500, Eric Sandeen wrote: > More filesystems have grown freeze capability, so rather than > hardcoding several in _supported_fs, make tests 068 and 280 > generic and then add a new _require_freeze() which checks whether > the fs under test can be frozen before beginning the test. > > Minor other cleanups to 280: > - remove extra _supported_fs line > - clear $seq.full before beginning > > Signed-off-by: Eric Sandeen committed to git://oss.sgi.com/xfs/cmds/xfstests.git, master branch. Christoph, sorry I missed your reviewed-by. -Ben From treestem@gmail.com Tue Sep 25 10:39:17 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_DKIM_INVALID,T_TO_NO_BRKTS_FREEMAIL autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8PFdHT1072451 for ; Tue, 25 Sep 2012 10:39:17 -0500 X-ASG-Debug-ID: 1348587634-04cb6c4973331f0001-NocioJ Received: from mail-ob0-f181.google.com (mail-ob0-f181.google.com [209.85.214.181]) by cuda.sgi.com with ESMTP id Tu3yMridPTHAgK2F (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 25 Sep 2012 08:40:34 -0700 (PDT) X-Barracuda-Envelope-From: treestem@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.214.181 X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.181] Received: by obbun3 with SMTP id un3so2406131obb.26 for ; Tue, 25 Sep 2012 08:40:34 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.181] X-Barracuda-IPDD: Level1 [gmail.com/209.85.214.181] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:date:message-id:subject:from:to:content-type; bh=vV6FwKZ1qSmjeYS/+Gr76JWe+ByGiq+Hv8/g26grda8=; b=PUFBNmpCFEhANAdBk1sWQ9QqtKIPMU4zzbJPK7WUV+rudojeSGY1HbPMknVbCwvL4Y PRgrDyA9KzNRYtS+0MIXOo0kmOrx460hMuFwsbW1A4zHRHQIkn65GZ7QSKfMQK3V86DR 8lvAZNPkacrJIYCcYfO5x4GIFNf26aYaHqTJgcfBisTXG+0zuzMlrbmKxumSXyNdn+R5 Zy6uVtooHPVmnMQcNVcNGDVmdgD9puvp8FSvHGrP5dhIZVIGcvJmxxbt6Pwx+YyKdnPH K2f0Za8tCKrB9WSUqjUog35YJu30qJn1JvfvQqvapOPm6P/4IXEq6V8tG5824J/q1DN+ VWnA== MIME-Version: 1.0 Received: by 10.182.179.100 with SMTP id df4mr12894740obc.59.1348587633941; Tue, 25 Sep 2012 08:40:33 -0700 (PDT) Received: by 10.76.143.163 with HTTP; Tue, 25 Sep 2012 08:40:33 -0700 (PDT) Date: Tue, 25 Sep 2012 11:40:33 -0400 Message-ID: Subject: xfs_repair: enabling lazy sb counters From: Peter Watkins X-ASG-Orig-Subj: xfs_repair: enabling lazy sb counters To: xfs@oss.sgi.com Content-Type: text/plain; charset=ISO-8859-1 X-Barracuda-Connect: mail-ob0-f181.google.com[209.85.214.181] X-Barracuda-Start-Time: 1348587634 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109555 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hello, Has anyone noticed that phase1 updates the lazy count flag in the superblock, and then writes out the sb before the traversal in phase5 counts btree blocks consumed and sets agf_btreeblks? Seems like if xfs_repair is interrupted or crashes at the wrong time, you'd have enabled lazy count but not set agf_btreeblks, which would trigger the corruption check in xfs_alloc.c:xfs_read_agf(). If you just re-run xfs_repair to enable lazy counts, it would stop early saying they're already enabled. You'd have to disable them, and then enable again to get a consistent state. Second, is it possible to enable lazy counts without doing the full repair traversal, i.e. a cheap and easy way to set agf_btreeblks if the fs is already consistent? On some systems, the whole repair enchilada can take a long time! Lazy counts are a great feature, and I'd like to enable them on some older systems. -Peter From vapier@gentoo.org Tue Sep 25 11:37:27 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.1 required=5.0 tests=BAYES_00,J_CHICKENPOX_92, URIBL_BLACK autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8PGbRSB079475 for ; Tue, 25 Sep 2012 11:37:27 -0500 X-ASG-Debug-ID: 1348591120-04cb6c4972353b0001-NocioJ Received: from smtp.gentoo.org (smtp.gentoo.org [140.211.166.183]) by cuda.sgi.com with ESMTP id zpT2LvLGwx8RFgrV (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 25 Sep 2012 09:38:41 -0700 (PDT) X-Barracuda-Envelope-From: vapier@gentoo.org X-Barracuda-Apparent-Source-IP: 140.211.166.183 Received: from vapier.localnet (localhost [127.0.0.1]) by smtp.gentoo.org (Postfix) with ESMTP id 6358C33CAAD; Tue, 25 Sep 2012 16:38:40 +0000 (UTC) From: Mike Frysinger Organization: wh0rd.org To: Christoph Hellwig Subject: Re: [PATCH 1/3] rename configure.in to configure.ac Date: Tue, 25 Sep 2012 12:38:39 -0400 X-ASG-Orig-Subj: Re: [PATCH 1/3] rename configure.in to configure.ac User-Agent: KMail/1.13.7 (Linux/3.5.2; KDE/4.6.5; x86_64; ; ) Cc: xfs@oss.sgi.com References: <1348529978-30048-1-git-send-email-vapier@gentoo.org> <20120925094113.GJ9189@infradead.org> In-Reply-To: <20120925094113.GJ9189@infradead.org> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="nextPart3574428.dq1uN1LbaO"; protocol="application/pgp-signature"; micalg=pgp-sha1 Content-Transfer-Encoding: 7bit Message-Id: <201209251238.40010.vapier@gentoo.org> X-Barracuda-Connect: smtp.gentoo.org[140.211.166.183] X-Barracuda-Start-Time: 1348591121 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109559 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- --nextPart3574428.dq1uN1LbaO Content-Type: Text/Plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable On Tuesday 25 September 2012 05:41:13 Christoph Hellwig wrote: > On Mon, Sep 24, 2012 at 07:39:36PM -0400, Mike Frysinger wrote: > > Newer autotools warn and start to error with the older name. > >=20 > > Signed-off-by: Mike Frysinger > > --- > >=20 > > configure.in =3D> configure.ac | 0 > > 1 file changed, 0 insertions(+), 0 deletions(-) > > rename configure.in =3D> configure.ac (100%) > >=20 > > diff --git a/configure.in b/configure.ac > > similarity index 100% > > rename from configure.in > > rename to configure.ac >=20 > Is there a patch version that can track this now? `git am` should do the right thing. patch-2.7 should also process this=20 correctly (although you might want to get the latest 2.7 snapshot since it= =20 fixes a few bugs in the 2.7 release). =2Dmike --nextPart3574428.dq1uN1LbaO Content-Type: application/pgp-signature; name=signature.asc Content-Description: This is a digitally signed message part. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.17 (GNU/Linux) iQIcBAABAgAGBQJQYd4PAAoJEEFjO5/oN/WBAi0QAMTxxEOGp8MHuLn7p/xgsoMq S+k9LGJvmVEJ7PaA6QzTuQpAwM/62ttszZmHy22o7lLUAEC3yH4gg4GVycE5MdBB kaoiYZVXzOfcgq8fMNy52DK1kthOor/gkxUQnc+V/gr/wQqE2uv1GYqZMNEQLx7y bmHIyrMf9SlkP2a6oBRdXGpbQUTIy9rn08SXogrryCTEQLjGjB/qfrIBmVQa/xD1 O7/9R5CP+6nt9CbZvor1yJgh+syXA1m2o1z1uOCkmQDFzWbKRCUDbCbHaoDFrCAc sgw2608LAmxB/zG0mgIwV7unyYUTuLEIaC/inw1RIhRF1pfjJM9T37MNInsVPbx0 yJS7p+3fJZtF0VdzbyJn/UgZUZM4Lfqq+Hx7K+uqg1D0gEtblPXrv7kvhvGvZuW+ xss4sxCpqvv2cy3yWx1Djkr20fGUK7cUKLhrAGyMctVoYU3/KuMaC299Uqg+zRRN Cw1dRDcC2+0unki1uXm1eLMLLyldF1z+/Rssc1QEAWQrrOFBnXkRwxd+E4CSvEik okZQoTfU5WaTYiECHnvIVd15IVR2nwSPH8ZItk8L2zDBRVzaTTzKfhjG9o/wju2b O5+y8mvHZxdL41FcReJPzdKRnsfewqU5+3vSg1b+lyeX/gaxNw72TkjaZ+sHEjCe LcBHvurQK2+qUcDKNxgn =i7pe -----END PGP SIGNATURE----- --nextPart3574428.dq1uN1LbaO-- From bpm@sgi.com Tue Sep 25 14:42:41 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8PJgeGF096520 for ; Tue, 25 Sep 2012 14:42:41 -0500 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay3.corp.sgi.com (Postfix) with ESMTP id 8DF7CAC006; Tue, 25 Sep 2012 12:43:55 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 4488F4266DC; Tue, 25 Sep 2012 14:43:55 -0500 (CDT) Date: Tue, 25 Sep 2012 14:43:55 -0500 From: Ben Myers To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: userspace releases? Message-ID: <20120925194355.GK1140@sgi.com> References: <20120925095002.GA26583@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20120925095002.GA26583@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) Hey Christoph, On Tue, Sep 25, 2012 at 05:50:02AM -0400, Christoph Hellwig wrote: > It's been 6 month since the last releases, and we've acquired a fair > amount of fixes in xfsprogs. I think it's time to put out another > release soon. Seems like a good idea to me. How would you prefer to define 'soon'? Regards, Ben From bpm@sgi.com Tue Sep 25 15:19:40 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.5 required=5.0 tests=BAYES_00,J_CHICKENPOX_42, J_CHICKENPOX_45,J_CHICKENPOX_52,J_CHICKENPOX_54 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8PKJeLF103358 for ; Tue, 25 Sep 2012 15:19:40 -0500 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1C4CC8F8035; Tue, 25 Sep 2012 13:20:55 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 027654266DC; Tue, 25 Sep 2012 15:20:54 -0500 (CDT) Date: Tue, 25 Sep 2012 15:20:54 -0500 From: Ben Myers To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: [PATCH 3/3 v2] xfs: zero allocation_args on the kernel stack Message-ID: <20120925202054.GA13214@sgi.com> References: <20120919163133.097340199@sgi.com> <20120919163145.587098223@sgi.com> <20120920181650.041917183@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20120920181650.041917183@sgi.com> User-Agent: Mutt/1.5.20 (2009-06-14) On Thu, Sep 20, 2012 at 01:16:45PM -0500, Mark Tinguely wrote: > Zero the kernel stack space that makes up the xfs_alloc_arg structures. > > Signed-off-by: Mark Tinguely I'll just double check that you got all usages of xfs_alloc_arg_t: xfs_inobt_alloc_block... fixed in f5eb8e7c by HCH xfs_ialloc_ag_alloc... fixed below xfs_bmbt_alloc_block... also fixed in f5eb8e7c xfs_bmap_local_to_extents... fixed below xfs_bmap_extents_to_btree... fixed below xfs_bmap_btalloc... fixed below xfs_free_extent... fixed in 0e1edbd9 by Nathan Scott xfs_alloc_fix_freelist... fixed below Looks good! Reviewed-by: Ben Myers > > --- > fs/xfs/xfs_alloc.c | 1 + > fs/xfs/xfs_bmap.c | 3 +++ > fs/xfs/xfs_ialloc.c | 1 + > 3 files changed, 5 insertions(+) > > Index: b/fs/xfs/xfs_alloc.c > =================================================================== > --- a/fs/xfs/xfs_alloc.c > +++ b/fs/xfs/xfs_alloc.c > @@ -1866,6 +1866,7 @@ xfs_alloc_fix_freelist( > /* > * Initialize the args structure. > */ > + memset(&targs, 0, sizeof(targs)); > targs.tp = tp; > targs.mp = mp; > targs.agbp = agbp; > Index: b/fs/xfs/xfs_bmap.c > =================================================================== > --- a/fs/xfs/xfs_bmap.c > +++ b/fs/xfs/xfs_bmap.c > @@ -2437,6 +2437,7 @@ xfs_bmap_btalloc( > * Normal allocation, done through xfs_alloc_vextent. > */ > tryagain = isaligned = 0; > + memset(&args, 0, sizeof(args)); > args.tp = ap->tp; > args.mp = mp; > args.fsbno = ap->blkno; > @@ -3082,6 +3083,7 @@ xfs_bmap_extents_to_btree( > * Convert to a btree with two levels, one record in root. > */ > XFS_IFORK_FMT_SET(ip, whichfork, XFS_DINODE_FMT_BTREE); > + memset(&args, 0, sizeof(args)); > args.tp = tp; > args.mp = mp; > args.firstblock = *firstblock; > @@ -3237,6 +3239,7 @@ xfs_bmap_local_to_extents( > xfs_buf_t *bp; /* buffer for extent block */ > xfs_bmbt_rec_host_t *ep;/* extent record pointer */ > > + memset(&args, 0, sizeof(args)); > args.tp = tp; > args.mp = ip->i_mount; > args.firstblock = *firstblock; > Index: b/fs/xfs/xfs_ialloc.c > =================================================================== > --- a/fs/xfs/xfs_ialloc.c > +++ b/fs/xfs/xfs_ialloc.c > @@ -250,6 +250,7 @@ xfs_ialloc_ag_alloc( > /* boundary */ > struct xfs_perag *pag; > > + memset(&args, 0, sizeof(args)); > args.tp = tp; > args.mp = tp->t_mountp; > > > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From david@fromorbit.com Tue Sep 25 16:23:29 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8PLNThP107761 for ; Tue, 25 Sep 2012 16:23:29 -0500 X-ASG-Debug-ID: 1348608285-04bdf04fbd3fb10001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id atwxy6mQGfyCjJg6 for ; Tue, 25 Sep 2012 14:24:45 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AtANAN8fYlB5LGEv/2dsb2JhbABFhSK4MwIBgQyBCYIgAQEEATocIwULCAMOCi4UJQMhE4d/BblXFIsGgQOBQ4McYAOVZYk7hm6CeQ Received: from ppp121-44-97-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.97.47]) by ipmail07.adl2.internode.on.net with ESMTP; 26 Sep 2012 06:54:44 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TGccU-00010Y-QE; Wed, 26 Sep 2012 07:24:42 +1000 Date: Wed, 26 Sep 2012 07:24:42 +1000 From: Dave Chinner To: Peter Watkins Cc: xfs@oss.sgi.com Subject: Re: xfs_repair: enabling lazy sb counters Message-ID: <20120925212442.GE29154@dastard> X-ASG-Orig-Subj: Re: xfs_repair: enabling lazy sb counters References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1348608285 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109579 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Sep 25, 2012 at 11:40:33AM -0400, Peter Watkins wrote: > Hello, > > Has anyone noticed that phase1 updates the lazy count flag in the > superblock, and then writes out the sb before the traversal in phase5 > counts btree blocks consumed and sets agf_btreeblks? Not until now. :/ > Seems like if xfs_repair is interrupted or crashes at the wrong time, > you'd have enabled lazy count but not set agf_btreeblks, which would > trigger the corruption check in xfs_alloc.c:xfs_read_agf(). Which tells you to run xfs_repair, right? > If you just re-run xfs_repair to enable lazy counts, it would stop > early saying they're already enabled. You'd have to disable them, and > then enable again to get a consistent state. Or you just run xfs_repair without trying to change the lazy count state - that will recalculate the btreeblks count as part of the normal repair process.... > Second, is it possible to enable lazy counts without doing the > full repair traversal, i.e. a cheap and easy way to set > agf_btreeblks if the fs is already consistent? On some systems, > the whole repair enchilada can take a long time! The current process is that xfs_repair -rebuilds- the freespace trees from it's in memory state, and it takes until phase 5 for xfs_repair to have a full picture of the freespace in the filesystem after fixing up possible errors. So basically when you enable lazy counters, repair essentially verifies all the freespace is correct before enabling it. That's a necessary pre-requisite for lazy-counters to work correctly, and the only way to ensure it is to walk the filesystem first. That said, if you really want to avoid running a full xfs_repair, you can always count the btree blocks manually with xfs_db and set the btreeblk count fields yourself. You get to keep the broken pieces when something goes wrong, though. :/ Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Tue Sep 25 16:59:57 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8PLxvWc110419 for ; Tue, 25 Sep 2012 16:59:57 -0500 X-ASG-Debug-ID: 1348610472-04bdf04fbf41770001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id H5W5USnMqGSmbmrO for ; Tue, 25 Sep 2012 15:01:12 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AtINAGwoYlB5LGEv/2dsb2JhbAA9CIUiuDMCAYEMgQmCIAEBBAE6HCMFCwgDEQMBAgEuFCUDEw4TFIdrBbleFIsGFgpjgUODHGADlWWQKYJ5gUgBAw Received: from ppp121-44-97-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.97.47]) by ipmail07.adl2.internode.on.net with ESMTP; 26 Sep 2012 07:31:11 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TGdBm-000183-EW; Wed, 26 Sep 2012 08:01:10 +1000 Date: Wed, 26 Sep 2012 08:01:10 +1000 From: Dave Chinner To: Mark Tinguely Cc: bpm@sgi.com, xfs@oss.sgi.com Subject: Re: [PATCH 0/3] xfs: allocation worker causes freelist buffer lock hang Message-ID: <20120925220110.GF29154@dastard> X-ASG-Orig-Subj: Re: [PATCH 0/3] xfs: allocation worker causes freelist buffer lock hang References: <20120924171159.GG1140@sgi.com> <201209241809.q8OI94s3003323@eagdhcp-232-125.americas.sgi.com> <20120925005632.GB23520@dastard> <5061CA48.3040202@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5061CA48.3040202@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1348610472 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_SA210e X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109581 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC5_SA210e Custom Rule SA210e On Tue, Sep 25, 2012 at 10:14:16AM -0500, Mark Tinguely wrote: > On 09/24/12 19:56, Dave Chinner wrote: > >On Mon, Sep 24, 2012 at 01:09:04PM -0500, Mark Tinguely wrote: > >>> From bpm@sgi.com Mon Sep 24 12:11:59 2012 > >>>Date: Mon, 24 Sep 2012 12:11:59 -0500 > >>>From: Ben Myers > >>>To: > >>>Subject: Re: [PATCH 0/3] xfs: allocation worker causes freelist buffer lock > >>> hang > >>>Cc: > >>> > >>>Hi Mark, > >>> > >>>On Wed, Sep 19, 2012 at 11:31:33AM -0500, tinguely@sgi.com wrote: > >>>... > >>>>I traced the callers of xfs_alloc_vextent(), noting transaction creation, > >>>>commits and cancels; I noted loops in the callers and which were marked > >>>>as metadata/userdata. I can send this document to reviewers. > >>> > >>>I'd like to see the doc of xfs_alloc_vextent callers and which of them loop. > >>>Can you post your doc to the list? > >>> > >>>Regards, > >>> Ben > >> > >> > >>Here are the Linux 3.6.x callers of xfs_alloc_vextent() stopping at the > >>transaction commit/cancel level. > >> > >>XFS_BMAPI_METADATA *not* being set implies user data. > >> > >>Userdata being set is the community designated indication that an allocate > >>worker is needed to prevent the overflow of the kernel stack. > >> > >>Calling xfs_alloc_vextent() several times with the same transaction can cause > >>a dead lock if a new allocation worker can not be allocated. I noted where the > >>loops occur. xfs_alloc_vextent() can call itself, those calls must be in the > >>same allocation worker. > >> > >>As a bonus, consolidating the loops into one worker actually gives a slight > >>performance advantage. > > > >Can you quantify it? > > I was comparing the bonnie and iozone benchmarks outputs. I will see > if someone can enlighten me on how to quantify those numbers. Ugh. Don't bother. Those are two of the worst offenders in the "useless benchmarks for regression testing" category. Yeah, they *look* like they give decent numbers, but I've wasted so much time looking at results from these benhmarks only to find they do basic things wrong and give numbers that vary simple because you've made a change that increases or decreases the CPU cache footprint of a code path. e.g. IOZone uses the same memory buffer as the source/destination of all it's IO, and does not touch the contents of it at all. Hence for small IO, the buffer stays resident in the CPU caches and gives unrealsitically high throughput results. Worse is the fact that CPU cache residency of the buffer can change according to the kernel code path taken, so you can get massive changes in throughput just by changing the layout of the code without changing any logic.... IOZone can be useful if you know exactly what you are doing and using it to test a specific code path with a specific set of configurations. e.g. comparing ext3/4/xfs/btrfs on the same kernel and storage is fine. However, the moment you start using it to compare different kernels, it's a total crap shoot.... > >>Sorry this is wider than 80 characters wide. > >> --- > >>xfs_bmap_btalloc(xfs_bmalloca_t) > >>! xfs_bmap_alloc(xfs_bmalloca_t) > >>! ! xfs_bmapi_allocate(xfs_bmalloca_t, ...) > >>! ! ! xfs_bmapi_write(xfs_trans_t ...) loops over above > >>! ! ! ! xfs_attr_rmtval_set(xfs_da_args_t) loops over bmapi_write (xfs_attr_set_int) **XFS_BMAPI_METADATA** > >>! ! ! ! xfs_da_grow_inode_int(xfs_da_args_t) loops over bmapi_write **XFS_BMAPI_METADATA** > >>! ! ! ! xfs_qm_dqalloc(xfs_trans_t ...) does a xfs_bmap_finish/cancel **XFS_BMAPI_METADATA** > >>! ! ! ! xfs_iomap_write_direct(...) alloc trans, xfs_trans_commit/cancel > >>! ! ! ! xfs_iomap_write_allocate(...) alloc trans, xfs_trans_commit/cancel safe loop > >>! ! ! ! xfs_iomap_write_unwritten(..) alloc trans, xfs_trans_commit/cancel safe loop > >>! ! ! ! xfs_growfs_rt_alloc(..) alloc trans, xfs_trans_commit/cancel safe loop > >>! ! ! ! xfs_symlink(...) allocates trans does a xfs_trans_commit/cancel > >>! ! ! ! xfs_alloc_file_space(...) alloc trans, xfs_trans_commit/cancel safe loop > > > >So the only data path callers though here are > >xfs_iomap_write_direct(), xfs_iomap_write_allocate() and > >xfs_iomap_write_unwritten() and xfs_alloc_file_space(). Everything > >else is metadata, so won't use > > Correct. Only these use the worker. All the other paths directly > call the __xfs_alloc_vextent() routine. I saved the xfs_bmalloca and > fs_alloc_arg when allocating a buffer. I am quite confident that > this is the only path that causes the problem. Of course - they are the only paths that do userdata allocation :/ > > >>xfs_bmap_extents_to_btree(xfs_trans_t ...)<- set userdata to 0 (patch 3) > >>! xfs_bmap_add_attrfork_extents(xfs_trans_t ...) > >>! ! xfs_bmap_add_attrfork(...) allocates trans does a xfs_trans_commit/cancel > >>! xfs_bmap_add_extent_delay_real(fs_bmalloca) > >>! ! xfs_bmapi_allocate(xfs_bmalloca_t, ...) > >>! ! ! > >>! xfs_bmap_add_extent_unwritten_real(xfs_trans_t ...) > >>! ! xfs_bmapi_convert_unwritten(xfs_bmalloca ...) > >>! ! ! xfs_bmapi_write(xfs_trans ...) calls xfs_bmapi_convert_unwritten in loop XFS_BMAPI_METADATA > >>! ! ! ! ... > >..... > >>! xfs_bmap_add_extent_hole_real(xfs_bmalloca ...) > >>! ! xfs_bmapi_allocate(xfs_bmalloca_t, ...) > >>! ! ! ... > > > >So it's bmbt modification that looks to be the problem here, right? > > > >>xfs_bmap_local_to_extents(xfs_trans_t ...)<- set userdata to 0 (patch 3) > >>! xfs_bmap_add_attrfork_local(xfs_trans_t ..) > >>! ! xfs_bmap_add_attrfork(...) trans alloc, bmap_finish trans_commit/cancel > >>! xfs_bmapi_write(xfs_trans_t ...) XFS_BMAPI_METADATA > >>! ! ... > > > >Same here. > > > >That's all I can see as problematic - maybe I read the output wrong > >and there's others? > > > >i.e. all other xfs_alloc_vextent() callers are either in metadata > >context (so don't use the workqueue) or commit the transaction > >directly after xfs_bmapi_write returns so will unlock the AGF buffer > >before calling into xfs_bmapi_write a second time. > > > >If these are the only loops, then patch 3 is all that is > >necessary to avoid the problem of blocking on workqueue resource > >while we are already on the workqueue, right? i.e. bmbt allocation > >is a metadata allocation, even though the context is a data > >allocation, and ensuring it is metadata means that the current > >transaction won't get blocked waiting for workqueue resources... > > > >What am I missing? > > Patch 3 is a clean up. I disagree - allocating metadata using the userdata tag is clearly wrong, and AFAICT is a real deadlock. > userdata is used by the allocation routines > and its value should be correct for those routines. I discovered the > uninitialized values tracing the calling list. The fact that the > worker routine was using and randomly creating a worker based on the > stack value is not a factor in the problem because those paths do > not loop on xfs_alloc_vextent(). I guess I don't understand what you mean by "loop on xfs_alloc_vextent()" then. The problem I see above is this: thread 1 worker 1 worker 2..max xfs_bmapi_write(userdata) xfs_bmapi_allocate(user) xfs_alloc_vextent(user) wait _xfs_alloc_vextent() locks AGF _xfs_alloc_vextent() blocks on AGF lock completes allocation xfs_bmap_add_extent_hole_real xfs_bmap_extents_to_btree xfs_alloc_vextent(user) wait The moment xfs_bmap_extents_to_btree() is converted to a metadata allocation, this deadlock goes away because we end up doing: xfs_bmap_add_extent_hole_real xfs_bmap_extents_to_btree xfs_alloc_vextent(meta) __xfs_alloc_vextent and continuing to the end of xfs_bmapi_write() without ever waiting on a worker thread while holding the AGF locked. I cannot see any other path where we call xfs_alloc_vextent() with the AGF locked within an active transaction with userdata set, which is why I'm saying that I don't understand what you mean by "loops on xfs_alloc_vextent()". > Patch 2 moves the worker so that when the worker servicing data > allocation request gets the lock, it will hold the worker over the > loop in xfs_bmapi_write() until it can do a xfs_trans_commit/cancel. > If it does not have the lock, then that worker will wait until it > can get the lock. > > Your patch hangs when limiting the available workers on test 109 on > the 3 machines (2 x86_64 and a x86_32) that I tried it on. I am > trying a fourth machine to be sure. Yeah, looks like the loop in __xfs_alloc_vextent is not terminating correctly. I'll fix it. Cheers, Dave. -- Dave Chinner david@fromorbit.com From tiwarikanand@gmail.com Tue Sep 25 20:25:16 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=BAYES_00,FREEMAIL_FROM, HTML_MESSAGE,T_DKIM_INVALID autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8Q1PGvi128187 for ; Tue, 25 Sep 2012 20:25:16 -0500 X-ASG-Debug-ID: 1348622793-04cb6c497248930001-NocioJ Received: from mail-vb0-f46.google.com (mail-vb0-f46.google.com [209.85.212.46]) by cuda.sgi.com with ESMTP id W7j0CQQcCWOxM2Qw (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 25 Sep 2012 18:26:33 -0700 (PDT) X-Barracuda-Envelope-From: tiwarikanand@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.212.46 X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.46] Received: by vbbff1 with SMTP id ff1so80194vbb.5 for ; Tue, 25 Sep 2012 18:26:32 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.46] X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.46] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=zGua0sswgZxP/DZkPwVLeS0PfQGZe4LxMC6YkFMj61I=; b=AfO9+dsmhZFn9GlnlVyphLu3W3ksv6BlygIU7MUaL1/fP/1GML43CNeDDWzXJncR+F BBiLZw/qlGWNw2n7p6VCdGfVJcknGYWNxXkJtMA+3v+uCFR0YAkpEnCT4a7f0Wv9o2TI Uwln4nWaj6JFopNQlkV25ODa17TDChpaQUMMD5Rx17SdliBy9OD/d541lQ/V3IQ7W6NK 4aEq0nAbarnWQoBs/P13pOLwEnx1Bjv4sNDFCzZ3t8QbAQoEwPcg8daNH9tJenGLsOoH adBrRcw+pMeMOd6SEYFb89ugnBdbGEk00vzdFJpIgFLRDqQ8V3XHAm46PkTyYXes9IXG KIkw== MIME-Version: 1.0 Received: by 10.52.19.198 with SMTP id h6mr8193423vde.78.1348622792791; Tue, 25 Sep 2012 18:26:32 -0700 (PDT) Received: by 10.58.35.10 with HTTP; Tue, 25 Sep 2012 18:26:32 -0700 (PDT) In-Reply-To: References: <505BF45D.5050909@sandeen.net> <20120924075551.GF20960@dastard> Date: Tue, 25 Sep 2012 19:26:32 -0600 Message-ID: Subject: Re: xfs_repair deleting realtime files. From: Anand Tiwari X-ASG-Orig-Subj: Re: xfs_repair deleting realtime files. To: Dave Chinner Cc: Eric Sandeen , xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=20cf307ca01c80176e04ca90b600 X-Barracuda-Connect: mail-vb0-f46.google.com[209.85.212.46] X-Barracuda-Start-Time: 1348622793 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109595 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message --20cf307ca01c80176e04ca90b600 Content-Type: text/plain; charset=ISO-8859-1 On Mon, Sep 24, 2012 at 6:51 AM, Anand Tiwari wrote: > > > On Mon, Sep 24, 2012 at 1:55 AM, Dave Chinner wrote: > >> On Fri, Sep 21, 2012 at 12:00:13AM -0500, Eric Sandeen wrote: >> > On 9/20/12 7:40 PM, Anand Tiwari wrote: >> > > Hi All, >> > > >> > > I have been looking into an issue with xfs_repair with realtime sub >> volume. some times while running xfs_repair I see following errors >> > > >> > > ---------------------------- >> > > data fork in rt inode 134 claims used rt block 19607 >> > > bad data fork in inode 134 >> > > would have cleared inode 134 >> > > data fork in rt inode 135 claims used rt block 29607 >> > > bad data fork in inode 135 >> > > would have cleared inode 135 >> ..... >> > > xfs_db> inode 135 >> > > xfs_db> bmap >> > > data offset 0 startblock 13062144 (12/479232) count 2097000 flag 0 >> > > data offset 2097000 startblock 15159144 (14/479080) count 2097000 >> flag 0 >> > > data offset 4194000 startblock 17256144 (16/478928) count 2097000 >> flag 0 >> > > data offset 6291000 startblock 19353144 (18/478776) count 2097000 >> flag 0 >> > > data offset 8388000 startblock 21450144 (20/478624) count 2097000 >> flag 0 >> > > data offset 10485000 startblock 23547144 (22/478472) count 2097000 >> flag 0 >> > > data offset 12582000 startblock 25644144 (24/478320) count 2097000 >> flag 0 >> > > data offset 14679000 startblock 27741144 (26/478168) count 2097000 >> flag 0 >> > > data offset 16776000 startblock 29838144 (28/478016) count 2097000 >> flag 0 >> > > data offset 18873000 startblock 31935144 (30/477864) count 1607000 >> flag 0 >> > > xfs_db> inode 134 >> > > xfs_db> bmap >> > > data offset 0 startblock 7942144 (7/602112) count 2097000 flag 0 >> > > data offset 2097000 startblock 10039144 (9/601960) count 2097000 flag >> 0 >> > > data offset 4194000 startblock 12136144 (11/601808) count 926000 flag >> 0 >> > >> > It's been a while since I thought about realtime, but - >> > >> > That all seems fine, I don't see anything overlapping there, they are >> > all perfectly adjacent, though of interesting size. >> >> Yeah, the size is the problem. >> >> .... >> > Every extent above is length 2097000 blocks, and they are adjacent. >> > But you say your realtime extent size is 512 blocks ... which doesn't go >> > into 2097000 evenly. So that's odd, at least. >> >> Once you realise that the bmapbt is recording multiples of FSB (4k) >> rather than rtextsz (2MB), it becomes more obvious what the problem >> is: rounding of the extent size at MAXEXTLEN - 2097000 is only 152 >> blocks short of 2^21 (2097152). >> >> I haven't looked at the kernel code yet to work out why it is >> rounding to a non-rtextsz multiple, but that is the source of the >> problem. >> >> The repair code is detecting that extents are not of the >> correct granularity, but the error message indicates that this was >> only ever expected for duplicate blocks occurring rather than a >> kernel bug. So "fixing repair" is not what is needd here - finding >> and fixing the kernel bug is what you shoul be looking at. >> >> Cheers, >> >> Dave. >> -- >> Dave Chinner >> david@fromorbit.com >> > > > thanks, I started looking at allocator code and and will report if see > something > I think this is what happening. If we have following conditions, 1) we have more than 8gb contiguous space available to allocate. ( i.e. more than 2^21 4k blocks) 2) only one file is open for writing in real-time volume. To satisfy first condition, I just took empty file-system. Now lets start allocating, lets say in chucks of 25000, realtime allocator will have no problem allocating "exact" block while searching forward. xfs_rtfind_forw(). It will allocate 49 "real-time extents", where the 49th "real-time extent" is partially full. (25000/512 = 48) everything is fine for first 83 allocations, as we were able to grow the extent. Now we have 2075000 (25000*83) blocks in first extent ie 4053 "real-time extents" (where last "real-time extent" is partially full). for 84th allocation, real-time allocator will allocate another 49 "real-time extents" as it does not know about maximum extent size, but we can not grow the extent in xfs_bmap_add_extent_unwritten_real(). so we insert a new extent (case BMAP_LEFT_FILLING). now the new extent starts from 2075000, which is not aligned with rextsize (512 in this case). To fix this, I see two options, 1) fix real-time allocator and teach it about maximum extent size. 2) for real-time files, aligned new extent before inserting. In my opinion, we should not worry about either of above, as this looks good method for allocation. I can fix xfs_repair tool and make it aware of these conditions ("real-time extents" shared by two or more extents). Let me know what you guys think, anand --20cf307ca01c80176e04ca90b600 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable

On Mon, Sep 24, 2012 at 6:51 AM, Anand T= iwari <tiwarikanand@gmail.com> wrote:


= On Mon, Sep 24, 2012 at 1:55 AM, Dave Chinner <david@fromorbit.com&g= t; wrote:
On Fri, Sep 21, 2012 at 12:00:13AM -0500, Eric Sandeen wrote:
> On 9/20/12 7:40 PM, Anand Tiwari wrote:
> > Hi All,
> >
> > I have been looking into an issue with xfs_repair with realtime s= ub volume. some times while running xfs_repair I see following errors
> >
> > ----------------------------
> > data fork in rt inode 134 claims used rt block 19607
> > bad data fork in inode 134
> > would have cleared inode 134
> > data fork in rt inode 135 claims used rt block 29607
> > bad data fork in inode 135
> > would have cleared inode 135
.....
> > xfs_db> inode 135
> > xfs_db> bmap
> > data offset 0 startblock 13062144 (12/479232) count 2097000 flag = 0
> > data offset 2097000 startblock 15159144 (14/479080) count 2097000= flag 0
> > data offset 4194000 startblock 17256144 (16/478928) count 2097000= flag 0
> > data offset 6291000 startblock 19353144 (18/478776) count 2097000= flag 0
> > data offset 8388000 startblock 21450144 (20/478624) count 2097000= flag 0
> > data offset 10485000 startblock 23547144 (22/478472) count 209700= 0 flag 0
> > data offset 12582000 startblock 25644144 (24/478320) count 209700= 0 flag 0
> > data offset 14679000 startblock 27741144 (26/478168) count 209700= 0 flag 0
> > data offset 16776000 startblock 29838144 (28/478016) count 209700= 0 flag 0
> > data offset 18873000 startblock 31935144 (30/477864) count 160700= 0 flag 0
> > xfs_db> inode 134
> > xfs_db> bmap
> > data offset 0 startblock 7942144 (7/602112) count 2097000 flag 0<= br> > > data offset 2097000 startblock 10039144 (9/601960) count 2097000 = flag 0
> > data offset 4194000 startblock 12136144 (11/601808) count 926000 = flag 0
>
> It's been a while since I thought about realtime, but -
>
> That all seems fine, I don't see anything overlapping there, they = are
> all perfectly adjacent, though of interesting size.

Yeah, the size is the problem.

....
> Every extent above is length 2097000 blocks, and they are adjacen= t.
> But you say your realtime extent size is 512 blocks ... which doesn= 9;t go
> into 2097000 evenly. =A0 So that's odd, at least.

Once you realise that the bmapbt is recording multiples of FSB (4k) rather than rtextsz (2MB), it becomes more obvious what the problem
is: rounding of the extent size at MAXEXTLEN - 2097000 is only 152
blocks short of 2^21 (2097152).

I haven't looked at the kernel code yet to work out why it is
rounding to a non-rtextsz multiple, but that is the source of the
problem.

The repair code is detecting that extents are not of the
correct granularity, but the error message indicates that this was
only ever expected for duplicate blocks occurring rather than a
kernel bug. So "fixing repair" is not what is needd here - findin= g
and fixing the kernel bug is what you shoul be looking at.

Cheers,

Dave.
--
Dave Chinner
david@fromorbit.co= m


thanks= , I started looking at allocator code and and will report if see something= =A0


I think this is what happening.=A0 If we have fo= llowing conditions,
=A0 1) we have more than 8gb contiguous space availa= ble to allocate. ( i.e. more than 2^21 4k blocks)
=A0 2) only one file i= s open for writing in real-time volume.

To satisfy first condition, I just took empty file-system.

Now l= ets start allocating, lets say in chucks of 25000, realtime allocator will = have no problem allocating "exact" block while searching forward.=
xfs_rtfind_forw(). It will allocate 49 "real-time extents", where= the 49th "real-time extent" is partially full.=A0 (25000/512 =3D= 48)

everything is fine for first 83 allocations, as we were able to= grow the extent. Now we have 2075000 (25000*83) blocks in first extent ie = 4053 "real-time extents" (where last "real-time extent"= is partially full).

for 84th allocation, real-time allocator will allocate another 49 "= ;real-time extents" as it does not know about maximum extent size, but= we can not grow the extent in xfs_bmap_add_extent_unwritten_real().=A0 so = we insert a new extent (case BMAP_LEFT_FILLING).=A0 now the new extent star= ts from 2075000, which is not aligned with rextsize (512 in this case).

To fix this, I see two options,
1) fix real-time allocator and teach= it about maximum extent size.
2) for real-time files, aligned new exten= t before inserting.

In my opinion, we should not worry about either = of above, as this looks good method for allocation.=A0 I can fix xfs_repair= tool and make it aware of these conditions ("real-time extents" = shared by two or more extents).

Let me know what you guys think,

anand

--20cf307ca01c80176e04ca90b600-- From david@fromorbit.com Tue Sep 25 21:42:51 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8Q2gpDX138796 for ; Tue, 25 Sep 2012 21:42:51 -0500 X-ASG-Debug-ID: 1348627446-04cbb012264c6f0001-NocioJ Received: from ipmail07.adl2.internode.on.net (ipmail07.adl2.internode.on.net [150.101.137.131]) by cuda.sgi.com with ESMTP id kbb5bmRQRmJqeeDc for ; Tue, 25 Sep 2012 19:44:07 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.131 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqYMAI1rYlB5LGEv/2dsb2JhbABFhSK5BgECgQuBCYIgAQEEAScTHCMFCwgDGC4UDRgDIROHcwMJBbAeDYlUFIokYmxKhFMDlBGBVIk7gWSFCoJ5 Received: from ppp121-44-97-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.97.47]) by ipmail07.adl2.internode.on.net with ESMTP; 26 Sep 2012 12:14:05 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TGhbX-0001bA-MY; Wed, 26 Sep 2012 12:44:03 +1000 Date: Wed, 26 Sep 2012 12:44:03 +1000 From: Dave Chinner To: Anand Tiwari Cc: Eric Sandeen , xfs@oss.sgi.com Subject: Re: xfs_repair deleting realtime files. Message-ID: <20120926024403.GH29154@dastard> X-ASG-Orig-Subj: Re: xfs_repair deleting realtime files. References: <505BF45D.5050909@sandeen.net> <20120924075551.GF20960@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail07.adl2.internode.on.net[150.101.137.131] X-Barracuda-Start-Time: 1348627446 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109599 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Sep 25, 2012 at 07:26:32PM -0600, Anand Tiwari wrote: > On Mon, Sep 24, 2012 at 6:51 AM, Anand Tiwari wrote: > > > > > > > On Mon, Sep 24, 2012 at 1:55 AM, Dave Chinner wrote: > > > >> On Fri, Sep 21, 2012 at 12:00:13AM -0500, Eric Sandeen wrote: > >> > On 9/20/12 7:40 PM, Anand Tiwari wrote: > >> > > Hi All, > >> > > > >> > > I have been looking into an issue with xfs_repair with realtime sub > >> volume. some times while running xfs_repair I see following errors > >> > > > >> > > ---------------------------- > >> > > data fork in rt inode 134 claims used rt block 19607 > >> > > bad data fork in inode 134 > >> > > would have cleared inode 134 > >> > > data fork in rt inode 135 claims used rt block 29607 > >> > > bad data fork in inode 135 > >> > > would have cleared inode 135 > >> ..... > >> > > xfs_db> inode 135 > >> > > xfs_db> bmap > >> > > data offset 0 startblock 13062144 (12/479232) count 2097000 flag 0 > >> > > data offset 2097000 startblock 15159144 (14/479080) count 2097000 > >> flag 0 > >> > > data offset 4194000 startblock 17256144 (16/478928) count 2097000 > >> flag 0 > >> > > data offset 6291000 startblock 19353144 (18/478776) count 2097000 > >> flag 0 > >> > > data offset 8388000 startblock 21450144 (20/478624) count 2097000 > >> flag 0 > >> > > data offset 10485000 startblock 23547144 (22/478472) count 2097000 > >> flag 0 > >> > > data offset 12582000 startblock 25644144 (24/478320) count 2097000 > >> flag 0 > >> > > data offset 14679000 startblock 27741144 (26/478168) count 2097000 > >> flag 0 > >> > > data offset 16776000 startblock 29838144 (28/478016) count 2097000 > >> flag 0 > >> > > data offset 18873000 startblock 31935144 (30/477864) count 1607000 > >> flag 0 > >> > > xfs_db> inode 134 > >> > > xfs_db> bmap > >> > > data offset 0 startblock 7942144 (7/602112) count 2097000 flag 0 > >> > > data offset 2097000 startblock 10039144 (9/601960) count 2097000 flag > >> 0 > >> > > data offset 4194000 startblock 12136144 (11/601808) count 926000 flag > >> 0 > >> > > >> > It's been a while since I thought about realtime, but - > >> > > >> > That all seems fine, I don't see anything overlapping there, they are > >> > all perfectly adjacent, though of interesting size. > >> > >> Yeah, the size is the problem. > >> > >> .... > >> > Every extent above is length 2097000 blocks, and they are adjacent. > >> > But you say your realtime extent size is 512 blocks ... which doesn't go > >> > into 2097000 evenly. So that's odd, at least. > >> > >> Once you realise that the bmapbt is recording multiples of FSB (4k) > >> rather than rtextsz (2MB), it becomes more obvious what the problem > >> is: rounding of the extent size at MAXEXTLEN - 2097000 is only 152 > >> blocks short of 2^21 (2097152). > >> > >> I haven't looked at the kernel code yet to work out why it is > >> rounding to a non-rtextsz multiple, but that is the source of the > >> problem. > >> > >> The repair code is detecting that extents are not of the > >> correct granularity, but the error message indicates that this was > >> only ever expected for duplicate blocks occurring rather than a > >> kernel bug. So "fixing repair" is not what is needd here - finding > >> and fixing the kernel bug is what you shoul be looking at. > >> > >> Cheers, > >> > >> Dave. > >> -- > >> Dave Chinner > >> david@fromorbit.com > >> > > > > > > thanks, I started looking at allocator code and and will report if see > > something > > > > > I think this is what happening. If we have following conditions, > 1) we have more than 8gb contiguous space available to allocate. ( i.e. > more than 2^21 4k blocks) > 2) only one file is open for writing in real-time volume. > > To satisfy first condition, I just took empty file-system. > > Now lets start allocating, lets say in chucks of 25000, realtime allocator > will have no problem allocating "exact" block while searching forward. > xfs_rtfind_forw(). It will allocate 49 "real-time extents", where the 49th > "real-time extent" is partially full. (25000/512 = 48) > > everything is fine for first 83 allocations, as we were able to grow the > extent. Now we have 2075000 (25000*83) blocks in first extent ie 4053 > "real-time extents" (where last "real-time extent" is partially full). > > for 84th allocation, real-time allocator will allocate another 49 > "real-time extents" as it does not know about maximum extent size, but we > can not grow the extent in xfs_bmap_add_extent_unwritten_real(). so we > insert a new extent (case BMAP_LEFT_FILLING). now the new extent starts > from 2075000, which is not aligned with rextsize (512 in this case). Ok, so it's a problem with using unwritten extents and converting them. That is, the issue probably has nothing to do with the realtime allocator at all. Basically, when the unwritten extent occurs, we end up with a map like this: ext 0: offset 0, length 2075000 state written ext 1: offset 2075000 length 25000 state unwritten This will occur because you can't mix written/unwritten state in a single extent. What xfs_bmap_add_extent_unwritten_real() is attempting to do is convert the unwritten extent to written state and merge it with it's siblings. In this case, 2075000 + 25000 > MAXEXTLEN, so it does not merge them because of this check: if ((state & BMAP_LEFT_VALID) && !(state & BMAP_LEFT_DELAY) && LEFT.br_startoff + LEFT.br_blockcount == new->br_startoff && LEFT.br_startblock + LEFT.br_blockcount == new->br_startblock && LEFT.br_state == newext && >>>>>> LEFT.br_blockcount + new->br_blockcount <= MAXEXTLEN) state |= BMAP_LEFT_CONTIG; Which means that BMAP_LEFT_CONTIG is not set, indicating that the no merging with the an adjacent left extent should occur. Hence we end up wwith this: ext 0: offset 0, length 2075000 state written ext 1: offset 2075000 length 25000 state written That's fine for normal operation, but it means that large contiguous regions written via direct IO with non-rtextsz aligned/sized IO will have problem this problem. What technically should happen for these real time files is that the LEFT extent should be shortened to be aligned, and the new extent be lengthened and have it's startblock adjusted accordingly. i.e. we should end up with this: ext 0: offset 0, length 2074624 state written ext 1: offset 2074624 length 25376 state written > To fix this, I see two options, > 1) fix real-time allocator and teach it about maximum extent size. > 2) for real-time files, aligned new extent before inserting. 3) Fix the {BMAP_LEFT_CONTIG,MAXEXTLEN,rtextsz} handling in xfs_bmap_add_extent_unwritten_real(). It's possible that the BMAP_RIGHT_CONTIG case also needs similar fixing... > In my opinion, we should not worry about either of above, as this looks > good method for allocation. I can fix xfs_repair tool and make it aware of > these conditions ("real-time extents" shared by two or more extents). Personally, I'd prefer that 3) is done because RT extents should always be rtextsz aligned and sized, and the bmapbt should respect that requirement in all cases. Cheers, Dave. -- Dave Chinner david@fromorbit.com From tiwarikanand@gmail.com Tue Sep 25 22:51:05 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.1 required=5.0 tests=BAYES_00,FREEMAIL_FROM, HTML_MESSAGE,T_DKIM_INVALID autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8Q3p4r3151795 for ; Tue, 25 Sep 2012 22:51:04 -0500 X-ASG-Debug-ID: 1348631540-04bdf04fbe4b210001-NocioJ Received: from mail-vc0-f181.google.com (mail-vc0-f181.google.com [209.85.220.181]) by cuda.sgi.com with ESMTP id XnpMI232XkGfkyCC (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 25 Sep 2012 20:52:21 -0700 (PDT) X-Barracuda-Envelope-From: tiwarikanand@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.220.181 X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.181] Received: by vchn11 with SMTP id n11so165484vch.26 for ; Tue, 25 Sep 2012 20:52:20 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.181] X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.181] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=yV+roY34Id94XcNMBWXSmuC331MXLUT1KcIryXF83Oc=; b=sHbw3LYw00eUEksokIBNm04XwU8qpGwKqPbF7JojqTAz9f1pyXXOt73mMpXspR0gku ahsxJSQKJp15FzjF3opKMVFMxiF9DH13uqs/nsiUrM8VSrvRgnZBGgD7YP4GBwKKEUc9 6oKpCR3MB0b5oFmU6JInHa1Kf/BCQU3PLteWXW6ob7ENiMnFuDAK3Y62lMFyKjPJ+e3b i9SJ9TFLEdWVcXDmj131CpfVlDKtHF5LpCPGYaUYNBeKsCjhxyczG5hq3yvMcLUqXkGp IjrJWIgGr++6WyFlsN+fsasQtFCxXbTOBhw0pbBQE0ASF3vUzzUWR3raWzZTcL63Uq3E pq7w== MIME-Version: 1.0 Received: by 10.52.33.5 with SMTP id n5mr8448227vdi.38.1348631107466; Tue, 25 Sep 2012 20:45:07 -0700 (PDT) Received: by 10.58.35.10 with HTTP; Tue, 25 Sep 2012 20:45:07 -0700 (PDT) In-Reply-To: <20120926024403.GH29154@dastard> References: <505BF45D.5050909@sandeen.net> <20120924075551.GF20960@dastard> <20120926024403.GH29154@dastard> Date: Tue, 25 Sep 2012 21:45:07 -0600 Message-ID: Subject: Re: xfs_repair deleting realtime files. From: Anand Tiwari X-ASG-Orig-Subj: Re: xfs_repair deleting realtime files. To: Dave Chinner Cc: Eric Sandeen , xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=20cf3079bab617f6bb04ca92a687 X-Barracuda-Connect: mail-vc0-f181.google.com[209.85.220.181] X-Barracuda-Start-Time: 1348631541 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109604 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message --20cf3079bab617f6bb04ca92a687 Content-Type: text/plain; charset=ISO-8859-1 On Tue, Sep 25, 2012 at 8:44 PM, Dave Chinner wrote: > On Tue, Sep 25, 2012 at 07:26:32PM -0600, Anand Tiwari wrote: > > On Mon, Sep 24, 2012 at 6:51 AM, Anand Tiwari >wrote: > > > > > > > > > > > On Mon, Sep 24, 2012 at 1:55 AM, Dave Chinner > wrote: > > > > > >> On Fri, Sep 21, 2012 at 12:00:13AM -0500, Eric Sandeen wrote: > > >> > On 9/20/12 7:40 PM, Anand Tiwari wrote: > > >> > > Hi All, > > >> > > > > >> > > I have been looking into an issue with xfs_repair with realtime > sub > > >> volume. some times while running xfs_repair I see following errors > > >> > > > > >> > > ---------------------------- > > >> > > data fork in rt inode 134 claims used rt block 19607 > > >> > > bad data fork in inode 134 > > >> > > would have cleared inode 134 > > >> > > data fork in rt inode 135 claims used rt block 29607 > > >> > > bad data fork in inode 135 > > >> > > would have cleared inode 135 > > >> ..... > > >> > > xfs_db> inode 135 > > >> > > xfs_db> bmap > > >> > > data offset 0 startblock 13062144 (12/479232) count 2097000 flag 0 > > >> > > data offset 2097000 startblock 15159144 (14/479080) count 2097000 > > >> flag 0 > > >> > > data offset 4194000 startblock 17256144 (16/478928) count 2097000 > > >> flag 0 > > >> > > data offset 6291000 startblock 19353144 (18/478776) count 2097000 > > >> flag 0 > > >> > > data offset 8388000 startblock 21450144 (20/478624) count 2097000 > > >> flag 0 > > >> > > data offset 10485000 startblock 23547144 (22/478472) count 2097000 > > >> flag 0 > > >> > > data offset 12582000 startblock 25644144 (24/478320) count 2097000 > > >> flag 0 > > >> > > data offset 14679000 startblock 27741144 (26/478168) count 2097000 > > >> flag 0 > > >> > > data offset 16776000 startblock 29838144 (28/478016) count 2097000 > > >> flag 0 > > >> > > data offset 18873000 startblock 31935144 (30/477864) count 1607000 > > >> flag 0 > > >> > > xfs_db> inode 134 > > >> > > xfs_db> bmap > > >> > > data offset 0 startblock 7942144 (7/602112) count 2097000 flag 0 > > >> > > data offset 2097000 startblock 10039144 (9/601960) count 2097000 > flag > > >> 0 > > >> > > data offset 4194000 startblock 12136144 (11/601808) count 926000 > flag > > >> 0 > > >> > > > >> > It's been a while since I thought about realtime, but - > > >> > > > >> > That all seems fine, I don't see anything overlapping there, they > are > > >> > all perfectly adjacent, though of interesting size. > > >> > > >> Yeah, the size is the problem. > > >> > > >> .... > > >> > Every extent above is length 2097000 blocks, and they are adjacent. > > >> > But you say your realtime extent size is 512 blocks ... which > doesn't go > > >> > into 2097000 evenly. So that's odd, at least. > > >> > > >> Once you realise that the bmapbt is recording multiples of FSB (4k) > > >> rather than rtextsz (2MB), it becomes more obvious what the problem > > >> is: rounding of the extent size at MAXEXTLEN - 2097000 is only 152 > > >> blocks short of 2^21 (2097152). > > >> > > >> I haven't looked at the kernel code yet to work out why it is > > >> rounding to a non-rtextsz multiple, but that is the source of the > > >> problem. > > >> > > >> The repair code is detecting that extents are not of the > > >> correct granularity, but the error message indicates that this was > > >> only ever expected for duplicate blocks occurring rather than a > > >> kernel bug. So "fixing repair" is not what is needd here - finding > > >> and fixing the kernel bug is what you shoul be looking at. > > >> > > >> Cheers, > > >> > > >> Dave. > > >> -- > > >> Dave Chinner > > >> david@fromorbit.com > > >> > > > > > > > > > thanks, I started looking at allocator code and and will report if see > > > something > > > > > > > > > I think this is what happening. If we have following conditions, > > 1) we have more than 8gb contiguous space available to allocate. ( i.e. > > more than 2^21 4k blocks) > > 2) only one file is open for writing in real-time volume. > > > > To satisfy first condition, I just took empty file-system. > > > > Now lets start allocating, lets say in chucks of 25000, realtime > allocator > > will have no problem allocating "exact" block while searching forward. > > xfs_rtfind_forw(). It will allocate 49 "real-time extents", where the > 49th > > "real-time extent" is partially full. (25000/512 = 48) > > > > everything is fine for first 83 allocations, as we were able to grow the > > extent. Now we have 2075000 (25000*83) blocks in first extent ie 4053 > > "real-time extents" (where last "real-time extent" is partially full). > > > > for 84th allocation, real-time allocator will allocate another 49 > > "real-time extents" as it does not know about maximum extent size, but we > > can not grow the extent in xfs_bmap_add_extent_unwritten_real(). so we > > insert a new extent (case BMAP_LEFT_FILLING). now the new extent starts > > from 2075000, which is not aligned with rextsize (512 in this case). > > Ok, so it's a problem with using unwritten extents and converting > them. That is, the issue probably has nothing to do with the > realtime allocator at all. > > Basically, when the unwritten extent occurs, we end up with a map > like this: > > ext 0: offset 0, length 2075000 state written > ext 1: offset 2075000 length 25000 state unwritten > > This will occur because you can't mix written/unwritten state in a > single extent. > > What xfs_bmap_add_extent_unwritten_real() is attempting to do is > convert the unwritten extent to written state and merge it with it's > siblings. In this case, 2075000 + 25000 > MAXEXTLEN, so it does not > merge them because of this check: > > if ((state & BMAP_LEFT_VALID) && !(state & BMAP_LEFT_DELAY) && > LEFT.br_startoff + LEFT.br_blockcount == new->br_startoff && > LEFT.br_startblock + LEFT.br_blockcount == new->br_startblock > && > LEFT.br_state == newext && > >>>>>> LEFT.br_blockcount + new->br_blockcount <= MAXEXTLEN) > state |= BMAP_LEFT_CONTIG; > > Which means that BMAP_LEFT_CONTIG is not set, indicating that the no > merging with the an adjacent left extent should occur. Hence we end > up wwith this: > > ext 0: offset 0, length 2075000 state written > ext 1: offset 2075000 length 25000 state written > > That's fine for normal operation, but it means that large contiguous > regions written via direct IO with non-rtextsz aligned/sized IO will > have problem this problem. > > What technically should happen for these real time files is that the > LEFT extent should be shortened to be aligned, and the new extent be > lengthened and have it's startblock adjusted accordingly. > > i.e. we should end up with this: > > ext 0: offset 0, length 2074624 state written > ext 1: offset 2074624 length 25376 state written > > > To fix this, I see two options, > > 1) fix real-time allocator and teach it about maximum extent size. > > 2) for real-time files, aligned new extent before inserting. > > 3) Fix the {BMAP_LEFT_CONTIG,MAXEXTLEN,rtextsz} handling in > xfs_bmap_add_extent_unwritten_real(). > > It's possible that the BMAP_RIGHT_CONTIG case also needs similar > fixing... > > > In my opinion, we should not worry about either of above, as this looks > > good method for allocation. I can fix xfs_repair tool and make it aware > of > > these conditions ("real-time extents" shared by two or more extents). > > Personally, I'd prefer that 3) is done because RT extents should > always be rtextsz aligned and sized, and the bmapbt should respect > that requirement in all cases. > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > thanks Dave for prompt reply, I meant to implement option 2 as you explained (option 3). I will start working on it tomorrow. In the mean time, I also had to put something in xfs_repair for the files which already exists on the disk. Would you guys willing to review/comment on that ? anand --20cf3079bab617f6bb04ca92a687 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable

On Tue, Sep 25, 2012 at 8:44 PM, Dave Ch= inner <david@fromorbit.com> wrote:
On Tue, Sep 25, 2012 at 07:26:32PM = -0600, Anand Tiwari wrote:
> On Mon, Sep 24, 2012 at 6:51 AM, Anand Tiwari <tiwarikanand@gmail.com>wrote:
>
> >
> >
> > On Mon, Sep 24, 2012 at 1:55 AM, Dave Chinner <david@fromorbit.com> wrote:
> >
> >> On Fri, Sep 21, 2012 at 12:00:13AM -0500, Eric Sandeen wrote:=
> >> > On 9/20/12 7:40 PM, Anand Tiwari wrote:
> >> > > Hi All,
> >> > >
> >> > > I have been looking into an issue with xfs_repair w= ith realtime sub
> >> volume. some times while running xfs_repair I see following e= rrors
> >> > >
> >> > > ----------------------------
> >> > > data fork in rt inode 134 claims used rt block 1960= 7
> >> > > bad data fork in inode 134
> >> > > would have cleared inode 134
> >> > > data fork in rt inode 135 claims used rt block 2960= 7
> >> > > bad data fork in inode 135
> >> > > would have cleared inode 135
> >> .....
> >> > > xfs_db> inode 135
> >> > > xfs_db> bmap
> >> > > data offset 0 startblock 13062144 (12/479232) count= 2097000 flag 0
> >> > > data offset 2097000 startblock 15159144 (14/479080)= count 2097000
> >> flag 0
> >> > > data offset 4194000 startblock 17256144 (16/478928)= count 2097000
> >> flag 0
> >> > > data offset 6291000 startblock 19353144 (18/478776)= count 2097000
> >> flag 0
> >> > > data offset 8388000 startblock 21450144 (20/478624)= count 2097000
> >> flag 0
> >> > > data offset 10485000 startblock 23547144 (22/478472= ) count 2097000
> >> flag 0
> >> > > data offset 12582000 startblock 25644144 (24/478320= ) count 2097000
> >> flag 0
> >> > > data offset 14679000 startblock 27741144 (26/478168= ) count 2097000
> >> flag 0
> >> > > data offset 16776000 startblock 29838144 (28/478016= ) count 2097000
> >> flag 0
> >> > > data offset 18873000 startblock 31935144 (30/477864= ) count 1607000
> >> flag 0
> >> > > xfs_db> inode 134
> >> > > xfs_db> bmap
> >> > > data offset 0 startblock 7942144 (7/602112) count 2= 097000 flag 0
> >> > > data offset 2097000 startblock 10039144 (9/601960) = count 2097000 flag
> >> 0
> >> > > data offset 4194000 startblock 12136144 (11/601808)= count 926000 flag
> >> 0
> >> >
> >> > It's been a while since I thought about realtime, bu= t -
> >> >
> >> > That all seems fine, I don't see anything overlappin= g there, they are
> >> > all perfectly adjacent, though of interesting size.
> >>
> >> Yeah, the size is the problem.
> >>
> >> ....
> >> > Every extent above is length 2097000 blocks, and they ar= e adjacent.
> >> > But you say your realtime extent size is 512 blocks ... = which doesn't go
> >> > into 2097000 evenly. =A0 So that's odd, at least. > >>
> >> Once you realise that the bmapbt is recording multiples of FS= B (4k)
> >> rather than rtextsz (2MB), it becomes more obvious what the p= roblem
> >> is: rounding of the extent size at MAXEXTLEN - 2097000 is onl= y 152
> >> blocks short of 2^21 (2097152).
> >>
> >> I haven't looked at the kernel code yet to work out why i= t is
> >> rounding to a non-rtextsz multiple, but that is the source of= the
> >> problem.
> >>
> >> The repair code is detecting that extents are not of the
> >> correct granularity, but the error message indicates that thi= s was
> >> only ever expected for duplicate blocks occurring rather than= a
> >> kernel bug. So "fixing repair" is not what is needd= here - finding
> >> and fixing the kernel bug is what you shoul be looking at. > >>
> >> Cheers,
> >>
> >> Dave.
> >> --
> >> Dave Chinner
> >> david@fromorbit.com
> >>
> >
> >
> > thanks, I started looking at allocator code and and will report i= f see
> > something
> >
>
>
> I think this is what happening. =A0If we have following conditions, > =A0 1) we have more than 8gb contiguous space available to allocate. (= i.e.
> more than 2^21 4k blocks)
> =A0 2) only one file is open for writing in real-time volume.
>
> To satisfy first condition, I just took empty file-system.
>
> Now lets start allocating, lets say in chucks of 25000, realtime alloc= ator
> will have no problem allocating "exact" block while searchin= g forward.
> xfs_rtfind_forw(). It will allocate 49 "real-time extents", = where the 49th
> "real-time extent" is partially full. =A0(25000/512 =3D 48)<= br> >
> everything is fine for first 83 allocations, as we were able to grow t= he
> extent. Now we have 2075000 (25000*83) blocks in first extent ie 4053<= br> > "real-time extents" (where last "real-time extent"= is partially full).
>
> for 84th allocation, real-time allocator will allocate another 49
> "real-time extents" as it does not know about maximum extent= size, but we
> can not grow the extent in xfs_bmap_add_extent_unwritten_real(). =A0so= we
> insert a new extent (case BMAP_LEFT_FILLING). =A0now the new extent st= arts
> from 2075000, which is not aligned with rextsize (512 in this case).
Ok, so it's a problem with using unwritten extents and conv= erting
them. That is, the issue probably has nothing to do with the
realtime allocator at all.

Basically, when the unwritten extent occurs, we end up with a map
like this:

ext 0: =A0offset 0, length 2075000 state written
ext 1: =A0offset 2075000 length 25000 state unwritten

This will occur because you can't mix written/unwritten state in a
single extent.

What xfs_bmap_add_extent_unwritten_real() is attempting to do is
convert the unwritten extent to written state and merge it with it's siblings. In this case, 2075000 + 25000 > MAXEXTLEN, so it does not
merge them because of this check:

=A0 =A0 =A0 =A0 if ((state & BMAP_LEFT_VALID) && !(state & = BMAP_LEFT_DELAY) &&
=A0 =A0 =A0 =A0 =A0 =A0 LEFT.br_startoff + LEFT.br_blockcount =3D=3D new-&g= t;br_startoff &&
=A0 =A0 =A0 =A0 =A0 =A0 LEFT.br_startblock + LEFT.br_blockcount =3D=3D new-= >br_startblock &&
=A0 =A0 =A0 =A0 =A0 =A0 LEFT.br_state =3D=3D newext &&
>>>>>> =A0 =A0 =A0LEFT.br_blockcount + new->br_blockco= unt <=3D MAXEXTLEN)
=A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 state |=3D BMAP_LEFT_CONTIG;

Which means that BMAP_LEFT_CONTIG is not set, indicating that the no
merging with the an adjacent left extent should occur. Hence we end
up wwith this:

ext 0: =A0offset 0, length 2075000 state written
ext 1: =A0offset 2075000 length 25000 state written

That's fine for normal operation, but it means that large contiguous regions written via direct IO with non-rtextsz aligned/sized IO will
have problem this problem.

What technically should happen for these real time files is that the
LEFT extent should be shortened to be aligned, and the new extent be
lengthened and have it's startblock adjusted accordingly.

i.e. we should end up with this:

ext 0: =A0offset 0, length 2074624 state written
ext 1: =A0offset 2074624 length 25376 state written

> To fix this, I see two options,
> 1) fix real-time allocator and teach it about maximum extent size.
> 2) for real-time files, aligned new extent before inserting.

3) Fix the {BMAP_LEFT_CONTIG,MAXEXTLEN,rtextsz} handling in
xfs_bmap_add_extent_unwritten_real().

It's possible that the BMAP_RIGHT_CONTIG case also needs similar
fixing...

> In my opinion, we should not worry about either of above, as this look= s
> good method for allocation. =A0I can fix xfs_repair tool and make it a= ware of
> these conditions ("real-time extents" shared by two or more = extents).

Personally, I'd prefer that 3) is done because RT extents should<= br> always be rtextsz aligned and sized, and the bmapbt should respect
that requirement in all cases.

thanks Dave for prompt reply, I mea= nt to implement option 2 as you explained (option 3). =A0I will start worki= ng on it tomorrow. In the mean time, I also had =A0to put something in xfs_= repair for the files which already exists on the disk. Would you guys willi= ng to review/comment on that ?=A0

anand
--20cf3079bab617f6bb04ca92a687-- From raghu.prabhu13@gmail.com Wed Sep 26 01:12:46 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_DKIM_INVALID autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8Q6CkmQ165201 for ; Wed, 26 Sep 2012 01:12:46 -0500 X-ASG-Debug-ID: 1348640043-04bdf04fbe4ee10001-NocioJ Received: from mail-vb0-f53.google.com (mail-vb0-f53.google.com [209.85.212.53]) by cuda.sgi.com with ESMTP id mcf9JamOpqzVHErD (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 25 Sep 2012 23:14:03 -0700 (PDT) X-Barracuda-Envelope-From: raghu.prabhu13@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.212.53 X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.53] Received: by vbbfc21 with SMTP id fc21so256386vbb.26 for ; Tue, 25 Sep 2012 23:14:02 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.53] X-Barracuda-IPDD: Level1 [gmail.com/209.85.212.53] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=d/tlADZZOVDsBFePwF3YPfendNnLhGYT37ACTkUS98c=; b=TXCQHldx6MHupUCudHR0QEqGNUy4zP29Ua3l6q9C6yQt2WNEKdOcUMK7RmO7BoqZAT n8/OGtvriDNzjPzVwkwtipPaSgFmHvUKvXv9MySDEbtEuGtzBkR0X3o272/3fcZRFbsU 6LcDYOASBhoF9lXaxEhDL2aGf3gQxn/OqFF2KqvsHDGmmRXvbRwr1H3cirhy/N446QHl +55XRRACu87SNGQSzfFMHAma70i9Dt1D5bIV9ALD23Bn1jUcl5tuNUShTJ1rX5J3jV29 AWd3IT3aeldT2qJRTnXL3nrs2Uwd+qw0IBMw1G9ZpTD1iGs6rQG60mh2NNmZZPtf9Xar Qx5A== MIME-Version: 1.0 Received: by 10.221.11.82 with SMTP id pd18mr10325835vcb.38.1348640042870; Tue, 25 Sep 2012 23:14:02 -0700 (PDT) Received: by 10.58.248.162 with HTTP; Tue, 25 Sep 2012 23:14:02 -0700 (PDT) In-Reply-To: <20120921071644.GA20650@Archie> References: <93d9b37ce9ad720e14e2f9311e623a8e3e3139f5.1347396641.git.rprabhu@wnohang.net> <20120911232144.GH11511@dastard> <20120921071644.GA20650@Archie> Date: Wed, 26 Sep 2012 11:44:02 +0530 Message-ID: Subject: Re: Re: [PATCH 3/3] XFS: Print error when unable to allocate inodes or out of free inodes. From: Raghavendra Prabhu X-ASG-Orig-Subj: Re: Re: [PATCH 3/3] XFS: Print error when unable to allocate inodes or out of free inodes. To: Dave Chinner Cc: xfs@oss.sgi.com, Ben Myers , Alex Elder Content-Type: text/plain; charset=UTF-8 X-Barracuda-Connect: mail-vb0-f53.google.com[209.85.212.53] X-Barracuda-Start-Time: 1348640043 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109611 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature Hi, On Fri, Sep 21, 2012 at 12:46 PM, Raghavendra D Prabhu wrote: > Hi, > > >> >>> + goto out_spc; >>> + } >>> + return 0; >>> } >>> } >>> >>> +out_spc: >>> + *inop = NULLFSINO; >>> + return ENOSPC; >>> out_alloc: >>> *IO_agbp = NULL; >>> return xfs_dialloc_ag(tp, agbp, parent, inop); >> >> >> Default behaviour on a loop break is to allocate inodes, not return >> ENOSPC. >> >> BTW, there's no need to cc LKML for XFS specific patches. LKML is >> noisy enough as it is without unnecessary cross-posts.... >> >> Cheers, >> >> Dave. >> -- >> Dave Chinner >> david@fromorbit.com >> > Ignore the previous. Resending the patch with fixes mentioned. From david@fromorbit.com Wed Sep 26 01:16:35 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8Q6GZ0h165480 for ; Wed, 26 Sep 2012 01:16:35 -0500 X-ASG-Debug-ID: 1348640271-04cbb0122651ca0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id EwnAjykd1G6uB8nL for ; Tue, 25 Sep 2012 23:17:52 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqYMADedYlB5LGEv/2dsb2JhbABFhSK5LgECgQuBCYIgAQEFOhwjEAgDGC4UJQMhE4gEuhAUiwZsSoRTA5VliTuGboJ5 Received: from ppp121-44-97-47.lns20.syd6.internode.on.net (HELO dastard) ([121.44.97.47]) by ipmail04.adl6.internode.on.net with ESMTP; 26 Sep 2012 15:47:34 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TGkw8-0001xh-TJ; Wed, 26 Sep 2012 16:17:32 +1000 Date: Wed, 26 Sep 2012 16:17:32 +1000 From: Dave Chinner To: Anand Tiwari Cc: Eric Sandeen , xfs@oss.sgi.com Subject: Re: xfs_repair deleting realtime files. Message-ID: <20120926061732.GI29154@dastard> X-ASG-Orig-Subj: Re: xfs_repair deleting realtime files. References: <505BF45D.5050909@sandeen.net> <20120924075551.GF20960@dastard> <20120926024403.GH29154@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1348640271 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109611 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Sep 25, 2012 at 09:45:07PM -0600, Anand Tiwari wrote: > thanks Dave for prompt reply, I meant to implement option 2 as you > explained (option 3). I will start working on it tomorrow. In the mean > time, I also had to put something in xfs_repair for the files which > already exists on the disk. Would you guys willing to review/comment on > that ? Sure. Cheers, Dave. -- Dave Chinner david@fromorbit.com From raghu.prabhu13@gmail.com Wed Sep 26 01:55:44 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_DKIM_INVALID,T_TO_NO_BRKTS_FREEMAIL autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8Q6ti9U168140 for ; Wed, 26 Sep 2012 01:55:44 -0500 X-ASG-Debug-ID: 1348642621-04cb6c497152f70001-NocioJ Received: from mail-pa0-f53.google.com (mail-pa0-f53.google.com [209.85.220.53]) by cuda.sgi.com with ESMTP id y1oPoSwA5hY0GeDn (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 25 Sep 2012 23:57:01 -0700 (PDT) X-Barracuda-Envelope-From: raghu.prabhu13@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.220.53 X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.53] Received: by padbj3 with SMTP id bj3so305745pad.26 for ; Tue, 25 Sep 2012 23:57:01 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.53] X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.53] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:x-mailer; bh=DnKqgZ4FNDAfzzkTAlz8N/geiUALTWDwyO0hHqkpk2Q=; b=ARHIUwSpAB+Ez08zIKYwyPf6yrtYzpaUOVARjUr6EtnQ2qx3JSJDnjlFf6yQ56DBFt GqT0KWfRwv1B13PEz7/D3oTRURclPYZ9ei+6EzGM7zht4Q2NAsx4MlMbDLKKiB4UxFkY XgVsnCRFHdMwBwbP+AZ85wJ5kPQ8+qTcRqiwcy3zU+hVvMV0Chi4ItZ9NBl2lnIvejpC Zqj2hG+mulM07U9xFmRPP2RnXbcLJrEgzXjqZgZB2LrX5psfUF0PLeGzr6S6557DTL/4 Mmgve+hL4RbVMXB1j7XSEzDK795TO/6iJvAEStTiqDInqAvoNcfgoks40biDG+FvZnB6 sr1A== Received: by 10.68.131.2 with SMTP id oi2mr10595pbb.78.1348642621082; Tue, 25 Sep 2012 23:57:01 -0700 (PDT) Received: from localhost ([122.172.242.235]) by mx.google.com with ESMTPS id qd6sm1599331pbb.34.2012.09.25.23.56.58 (version=TLSv1/SSLv3 cipher=OTHER); Tue, 25 Sep 2012 23:57:00 -0700 (PDT) From: raghu.prabhu13@gmail.com To: xfs@oss.sgi.com Cc: bpm@sgi.com, elder@kernel.org, david@fromorbit.com, Raghavendra D Prabhu Subject: [PATCH v3 0/3] Print when ENOSPC due to lack of inodes. Date: Wed, 26 Sep 2012 12:26:46 +0530 X-ASG-Orig-Subj: [PATCH v3 0/3] Print when ENOSPC due to lack of inodes. Message-Id: X-Mailer: git-send-email 1.7.12.1 X-Barracuda-Connect: mail-pa0-f53.google.com[209.85.220.53] X-Barracuda-Start-Time: 1348642621 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109615 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature From: Raghavendra D Prabhu Currently, when there are no free inodes left / free space to allocate them (usually without inode64), there is no indication anywhere of this case, making it harder to diagnose this case. Hence, this series prints the causes/reasons to kernel log in a ratelimited manner, when such a situation arises. Regarding why it is printed at callee location instead at caller, it gives greater granularity in expressing the precise reason and give more details, and also some along the path are not ENOSPC (such in xfs_ialloc where ialloc_context is not NULL but ino is) along with the fact that it (xfs_ialloc) is called at multiple sites, so to avoid duplication. Version 1: Initial series. Version 2: Added ratelimited printing to xfs_message and used that. Version 3: Kept the logic intact in few places, fixed the column requirement. Raghavendra D Prabhu (3): xfs: Add ratelimited printk for different alert levels xfs: Print error when xfs_ialloc_ag_select fails to find continuous free space. xfs: Print error when unable to allocate inodes or out of free inodes. fs/xfs/xfs_ialloc.c | 31 ++++++++++++++++++++++++++++--- fs/xfs/xfs_linux.h | 1 + fs/xfs/xfs_message.h | 26 ++++++++++++++++++++++++++ 3 files changed, 55 insertions(+), 3 deletions(-) -- 1.7.12.1 From raghu.prabhu13@gmail.com Wed Sep 26 01:55:49 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,FREEMAIL_FROM, J_CHICKENPOX_43,J_CHICKENPOX_74,T_DKIM_INVALID,T_TO_NO_BRKTS_FREEMAIL autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8Q6tnAN168155 for ; Wed, 26 Sep 2012 01:55:49 -0500 X-ASG-Debug-ID: 1348642626-04cbb0122452ad0001-NocioJ Received: from mail-da0-f53.google.com (mail-da0-f53.google.com [209.85.210.53]) by cuda.sgi.com with ESMTP id SOZEaavOU5BjmjzC (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 25 Sep 2012 23:57:07 -0700 (PDT) X-Barracuda-Envelope-From: raghu.prabhu13@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.210.53 X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.53] Received: by dadg9 with SMTP id g9so108296dad.26 for ; Tue, 25 Sep 2012 23:57:06 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.53] X-Barracuda-IPDD: Level1 [gmail.com/209.85.210.53] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:x-mailer:in-reply-to:references :in-reply-to:references; bh=JCtqM55XnDLZA4/xi70omUH5cT1FzPG4uu8v+v0e6vA=; b=Y+QZelSwNftHr5jO3Y0oXoKvzV7vsjCodZmArgvTCRC43s9DPq4hFvSvWMuUoXoLWR YRMCljDx+d+WloY3qQUyivtnjmcyuuuv5537NDEP87w/2by98GcRYpLqADfGxZfyP5GE 6MPGaUP1CiRRy5R+pQNoKKyVmBREspVtD8+f5I1x7Gp3X3UnPcOWh/5dr6zmW/q6xhlY 1Db99TxrXHs8tEspfLzrdAeDodYEcNeJrgJ3D6uyqRHabyHy6nePd6H/EGX4ifda2IfW S/9qhF+CyrXYLrYi2D2KRXZ6KMiAxu/UhX+n/0Cyzqzgb/pUSJD8JwrjyErS+po2C34E nZtQ== Received: by 10.68.204.132 with SMTP id ky4mr25131432pbc.164.1348642626438; Tue, 25 Sep 2012 23:57:06 -0700 (PDT) Received: from localhost ([122.172.242.235]) by mx.google.com with ESMTPS id ih2sm1592204pbc.65.2012.09.25.23.57.03 (version=TLSv1/SSLv3 cipher=OTHER); Tue, 25 Sep 2012 23:57:05 -0700 (PDT) From: raghu.prabhu13@gmail.com To: xfs@oss.sgi.com Cc: bpm@sgi.com, elder@kernel.org, david@fromorbit.com, Raghavendra D Prabhu Subject: [PATCH v3 1/3] xfs: Add ratelimited printk for different alert levels Date: Wed, 26 Sep 2012 12:26:47 +0530 X-ASG-Orig-Subj: [PATCH v3 1/3] xfs: Add ratelimited printk for different alert levels Message-Id: X-Mailer: git-send-email 1.7.12.1 In-Reply-To: References: In-Reply-To: References: X-Barracuda-Connect: mail-da0-f53.google.com[209.85.210.53] X-Barracuda-Start-Time: 1348642626 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109615 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature From: Raghavendra D Prabhu Ratelimited printk will be useful in printing xfs messages which are otherwise not required to be printed always due to their high rate (to prevent kernel ring buffer from overflowing), while at the same time required to be printed. Signed-off-by: Raghavendra D Prabhu --- fs/xfs/xfs_linux.h | 1 + fs/xfs/xfs_message.h | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/fs/xfs/xfs_linux.h b/fs/xfs/xfs_linux.h index 828662f..49f8505 100644 --- a/fs/xfs/xfs_linux.h +++ b/fs/xfs/xfs_linux.h @@ -71,6 +71,7 @@ #include #include #include +#include #include #include diff --git a/fs/xfs/xfs_message.h b/fs/xfs/xfs_message.h index 56dc0c1..76c8198 100644 --- a/fs/xfs/xfs_message.h +++ b/fs/xfs/xfs_message.h @@ -30,6 +30,32 @@ void xfs_debug(const struct xfs_mount *mp, const char *fmt, ...) } #endif +#define xfs_printk_ratelimited(func, dev, fmt, ...) \ +do { \ + static DEFINE_RATELIMIT_STATE(_rs, \ + DEFAULT_RATELIMIT_INTERVAL, \ + DEFAULT_RATELIMIT_BURST); \ + if (__ratelimit(&_rs)) \ + func(dev, fmt, ##__VA_ARGS__); \ +} while (0) + +#define xfs_emerg_ratelimited(dev, fmt, ...) \ + xfs_printk_ratelimited(xfs_emerg, dev, fmt, ##__VA_ARGS__) +#define xfs_alert_ratelimited(dev, fmt, ...) \ + xfs_printk_ratelimited(xfs_alert, dev, fmt, ##__VA_ARGS__) +#define xfs_crit_ratelimited(dev, fmt, ...) \ + xfs_printk_ratelimited(xfs_crit, dev, fmt, ##__VA_ARGS__) +#define xfs_err_ratelimited(dev, fmt, ...) \ + xfs_printk_ratelimited(xfs_err, dev, fmt, ##__VA_ARGS__) +#define xfs_warn_ratelimited(dev, fmt, ...) \ + xfs_printk_ratelimited(xfs_warn, dev, fmt, ##__VA_ARGS__) +#define xfs_notice_ratelimited(dev, fmt, ...) \ + xfs_printk_ratelimited(xfs_notice, dev, fmt, ##__VA_ARGS__) +#define xfs_info_ratelimited(dev, fmt, ...) \ + xfs_printk_ratelimited(xfs_info, dev, fmt, ##__VA_ARGS__) +#define xfs_debug_ratelimited(dev, fmt, ...) \ + xfs_printk_ratelimited(xfs_debug, dev, fmt, ##__VA_ARGS__) + extern void assfail(char *expr, char *f, int l); extern void xfs_hex_dump(void *p, int length); -- 1.7.12.1 From raghu.prabhu13@gmail.com Wed Sep 26 01:55:55 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_DKIM_INVALID,T_TO_NO_BRKTS_FREEMAIL autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8Q6ttSm168165 for ; Wed, 26 Sep 2012 01:55:55 -0500 X-ASG-Debug-ID: 1348642632-04cb6c497352f90001-NocioJ Received: from mail-pb0-f53.google.com (mail-pb0-f53.google.com [209.85.160.53]) by cuda.sgi.com with ESMTP id IGFmqEZp8cbI8VvL (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 25 Sep 2012 23:57:12 -0700 (PDT) X-Barracuda-Envelope-From: raghu.prabhu13@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.160.53 X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.53] Received: by pbcwz12 with SMTP id wz12so1807693pbc.26 for ; Tue, 25 Sep 2012 23:57:12 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.53] X-Barracuda-IPDD: Level1 [gmail.com/209.85.160.53] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:x-mailer:in-reply-to:references :in-reply-to:references; bh=9Cr4rXxS/ZoLvlOXdLSvUOsq1yrwpHP93T6suho+JDM=; b=mG5guJEagfz+C9hNS+9PElkUO9VeiNFJTAlodoEv0uXB4PQCvan0oTXanjNZeC5kQq CZqLGwhdTI8qo3IwpIOpOBo/kb+hBJ2YqDqlQ0LEOLC+NQ2COLe6GCXd6ePx9mby+hWt NGU0iffjWt/bSiASN5rWaeVlL3cDd7gHmuSmvRY8Xi+G44BmC3JM71L9MsfcykEJ1rxf oNKFe23nK0XjK95i4zkUzx9RR6X86ub3nzQZLCTPXe2L0JqTT9SVoQxQwwJd8lhjIgFE 2hKZoBKlHRC6VsyVyhudenMVDZfZKv13Kw/q9R9/BP3KW3kSFXCNVCJck1WuTvG7IZd5 lIuQ== Received: by 10.68.197.104 with SMTP id it8mr52948625pbc.167.1348642631977; Tue, 25 Sep 2012 23:57:11 -0700 (PDT) Received: from localhost ([122.172.242.235]) by mx.google.com with ESMTPS id bn1sm1452502pab.8.2012.09.25.23.57.09 (version=TLSv1/SSLv3 cipher=OTHER); Tue, 25 Sep 2012 23:57:11 -0700 (PDT) From: raghu.prabhu13@gmail.com To: xfs@oss.sgi.com Cc: bpm@sgi.com, elder@kernel.org, david@fromorbit.com, Raghavendra D Prabhu Subject: [PATCH v3 2/3] xfs: Print error when xfs_ialloc_ag_select fails to find continuous free space. Date: Wed, 26 Sep 2012 12:26:48 +0530 X-ASG-Orig-Subj: [PATCH v3 2/3] xfs: Print error when xfs_ialloc_ag_select fails to find continuous free space. Message-Id: <9acdfb22ee7a1fbf777f866182d01009a3bea879.1348641483.git.rprabhu@wnohang.net> X-Mailer: git-send-email 1.7.12.1 In-Reply-To: References: In-Reply-To: References: X-Barracuda-Connect: mail-pb0-f53.google.com[209.85.160.53] X-Barracuda-Start-Time: 1348642632 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 2.60 X-Barracuda-Spam-Status: No, SCORE=2.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_MV0249, DKIM_SIGNED, DKIM_VERIFIED, MARKETING_SUBJECT, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109615 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name 0.60 MARKETING_SUBJECT Subject contains popular marketing words -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 2.00 BSF_SC0_MV0249 Custom rule MV0249 From: Raghavendra D Prabhu When xfs_ialloc_ag_select fails to find any AG with continuous free blocks required for inode allocation, printk the error in ratelimited manner. Signed-off-by: Raghavendra D Prabhu --- fs/xfs/xfs_ialloc.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c index 5aceb3f..e75a39d 100644 --- a/fs/xfs/xfs_ialloc.c +++ b/fs/xfs/xfs_ialloc.c @@ -539,8 +539,11 @@ nextag: if (agno >= agcount) agno = 0; if (agno == pagno) { - if (flags == 0) + if (flags == 0) { + xfs_err_ratelimited(mp, + "Out of continuous free blocks for inode allocation"); return NULLAGNUMBER; + } flags = 0; } } -- 1.7.12.1 From raghu.prabhu13@gmail.com Wed Sep 26 01:56:00 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_DKIM_INVALID,T_TO_NO_BRKTS_FREEMAIL autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8Q6txlD168193 for ; Wed, 26 Sep 2012 01:55:59 -0500 X-ASG-Debug-ID: 1348642621-04cb6c497152f70002-NocioJ Received: from mail-pa0-f53.google.com (mail-pa0-f53.google.com [209.85.220.53]) by cuda.sgi.com with ESMTP id MYCe4sbc0iFCzGOE (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Tue, 25 Sep 2012 23:57:17 -0700 (PDT) X-Barracuda-Envelope-From: raghu.prabhu13@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.220.53 X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.53] Received: by mail-pa0-f53.google.com with SMTP id bj3so305745pad.26 for ; Tue, 25 Sep 2012 23:57:17 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.53] X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.53] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:x-mailer:in-reply-to:references :in-reply-to:references; bh=Z2zI3elp/fqupw1W50gk3rHOguDjAYwZawSNAB9XDI4=; b=Po3CYEluD4+naqqUBygJtB5N32o93aGqrDTVQHV7JU1BBFB80TO4vg+Si001zybQY4 uCh9mBlX1uuVlnfnv0KOAW6biWvjbc8KvzyI9wtpLQQ082EdIgO/7U+sT/ssVfKFYB7R Q+p9MZppYf95i6Yrg31OrDgZS+x1GmlYL+z7SzQOGS426ibgEPbKqrnBAmDn2BSfenio miwb19oeUYoiKXDS0J6xGrNKOLVUJbXc+f34RtQWHy7x21ewS29/Xd8EV16lEUfLqzFC 36sMc0USO6DHQfIp23a1BGq4xku61kkkMXnl4G0Vuj6xPNEN+1Q9aztzeOnX6fMVHnkz +D9g== Received: by 10.68.131.5 with SMTP id oi5mr92130pbb.56.1348642637446; Tue, 25 Sep 2012 23:57:17 -0700 (PDT) Received: from localhost ([122.172.242.235]) by mx.google.com with ESMTPS id uz3sm1603929pbc.19.2012.09.25.23.57.14 (version=TLSv1/SSLv3 cipher=OTHER); Tue, 25 Sep 2012 23:57:16 -0700 (PDT) From: raghu.prabhu13@gmail.com To: xfs@oss.sgi.com Cc: bpm@sgi.com, elder@kernel.org, david@fromorbit.com, Raghavendra D Prabhu Subject: [PATCH v3 3/3] xfs: Print error when unable to allocate inodes or out of free inodes. Date: Wed, 26 Sep 2012 12:26:49 +0530 X-ASG-Orig-Subj: [PATCH v3 3/3] xfs: Print error when unable to allocate inodes or out of free inodes. Message-Id: X-Mailer: git-send-email 1.7.12.1 In-Reply-To: References: In-Reply-To: References: X-Barracuda-Connect: mail-pa0-f53.google.com[209.85.220.53] X-Barracuda-Start-Time: 1348642622 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, MARKETING_SUBJECT, NO_REAL_NAME X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109615 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name 0.60 MARKETING_SUBJECT Subject contains popular marketing words -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature From: Raghavendra D Prabhu When xfs_dialloc is unable to allocate required number of inodes due to global ceiling, or AGs are out of free inodes but not allowed to allocate inodes or unable to allocate without continguous free space, printk the error in ratelimited manner. Signed-off-by: Raghavendra D Prabhu --- fs/xfs/xfs_ialloc.c | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c index e75a39d..e9f911b2 100644 --- a/fs/xfs/xfs_ialloc.c +++ b/fs/xfs/xfs_ialloc.c @@ -991,7 +991,7 @@ xfs_dialloc( xfs_perag_put(pag); *inop = NULLFSINO; - return 0; + goto out_spc; } if (ialloced) { @@ -1017,7 +1017,7 @@ nextag: agno = 0; if (agno == start_agno) { *inop = NULLFSINO; - return noroom ? ENOSPC : 0; + goto out_spc; } } @@ -1027,6 +1027,28 @@ out_alloc: out_error: xfs_perag_put(pag); return XFS_ERROR(error); +out_spc: + if (noroom) { + xfs_err_ratelimited(mp, "Hit global inode ceiling:"); + error = ENOSPC; + } else if (!okalloc) { + /* + * implies noroom=0 && (!pag->pagi_freecount && !okalloc) for + * all pag + */ + xfs_err_ratelimited(mp, + "No AGs with free inodes and allocation not allowed:"); + error = 0; + } else { + xfs_err_ratelimited(mp, + "Unable to allocate continguous space for inodes:"); + error = 0; + } + + xfs_err_ratelimited(mp, "Required %d, Current %llu, Maximum %llu", + XFS_IALLOC_INODES(mp), mp->m_sb.sb_icount, mp->m_maxicount); + return error; + } /* -- 1.7.12.1 From BATV+f7d162493c23b1d2d2c8+3321+infradead.org+hch@bombadil.srs.infradead.org Wed Sep 26 04:14:39 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8Q9EcJL182807 for ; Wed, 26 Sep 2012 04:14:39 -0500 X-ASG-Debug-ID: 1348650955-04cbb01224564a0001-NocioJ Received: from bombadil.infradead.org (173-166-109-252-newengland.hfc.comcastbusiness.net [173.166.109.252]) by cuda.sgi.com with ESMTP id mOXtAKNX874XbBHo (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO); Wed, 26 Sep 2012 02:15:55 -0700 (PDT) X-Barracuda-Envelope-From: BATV+f7d162493c23b1d2d2c8+3321+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 173.166.109.252 Received: from hch by bombadil.infradead.org with local (Exim 4.76 #1 (Red Hat Linux)) id 1TGnik-0005mJ-Gk; Wed, 26 Sep 2012 09:15:54 +0000 Date: Wed, 26 Sep 2012 05:15:54 -0400 From: Christoph Hellwig To: Ben Myers Cc: xfs@oss.sgi.com Subject: Re: userspace releases? Message-ID: <20120926091554.GA13559@infradead.org> X-ASG-Orig-Subj: Re: userspace releases? References: <20120925095002.GA26583@infradead.org> <20120925194355.GK1140@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20120925194355.GK1140@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: 173-166-109-252-newengland.hfc.comcastbusiness.net[173.166.109.252] X-Barracuda-Start-Time: 1348650955 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109623 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS On Tue, Sep 25, 2012 at 02:43:55PM -0500, Ben Myers wrote: > Hey Christoph, > > On Tue, Sep 25, 2012 at 05:50:02AM -0400, Christoph Hellwig wrote: > > It's been 6 month since the last releases, and we've acquired a fair > > amount of fixes in xfsprogs. I think it's time to put out another > > release soon. > > Seems like a good idea to me. How would you prefer to define 'soon'? Given the expected rush with the 3.7 merge window I'm perfectly fine doing it just after that, say mid-October. From tinguely@sgi.com Wed Sep 26 09:13:04 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8QED4VE214576 for ; Wed, 26 Sep 2012 09:13:04 -0500 Received: from [128.162.232.125] (eagdhcp-232-125.americas.sgi.com [128.162.232.125]) by relay2.corp.sgi.com (Postfix) with ESMTP id F1BAC304053; Wed, 26 Sep 2012 07:14:19 -0700 (PDT) Message-ID: <50630DB6.4070405@sgi.com> Date: Wed, 26 Sep 2012 09:14:14 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: bpm@sgi.com, xfs@oss.sgi.com Subject: Re: [PATCH 0/3] xfs: allocation worker causes freelist buffer lock hang References: <20120924171159.GG1140@sgi.com> <201209241809.q8OI94s3003323@eagdhcp-232-125.americas.sgi.com> <20120925005632.GB23520@dastard> <5061CA48.3040202@sgi.com> <20120925220110.GF29154@dastard> In-Reply-To: <20120925220110.GF29154@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/25/12 17:01, Dave Chinner wrote: > On Tue, Sep 25, 2012 at 10:14:16AM -0500, Mark Tinguely wrote: >>>> >>>> As a bonus, consolidating the loops into one worker actually gives a slight >>>> performance advantage. >>> >>> Can you quantify it? >> >> I was comparing the bonnie and iozone benchmarks outputs. I will see >> if someone can enlighten me on how to quantify those numbers. > > Ugh. > > Don't bother. Those are two of the worst offenders in the "useless > benchmarks for regression testing" category. Yeah, they *look* like > they give decent numbers, but I've wasted so much time looking at > results from these benhmarks only to find they do basic things wrong > and give numbers that vary simple because you've made a change that > increases or decreases the CPU cache footprint of a code path. > > e.g. IOZone uses the same memory buffer as the source/destination of > all it's IO, and does not touch the contents of it at all. Hence for > small IO, the buffer stays resident in the CPU caches and gives > unrealsitically high throughput results. Worse is the fact that CPU > cache residency of the buffer can change according to the kernel > code path taken, so you can get massive changes in throughput just > by changing the layout of the code without changing any logic.... > > IOZone can be useful if you know exactly what you are doing and > using it to test a specific code path with a specific set of > configurations. e.g. comparing ext3/4/xfs/btrfs on the same kernel > and storage is fine. However, the moment you start using it to > compare different kernels, it's a total crap shoot.... does anyone have a good benchmark XFS should use to share performance results? A number that we can agree a series does not degrade the filesystem.. lies, damn lies, statistics and then filesystem benchmarks?! :) > I guess I don't understand what you mean by "loop on > xfs_alloc_vextent()" then. > > The problem I see above is this: > > thread 1 worker 1 worker 2..max > xfs_bmapi_write(userdata) loops here calling xfs_bmapi_alloc() > xfs_bmapi_allocate(user) > xfs_alloc_vextent(user) > wait > > _xfs_alloc_vextent() > locks AGF first loop it takes the lock one of the next times through the above loop it cannot get a worker. deadlock here. I saved the xfs_bmalloca and fs_alloc_arg when allocating a buffer to verify the paths. > _xfs_alloc_vextent() > blocks on AGF lock > completes allocation > > > xfs_bmap_add_extent_hole_real > xfs_bmap_extents_to_btree > xfs_alloc_vextent(user) > wait this does not need a worker, and since in the same transaction all locks to the AGF buffer are recursive locks. no wait here. > > --Mark. From bpm@sgi.com Wed Sep 26 10:18:08 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8QFI8BJ219032 for ; Wed, 26 Sep 2012 10:18:08 -0500 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay3.corp.sgi.com (Postfix) with ESMTP id BD165AC001; Wed, 26 Sep 2012 08:19:23 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 343664266DC; Wed, 26 Sep 2012 10:19:23 -0500 (CDT) Date: Wed, 26 Sep 2012 10:19:23 -0500 From: Ben Myers To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v3 0/8] speculative preallocation inode tracking Message-ID: <20120926151923.GB13214@sgi.com> References: <1347625195-6369-1-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1347625195-6369-1-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.20 (2009-06-14) Hi Brian, On Fri, Sep 14, 2012 at 08:19:47AM -0400, Brian Foster wrote: > This is v3 of the speculative preallocation inode tracking patchset. This > functionality tracks inodes with post-EOF speculative preallocation for the > purpose of background and on-demand trimming. > > Background scanning occurs on a longish interval (5 minutes by default) and in > a best-effort mode (i.e., inodes are skipped due to lock contention or dirty > cache). The intent is to clear up post-EOF blocks on inodes that might have > allocations hanging around due to open-write-close sequences (NFS). > > On demand scanning is provided via a new ioctl and supports various parameters > such as scan mode, filtering by quota id and minimum file size. A pending use > case for on demand scanning is for accurate quota accounting via the gluster > scale out filesystem (i.e., to free up preallocated space when near a usage > limit). [33084.794491] XFS (sda2): Ending clean mount [33170.400045] XFS: Assertion failed: !atomic_read(&VFS_I(ip)->i_count) || xfs_isilocked(ip, XFS_IOLOCK_EXCL), file: /root/xfs/fs/xfs/xfs_inode.c, line: 1128 [33170.41422[ 0.000000] Initializing cgroup subsys cpuset [ 0.000000] Initializing cgroup subsys cpu [ 0.000000] Linux version 3.6.0-rc1-1.2-desktop+ (root@nfs7) (gcc version 4.6.2 (SUSE Linux) ) #26 SMP PREEMPT Fri Sep 21 18:26:16 CDT 2012 [ 0.000000] e820: BIOS-provided physical RAM map: [ 0.000000] BIOS-e820: [mem 0x0000000000000100-0x000000000009fbff] usable crash> bt PID: 1289 TASK: f38d71d0 CPU: 1 COMMAND: "kworker/1:2" #0 [f17c9b88] crash_kexec at c0295045 #1 [f17c9be0] oops_end at c06ab2f2 #2 [f17c9bf8] die at c020539a #3 [f17c9c10] do_trap at c06aadc1 #4 [f17c9c28] do_invalid_op at c0202eb1 #5 [f17c9cc4] error_code (via invalid_op) at c06aab7c EAX: 0000008e EBX: ec3d9400 ECX: 0000071e EDX: 00000046 EBP: f17c9d18 DS: 007b ESI: ec3d9400 ES: 007b EDI: ef973d00 GS: 2e30 CS: 0060 EIP: f9d1dbb6 ERR: ffffffff EFLAGS: 00010292 #6 [f17c9cf8] assfail at f9d1dbb6 [xfs] #7 [f17c9d1c] xfs_itruncate_extents at f9d6335f [xfs] #8 [f17c9d98] xfs_free_eofblocks at f9d237d9 [xfs] #9 [f17c9df8] xfs_inode_free_eofblocks at f9d221b4 [xfs] #10 [f17c9e14] xfs_inode_ag_walk at f9d20ab9 [xfs] #11 [f17c9ee4] xfs_inode_ag_iterator_tag at f9d20d6b [xfs] #12 [f17c9f18] xfs_inodes_free_eofblocks at f9d21c95 [xfs] #13 [f17c9f34] xfs_eofblocks_worker at f9d21cc3 [xfs] #14 [f17c9f40] process_one_work at c0251ea5 #15 [f17c9f84] worker_thread at c0252504 #16 [f17c9fbc] kthread at c025672b #17 [f17c9fe8] kernel_thread_helper at c06b06f4 It seems that test 133 was running at the time of the crash in two cases. This is a neat patch set but we need to resolve this before pulling it in. Regards, Ben From bpm@sgi.com Wed Sep 26 10:37:57 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8QFbvlN220549 for ; Wed, 26 Sep 2012 10:37:57 -0500 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay2.corp.sgi.com (Postfix) with ESMTP id 2ACB0304062; Wed, 26 Sep 2012 08:39:13 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 0B2BB4266DC; Wed, 26 Sep 2012 10:39:13 -0500 (CDT) Date: Wed, 26 Sep 2012 10:39:13 -0500 From: Ben Myers To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v3 0/8] speculative preallocation inode tracking Message-ID: <20120926153912.GC13214@sgi.com> References: <1347625195-6369-1-git-send-email-bfoster@redhat.com> <20120926151923.GB13214@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20120926151923.GB13214@sgi.com> User-Agent: Mutt/1.5.20 (2009-06-14) Hey Brian, On Wed, Sep 26, 2012 at 10:19:23AM -0500, Ben Myers wrote: > On Fri, Sep 14, 2012 at 08:19:47AM -0400, Brian Foster wrote: > > This is v3 of the speculative preallocation inode tracking patchset. This > > functionality tracks inodes with post-EOF speculative preallocation for the > > purpose of background and on-demand trimming. > > > > Background scanning occurs on a longish interval (5 minutes by default) and in > > a best-effort mode (i.e., inodes are skipped due to lock contention or dirty > > cache). The intent is to clear up post-EOF blocks on inodes that might have > > allocations hanging around due to open-write-close sequences (NFS). > > > > On demand scanning is provided via a new ioctl and supports various parameters > > such as scan mode, filtering by quota id and minimum file size. A pending use > > case for on demand scanning is for accurate quota accounting via the gluster > > scale out filesystem (i.e., to free up preallocated space when near a usage > > limit). Maybe it would help if I would give you some context! I was running your patch set along side with the inode64 related patch set from Carlos on an i386 box and hit this assert on two subsequent test runs... both happened to be in test 133 at the time of the crash. Regards, Ben > [33084.794491] XFS (sda2): Ending clean mount > [33170.400045] XFS: Assertion failed: !atomic_read(&VFS_I(ip)->i_count) || xfs_isilocked(ip, XFS_IOLOCK_EXCL), file: /root/xfs/fs/xfs/xfs_inode.c, line: 1128 > [33170.41422[ 0.000000] Initializing cgroup subsys cpuset > [ 0.000000] Initializing cgroup subsys cpu > [ 0.000000] Linux version 3.6.0-rc1-1.2-desktop+ (root@nfs7) (gcc version 4.6.2 (SUSE Linux) ) #26 SMP PREEMPT Fri Sep 21 18:26:16 CDT 2012 > [ 0.000000] e820: BIOS-provided physical RAM map: > [ 0.000000] BIOS-e820: [mem 0x0000000000000100-0x000000000009fbff] usable > > crash> bt > PID: 1289 TASK: f38d71d0 CPU: 1 COMMAND: "kworker/1:2" > #0 [f17c9b88] crash_kexec at c0295045 > #1 [f17c9be0] oops_end at c06ab2f2 > #2 [f17c9bf8] die at c020539a > #3 [f17c9c10] do_trap at c06aadc1 > #4 [f17c9c28] do_invalid_op at c0202eb1 > #5 [f17c9cc4] error_code (via invalid_op) at c06aab7c > EAX: 0000008e EBX: ec3d9400 ECX: 0000071e EDX: 00000046 EBP: f17c9d18 > DS: 007b ESI: ec3d9400 ES: 007b EDI: ef973d00 GS: 2e30 > CS: 0060 EIP: f9d1dbb6 ERR: ffffffff EFLAGS: 00010292 > #6 [f17c9cf8] assfail at f9d1dbb6 [xfs] > #7 [f17c9d1c] xfs_itruncate_extents at f9d6335f [xfs] > #8 [f17c9d98] xfs_free_eofblocks at f9d237d9 [xfs] > #9 [f17c9df8] xfs_inode_free_eofblocks at f9d221b4 [xfs] > #10 [f17c9e14] xfs_inode_ag_walk at f9d20ab9 [xfs] > #11 [f17c9ee4] xfs_inode_ag_iterator_tag at f9d20d6b [xfs] > #12 [f17c9f18] xfs_inodes_free_eofblocks at f9d21c95 [xfs] > #13 [f17c9f34] xfs_eofblocks_worker at f9d21cc3 [xfs] > #14 [f17c9f40] process_one_work at c0251ea5 > #15 [f17c9f84] worker_thread at c0252504 > #16 [f17c9fbc] kthread at c025672b > #17 [f17c9fe8] kernel_thread_helper at c06b06f4 > > It seems that test 133 was running at the time of the crash in two cases. This > is a neat patch set but we need to resolve this before pulling it in. > > Regards, > Ben > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Wed Sep 26 10:42:07 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8QFg7wn220911 for ; Wed, 26 Sep 2012 10:42:07 -0500 X-ASG-Debug-ID: 1348674205-04bdf04fbe65aa0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id goZMW5SDVpH8w1tW; Wed, 26 Sep 2012 08:43:25 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8QFhOSR010026 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 26 Sep 2012 11:43:24 -0400 Received: from bfoster.bfoster ([10.16.225.83]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q8QFhNRo009930; Wed, 26 Sep 2012 11:43:24 -0400 Message-ID: <50632302.2070406@redhat.com> Date: Wed, 26 Sep 2012 11:45:06 -0400 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:15.0) Gecko/20120827 Thunderbird/15.0 MIME-Version: 1.0 To: Ben Myers CC: xfs@oss.sgi.com Subject: Re: [PATCH v3 0/8] speculative preallocation inode tracking References: <1347625195-6369-1-git-send-email-bfoster@redhat.com> <20120926151923.GB13214@sgi.com> X-ASG-Orig-Subj: Re: [PATCH v3 0/8] speculative preallocation inode tracking In-Reply-To: <20120926151923.GB13214@sgi.com> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1348674205 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com On 09/26/2012 11:19 AM, Ben Myers wrote: > Hi Brian, > > On Fri, Sep 14, 2012 at 08:19:47AM -0400, Brian Foster wrote: >> This is v3 of the speculative preallocation inode tracking patchset. This >> functionality tracks inodes with post-EOF speculative preallocation for the >> purpose of background and on-demand trimming. >> >> Background scanning occurs on a longish interval (5 minutes by default) and in >> a best-effort mode (i.e., inodes are skipped due to lock contention or dirty >> cache). The intent is to clear up post-EOF blocks on inodes that might have >> allocations hanging around due to open-write-close sequences (NFS). >> >> On demand scanning is provided via a new ioctl and supports various parameters >> such as scan mode, filtering by quota id and minimum file size. A pending use >> case for on demand scanning is for accurate quota accounting via the gluster >> scale out filesystem (i.e., to free up preallocated space when near a usage >> limit). > > [33084.794491] XFS (sda2): Ending clean mount > [33170.400045] XFS: Assertion failed: !atomic_read(&VFS_I(ip)->i_count) || xfs_isilocked(ip, XFS_IOLOCK_EXCL), file: /root/xfs/fs/xfs/xfs_inode.c, line: 1128 > [33170.41422[ 0.000000] Initializing cgroup subsys cpuset > [ 0.000000] Initializing cgroup subsys cpu > [ 0.000000] Linux version 3.6.0-rc1-1.2-desktop+ (root@nfs7) (gcc version 4.6.2 (SUSE Linux) ) #26 SMP PREEMPT Fri Sep 21 18:26:16 CDT 2012 > [ 0.000000] e820: BIOS-provided physical RAM map: > [ 0.000000] BIOS-e820: [mem 0x0000000000000100-0x000000000009fbff] usable > > crash> bt > PID: 1289 TASK: f38d71d0 CPU: 1 COMMAND: "kworker/1:2" > #0 [f17c9b88] crash_kexec at c0295045 > #1 [f17c9be0] oops_end at c06ab2f2 > #2 [f17c9bf8] die at c020539a > #3 [f17c9c10] do_trap at c06aadc1 > #4 [f17c9c28] do_invalid_op at c0202eb1 > #5 [f17c9cc4] error_code (via invalid_op) at c06aab7c > EAX: 0000008e EBX: ec3d9400 ECX: 0000071e EDX: 00000046 EBP: f17c9d18 > DS: 007b ESI: ec3d9400 ES: 007b EDI: ef973d00 GS: 2e30 > CS: 0060 EIP: f9d1dbb6 ERR: ffffffff EFLAGS: 00010292 > #6 [f17c9cf8] assfail at f9d1dbb6 [xfs] > #7 [f17c9d1c] xfs_itruncate_extents at f9d6335f [xfs] > #8 [f17c9d98] xfs_free_eofblocks at f9d237d9 [xfs] > #9 [f17c9df8] xfs_inode_free_eofblocks at f9d221b4 [xfs] > #10 [f17c9e14] xfs_inode_ag_walk at f9d20ab9 [xfs] > #11 [f17c9ee4] xfs_inode_ag_iterator_tag at f9d20d6b [xfs] > #12 [f17c9f18] xfs_inodes_free_eofblocks at f9d21c95 [xfs] > #13 [f17c9f34] xfs_eofblocks_worker at f9d21cc3 [xfs] > #14 [f17c9f40] process_one_work at c0251ea5 > #15 [f17c9f84] worker_thread at c0252504 > #16 [f17c9fbc] kthread at c025672b > #17 [f17c9fe8] kernel_thread_helper at c06b06f4 > > It seems that test 133 was running at the time of the crash in two cases. This > is a neat patch set but we need to resolve this before pulling it in. > Indeed. It looks like I botched the need_iolock parameter to xfs_free_eofblocks() when I migrated to rely on EAGAIN rather than a blocking lock. Thanks for the report. I'm surprised I didn't reproduce this. I will try and do so before I submit an updated set so I can verify a fix. Was this a repeated 133 test or full xfstests run? Thanks again. Brian > Regards, > Ben > From bpm@sgi.com Wed Sep 26 10:50:39 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8QFodBN221563 for ; Wed, 26 Sep 2012 10:50:39 -0500 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay3.corp.sgi.com (Postfix) with ESMTP id 715F1AC001; Wed, 26 Sep 2012 08:51:57 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 13A154266DC; Wed, 26 Sep 2012 10:51:57 -0500 (CDT) Date: Wed, 26 Sep 2012 10:51:57 -0500 From: Ben Myers To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v3 0/8] speculative preallocation inode tracking Message-ID: <20120926155157.GS25175@sgi.com> References: <1347625195-6369-1-git-send-email-bfoster@redhat.com> <20120926151923.GB13214@sgi.com> <50632302.2070406@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50632302.2070406@redhat.com> User-Agent: Mutt/1.5.20 (2009-06-14) Hey Brian, On Wed, Sep 26, 2012 at 11:45:06AM -0400, Brian Foster wrote: > On 09/26/2012 11:19 AM, Ben Myers wrote: > > On Fri, Sep 14, 2012 at 08:19:47AM -0400, Brian Foster wrote: > >> This is v3 of the speculative preallocation inode tracking patchset. This > >> functionality tracks inodes with post-EOF speculative preallocation for the > >> purpose of background and on-demand trimming. > >> > >> Background scanning occurs on a longish interval (5 minutes by default) and in > >> a best-effort mode (i.e., inodes are skipped due to lock contention or dirty > >> cache). The intent is to clear up post-EOF blocks on inodes that might have > >> allocations hanging around due to open-write-close sequences (NFS). > >> > >> On demand scanning is provided via a new ioctl and supports various parameters > >> such as scan mode, filtering by quota id and minimum file size. A pending use > >> case for on demand scanning is for accurate quota accounting via the gluster > >> scale out filesystem (i.e., to free up preallocated space when near a usage > >> limit). > > > > [33084.794491] XFS (sda2): Ending clean mount > > [33170.400045] XFS: Assertion failed: !atomic_read(&VFS_I(ip)->i_count) || xfs_isilocked(ip, XFS_IOLOCK_EXCL), file: /root/xfs/fs/xfs/xfs_inode.c, line: 1128 > > [33170.41422[ 0.000000] Initializing cgroup subsys cpuset > > [ 0.000000] Initializing cgroup subsys cpu > > [ 0.000000] Linux version 3.6.0-rc1-1.2-desktop+ (root@nfs7) (gcc version 4.6.2 (SUSE Linux) ) #26 SMP PREEMPT Fri Sep 21 18:26:16 CDT 2012 > > [ 0.000000] e820: BIOS-provided physical RAM map: > > [ 0.000000] BIOS-e820: [mem 0x0000000000000100-0x000000000009fbff] usable > > > > crash> bt > > PID: 1289 TASK: f38d71d0 CPU: 1 COMMAND: "kworker/1:2" > > #0 [f17c9b88] crash_kexec at c0295045 > > #1 [f17c9be0] oops_end at c06ab2f2 > > #2 [f17c9bf8] die at c020539a > > #3 [f17c9c10] do_trap at c06aadc1 > > #4 [f17c9c28] do_invalid_op at c0202eb1 > > #5 [f17c9cc4] error_code (via invalid_op) at c06aab7c > > EAX: 0000008e EBX: ec3d9400 ECX: 0000071e EDX: 00000046 EBP: f17c9d18 > > DS: 007b ESI: ec3d9400 ES: 007b EDI: ef973d00 GS: 2e30 > > CS: 0060 EIP: f9d1dbb6 ERR: ffffffff EFLAGS: 00010292 > > #6 [f17c9cf8] assfail at f9d1dbb6 [xfs] > > #7 [f17c9d1c] xfs_itruncate_extents at f9d6335f [xfs] > > #8 [f17c9d98] xfs_free_eofblocks at f9d237d9 [xfs] > > #9 [f17c9df8] xfs_inode_free_eofblocks at f9d221b4 [xfs] > > #10 [f17c9e14] xfs_inode_ag_walk at f9d20ab9 [xfs] > > #11 [f17c9ee4] xfs_inode_ag_iterator_tag at f9d20d6b [xfs] > > #12 [f17c9f18] xfs_inodes_free_eofblocks at f9d21c95 [xfs] > > #13 [f17c9f34] xfs_eofblocks_worker at f9d21cc3 [xfs] > > #14 [f17c9f40] process_one_work at c0251ea5 > > #15 [f17c9f84] worker_thread at c0252504 > > #16 [f17c9fbc] kthread at c025672b > > #17 [f17c9fe8] kernel_thread_helper at c06b06f4 > > > > It seems that test 133 was running at the time of the crash in two cases. This > > is a neat patch set but we need to resolve this before pulling it in. > > > > Indeed. It looks like I botched the need_iolock parameter to > xfs_free_eofblocks() when I migrated to rely on EAGAIN rather than a > blocking lock. Thanks for the report. > > I'm surprised I didn't reproduce this. I will try and do so before I > submit an updated set so I can verify a fix. Was this a repeated 133 > test or full xfstests run? Thanks again. NP. This is what I was running: while true do ./check -g auto done -Ben From tinguely@sgi.com Wed Sep 26 13:11:10 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8QIBAF9236080 for ; Wed, 26 Sep 2012 13:11:10 -0500 Received: from [128.162.232.125] (eagdhcp-232-125.americas.sgi.com [128.162.232.125]) by relay1.corp.sgi.com (Postfix) with ESMTP id B49D28F8040; Wed, 26 Sep 2012 11:12:26 -0700 (PDT) Message-ID: <50634585.3030400@sgi.com> Date: Wed, 26 Sep 2012 13:12:21 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Carlos Maiolino CC: xfs@oss.sgi.com Subject: Re: [PATCH] mkfs: Set a clean output in case of invalid inode size References: <1334609816-8473-1-git-send-email-cmaiolino@redhat.com> In-Reply-To: <1334609816-8473-1-git-send-email-cmaiolino@redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 04/16/12 15:56, Carlos Maiolino wrote: > Remove an unnecessary usage() call after a mkfs failure due an invalid inode > size. > A call to usage() at this point confuses the output message which may cause the > user to think it used wrong arguments to mkfs, instead of an invalid inode size. > > Signed-off-by: Carlos Maiolino > --- Found that this patch was reviewed but not committed. Committed to git://oss.sgi.com/xfs/cmds/xfsprogs.git, master branch. --Mark. From tinguely@sgi.com Wed Sep 26 15:17:42 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8QKHg3C249572 for ; Wed, 26 Sep 2012 15:17:42 -0500 Received: from [128.162.232.125] (eagdhcp-232-125.americas.sgi.com [128.162.232.125]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7D8098F8054; Wed, 26 Sep 2012 13:18:58 -0700 (PDT) Message-ID: <5063632C.70905@sgi.com> Date: Wed, 26 Sep 2012 15:18:52 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Carlos Maiolino CC: xfs@oss.sgi.com Subject: Re: [PATCH V4] Make inode64 a remountable option References: <1345238378-10123-1-git-send-email-cmaiolino@redhat.com> In-Reply-To: <1345238378-10123-1-git-send-email-cmaiolino@redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 08/17/12 16:19, Carlos Maiolino wrote: > Actually, there is no reason about why a user must umount and mount a XFS > filesystem to enable 'inode64' option. So, this patch makes this a remountable > option. > > Signed-off-by: Carlos Maiolino > --- Looks good. Reviewed-by: Mark Tinguely From tinguely@sgi.com Wed Sep 26 15:18:40 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8QKIeW9249616 for ; Wed, 26 Sep 2012 15:18:40 -0500 Received: from [128.162.232.125] (eagdhcp-232-125.americas.sgi.com [128.162.232.125]) by relay1.corp.sgi.com (Postfix) with ESMTP id E7EF28F8040; Wed, 26 Sep 2012 13:19:58 -0700 (PDT) Message-ID: <50636369.4010402@sgi.com> Date: Wed, 26 Sep 2012 15:19:53 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Carlos Maiolino CC: xfs@oss.sgi.com Subject: Re: [PATCH 1/6] xfs: Fix m_agirotor reset during AG selection References: <1348147961-7520-1-git-send-email-cmaiolino@redhat.com> <1348147961-7520-2-git-send-email-cmaiolino@redhat.com> In-Reply-To: <1348147961-7520-2-git-send-email-cmaiolino@redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/20/12 08:32, Carlos Maiolino wrote: > xfs_ialloc_next_ag() currently resets m_agirotor when it is equal to m_maxagi: > > if (++mp->m_agirotor == mp->m_maxagi) > mp->m_agirotor = 0; > > But, if for some reason mp->m_maxagi changes to a lower value than current > m_agirotor, this condition will never be true, causing m_agirotor to exceed the > maximum allowed value (m_maxagi). > > This implies mainly during lookups for xfs_perag structs in its radix tree, > since the agno value used for the lookup is based on m_agirotor. An out-of-range > m_agirotor may cause a lookup failure which in case will return NULL. > > As an example, the value of m_maxagi is decreased during inode64->inode32 > remount process, case where I've found this problem. > > Signed-off-by: Carlos Maiolino > --- Looks good. Reviewed-by: Mark Tinguely From tinguely@sgi.com Wed Sep 26 15:19:06 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8QKJ6JS249706 for ; Wed, 26 Sep 2012 15:19:06 -0500 Received: from [128.162.232.125] (eagdhcp-232-125.americas.sgi.com [128.162.232.125]) by relay1.corp.sgi.com (Postfix) with ESMTP id 9F3368F8033; Wed, 26 Sep 2012 13:20:25 -0700 (PDT) Message-ID: <50636384.1010803@sgi.com> Date: Wed, 26 Sep 2012 15:20:20 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Carlos Maiolino CC: xfs@oss.sgi.com Subject: Re: [PATCH 2/6] xfs: make inode64 as the default allocation mode References: <1348147961-7520-1-git-send-email-cmaiolino@redhat.com> <1348147961-7520-3-git-send-email-cmaiolino@redhat.com> In-Reply-To: <1348147961-7520-3-git-send-email-cmaiolino@redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/20/12 08:32, Carlos Maiolino wrote: > since 64-bit inodes can be accessed while using inode32, and these can also be > used on 32-bit kernels, there is no reason to still keep inode32 as the default > mount option. > If the filesystem cannot handle 64bit inode numbers (i.e CONFIG_LBDAF is not > enabled and BITS_PER_LONG == 32), XFS_MOUNT_SMALL_INUMS will still be set by > default, so inode64 is not an unconditional default value. > > Signed-off-by: Carlos Maiolino > --- Looks good. Reviewed-by: Mark Tinguely From tinguely@sgi.com Wed Sep 26 15:19:35 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8QKJY5f249743 for ; Wed, 26 Sep 2012 15:19:34 -0500 Received: from [128.162.232.125] (eagdhcp-232-125.americas.sgi.com [128.162.232.125]) by relay1.corp.sgi.com (Postfix) with ESMTP id D5E4C8F8040; Wed, 26 Sep 2012 13:20:53 -0700 (PDT) Message-ID: <506363A0.8060409@sgi.com> Date: Wed, 26 Sep 2012 15:20:48 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Carlos Maiolino CC: xfs@oss.sgi.com Subject: Re: [PATCH 3/6] xfs: reduce code duplication handling inode32/64 options References: <1348147961-7520-1-git-send-email-cmaiolino@redhat.com> <1348147961-7520-4-git-send-email-cmaiolino@redhat.com> In-Reply-To: <1348147961-7520-4-git-send-email-cmaiolino@redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/20/12 08:32, Carlos Maiolino wrote: > Add xfs_set_inode32() to be used to enable inode32 allocation mode. this will > reduce the amount of duplicated code needed to mount/remount a filesystem with > inode32 option. > This patch also changes xfs_set_inode64() to return the maximum AG number that > inodes can be allocated instead of set mp->m_maxagi by itself, so that the > behaviour is the same as xfs_set_inode32(). > This simplifies code that calls these functions and needs to know the maximum > AG that inodes can be allocated in. > > Signed-off-by: Carlos Maiolino > --- Looks good. Reviewed-by: Mark Tinguely From tinguely@sgi.com Wed Sep 26 15:19:49 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8QKJnKI249878 for ; Wed, 26 Sep 2012 15:19:49 -0500 Received: from [128.162.232.125] (eagdhcp-232-125.americas.sgi.com [128.162.232.125]) by relay1.corp.sgi.com (Postfix) with ESMTP id C2DEA8F8033; Wed, 26 Sep 2012 13:21:08 -0700 (PDT) Message-ID: <506363AF.9080601@sgi.com> Date: Wed, 26 Sep 2012 15:21:03 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Carlos Maiolino CC: xfs@oss.sgi.com Subject: Re: [PATCH 4/6] xfs: Fix mp->m_maxagi update during inode64 remount References: <1348147961-7520-1-git-send-email-cmaiolino@redhat.com> <1348147961-7520-5-git-send-email-cmaiolino@redhat.com> In-Reply-To: <1348147961-7520-5-git-send-email-cmaiolino@redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/20/12 08:32, Carlos Maiolino wrote: > With the changes made on xfs_set_inode64(), to make it behave as > xfs_set_inode32() (now leaving to the caller the responsibility to update > mp->m_maxagi), we use the return value of xfs_set_inode64() to update > mp->m_maxagi during remount. > > Signed-off-by: Carlos Maiolino > --- Looks good. Reviewed-by: Mark Tinguely From tinguely@sgi.com Wed Sep 26 15:20:08 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8QKK8vg249908 for ; Wed, 26 Sep 2012 15:20:08 -0500 Received: from [128.162.232.125] (eagdhcp-232-125.americas.sgi.com [128.162.232.125]) by relay1.corp.sgi.com (Postfix) with ESMTP id 65B2C8F8033; Wed, 26 Sep 2012 13:21:27 -0700 (PDT) Message-ID: <506363C1.7080500@sgi.com> Date: Wed, 26 Sep 2012 15:21:21 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Carlos Maiolino CC: xfs@oss.sgi.com Subject: Re: [PATCH 5/6] xfs: add inode64->inode32 transition into xfs_set_inode32() References: <1348147961-7520-1-git-send-email-cmaiolino@redhat.com> <1348147961-7520-6-git-send-email-cmaiolino@redhat.com> In-Reply-To: <1348147961-7520-6-git-send-email-cmaiolino@redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/20/12 08:32, Carlos Maiolino wrote: > To make inode32 a remountable option, xfs_set_inode32() should be able to make a > transition from inode64 option, disabling inode allocation on higher AGs. > > Signed-off-by: Carlos Maiolino > --- Looks good. Reviewed-by: Mark Tinguely From tinguely@sgi.com Wed Sep 26 15:20:41 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8QKKfhn250052 for ; Wed, 26 Sep 2012 15:20:41 -0500 Received: from [128.162.232.125] (eagdhcp-232-125.americas.sgi.com [128.162.232.125]) by relay1.corp.sgi.com (Postfix) with ESMTP id 304EC8F8040; Wed, 26 Sep 2012 13:22:00 -0700 (PDT) Message-ID: <506363E2.8080804@sgi.com> Date: Wed, 26 Sep 2012 15:21:54 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Carlos Maiolino CC: xfs@oss.sgi.com Subject: Re: [PATCH 6/6] xfs: Make inode32 a remountable option References: <1348147961-7520-1-git-send-email-cmaiolino@redhat.com> <1348147961-7520-7-git-send-email-cmaiolino@redhat.com> In-Reply-To: <1348147961-7520-7-git-send-email-cmaiolino@redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/20/12 08:32, Carlos Maiolino wrote: > As inode64 is the default option now, and was also made remountable previously, > inode32 can also be remounted on-the-fly when it is needed. > > Signed-off-by: Carlos Maiolino > --- Looks good. Reviewed-by: Mark Tinguely From bpm@oss.sgi.com Wed Sep 26 16:19:51 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=ALL_TRUSTED,BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from oss.sgi.com (localhost [127.0.0.1]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8QLJp3f256671 for ; Wed, 26 Sep 2012 16:19:51 -0500 Received: (from bpm@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id q8QLJpj1256613; Wed, 26 Sep 2012 16:19:51 -0500 Date: Wed, 26 Sep 2012 16:19:51 -0500 Message-Id: <201209262119.q8QLJpj1256613@oss.sgi.com> From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, master, updated. v3.6-rc1-17-g2ea0392 X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: 4026c9fde9c67266932afd209e25bfef4474a1be X-Git-Newrev: 2ea0392983a82f7dc3055568ae0f2558724d119b This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, master has been updated 2ea0392 xfs: Make inode32 a remountable option 4056c1d xfs: add inode64->inode32 transition into xfs_set_inode32() 4c08372 xfs: Fix mp->m_maxagi update during inode64 remount 2d2194f xfs: reduce code duplication handling inode32/64 options 08bf540 xfs: make inode64 as the default allocation mode 8aea3ff xfs: Fix m_agirotor reset during AG selection c3a58fe Make inode64 a remountable option from 4026c9fde9c67266932afd209e25bfef4474a1be (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 2ea0392983a82f7dc3055568ae0f2558724d119b Author: Carlos Maiolino Date: Thu Sep 20 10:32:41 2012 -0300 xfs: Make inode32 a remountable option As inode64 is the default option now, and was also made remountable previously, inode32 can also be remounted on-the-fly when it is needed. Signed-off-by: Carlos Maiolino Reviewed-by: Christoph Hellwig Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit 4056c1d08d2a7c50ae7414db7c1783ba45b4835d Author: Carlos Maiolino Date: Thu Sep 20 10:32:40 2012 -0300 xfs: add inode64->inode32 transition into xfs_set_inode32() To make inode32 a remountable option, xfs_set_inode32() should be able to make a transition from inode64 option, disabling inode allocation on higher AGs. Signed-off-by: Carlos Maiolino Reviewed-by: Christoph Hellwig Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit 4c0837224c677db35cd85b04a77504c496cadb66 Author: Carlos Maiolino Date: Thu Sep 20 10:32:39 2012 -0300 xfs: Fix mp->m_maxagi update during inode64 remount With the changes made on xfs_set_inode64(), to make it behave as xfs_set_inode32() (now leaving to the caller the responsibility to update mp->m_maxagi), we use the return value of xfs_set_inode64() to update mp->m_maxagi during remount. Signed-off-by: Carlos Maiolino Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit 2d2194f61fddab3a9731b6e7a7ae3a4a19dd810c Author: Carlos Maiolino Date: Thu Sep 20 10:32:38 2012 -0300 xfs: reduce code duplication handling inode32/64 options Add xfs_set_inode32() to be used to enable inode32 allocation mode. this will reduce the amount of duplicated code needed to mount/remount a filesystem with inode32 option. This patch also changes xfs_set_inode64() to return the maximum AG number that inodes can be allocated instead of set mp->m_maxagi by itself, so that the behaviour is the same as xfs_set_inode32(). This simplifies code that calls these functions and needs to know the maximum AG that inodes can be allocated in. Signed-off-by: Carlos Maiolino Reviewed-by: Christoph Hellwig Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit 08bf540412ed82a15cb9068249ad49b410a7b082 Author: Carlos Maiolino Date: Thu Sep 20 10:32:37 2012 -0300 xfs: make inode64 as the default allocation mode since 64-bit inodes can be accessed while using inode32, and these can also be used on 32-bit kernels, there is no reason to still keep inode32 as the default mount option. If the filesystem cannot handle 64bit inode numbers (i.e CONFIG_LBDAF is not enabled and BITS_PER_LONG == 32), XFS_MOUNT_SMALL_INUMS will still be set by default, so inode64 is not an unconditional default value. Signed-off-by: Carlos Maiolino Reviewed-by: Christoph Hellwig Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit 8aea3ff411b2ce8fe7b46644298ed243a920eb24 Author: Carlos Maiolino Date: Thu Sep 20 10:32:36 2012 -0300 xfs: Fix m_agirotor reset during AG selection xfs_ialloc_next_ag() currently resets m_agirotor when it is equal to m_maxagi: if (++mp->m_agirotor == mp->m_maxagi) mp->m_agirotor = 0; But, if for some reason mp->m_maxagi changes to a lower value than current m_agirotor, this condition will never be true, causing m_agirotor to exceed the maximum allowed value (m_maxagi). This implies mainly during lookups for xfs_perag structs in its radix tree, since the agno value used for the lookup is based on m_agirotor. An out-of-range m_agirotor may cause a lookup failure which in case will return NULL. As an example, the value of m_maxagi is decreased during inode64->inode32 remount process, case where I've found this problem. Signed-off-by: Carlos Maiolino Reviewed-by: Christoph Hellwig Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit c3a58fecdd1934a8538ada9073107625f5151687 Author: Carlos Maiolino Date: Fri Aug 17 18:19:38 2012 -0300 Make inode64 a remountable option Actually, there is no reason about why a user must umount and mount a XFS filesystem to enable 'inode64' option. So, this patch makes this a remountable option. Signed-off-by: Carlos Maiolino Reviewed-by: Brian Foster Reviewed-by: Dave Chinner Signed-off-by: Ben Myers ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_ialloc.c | 2 +- fs/xfs/xfs_mount.c | 43 +++-------------------- fs/xfs/xfs_super.c | 95 ++++++++++++++++++++++++++++++++++++++++++++++++++- fs/xfs/xfs_super.h | 2 ++ 4 files changed, 102 insertions(+), 40 deletions(-) hooks/post-receive -- XFS development tree From bpm@oss.sgi.com Wed Sep 26 16:20:33 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-0.9 required=5.0 tests=ALL_TRUSTED,BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from oss.sgi.com (localhost [127.0.0.1]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8QLKX01256849 for ; Wed, 26 Sep 2012 16:20:33 -0500 Received: (from bpm@localhost) by oss.sgi.com (8.14.3/8.14.3/Submit) id q8QLKWA7256791; Wed, 26 Sep 2012 16:20:32 -0500 Date: Wed, 26 Sep 2012 16:20:32 -0500 Message-Id: <201209262120.q8QLKWA7256791@oss.sgi.com> From: xfs@oss.sgi.com To: xfs@oss.sgi.com Subject: [XFS updates] XFS development tree branch, for-next, updated. v3.6-rc1-17-g2ea0392 X-Git-Refname: refs/heads/for-next X-Git-Reftype: branch X-Git-Oldrev: 4026c9fde9c67266932afd209e25bfef4474a1be X-Git-Newrev: 2ea0392983a82f7dc3055568ae0f2558724d119b This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "XFS development tree". The branch, for-next has been updated 2ea0392 xfs: Make inode32 a remountable option 4056c1d xfs: add inode64->inode32 transition into xfs_set_inode32() 4c08372 xfs: Fix mp->m_maxagi update during inode64 remount 2d2194f xfs: reduce code duplication handling inode32/64 options 08bf540 xfs: make inode64 as the default allocation mode 8aea3ff xfs: Fix m_agirotor reset during AG selection c3a58fe Make inode64 a remountable option from 4026c9fde9c67266932afd209e25bfef4474a1be (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 2ea0392983a82f7dc3055568ae0f2558724d119b Author: Carlos Maiolino Date: Thu Sep 20 10:32:41 2012 -0300 xfs: Make inode32 a remountable option As inode64 is the default option now, and was also made remountable previously, inode32 can also be remounted on-the-fly when it is needed. Signed-off-by: Carlos Maiolino Reviewed-by: Christoph Hellwig Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit 4056c1d08d2a7c50ae7414db7c1783ba45b4835d Author: Carlos Maiolino Date: Thu Sep 20 10:32:40 2012 -0300 xfs: add inode64->inode32 transition into xfs_set_inode32() To make inode32 a remountable option, xfs_set_inode32() should be able to make a transition from inode64 option, disabling inode allocation on higher AGs. Signed-off-by: Carlos Maiolino Reviewed-by: Christoph Hellwig Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit 4c0837224c677db35cd85b04a77504c496cadb66 Author: Carlos Maiolino Date: Thu Sep 20 10:32:39 2012 -0300 xfs: Fix mp->m_maxagi update during inode64 remount With the changes made on xfs_set_inode64(), to make it behave as xfs_set_inode32() (now leaving to the caller the responsibility to update mp->m_maxagi), we use the return value of xfs_set_inode64() to update mp->m_maxagi during remount. Signed-off-by: Carlos Maiolino Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit 2d2194f61fddab3a9731b6e7a7ae3a4a19dd810c Author: Carlos Maiolino Date: Thu Sep 20 10:32:38 2012 -0300 xfs: reduce code duplication handling inode32/64 options Add xfs_set_inode32() to be used to enable inode32 allocation mode. this will reduce the amount of duplicated code needed to mount/remount a filesystem with inode32 option. This patch also changes xfs_set_inode64() to return the maximum AG number that inodes can be allocated instead of set mp->m_maxagi by itself, so that the behaviour is the same as xfs_set_inode32(). This simplifies code that calls these functions and needs to know the maximum AG that inodes can be allocated in. Signed-off-by: Carlos Maiolino Reviewed-by: Christoph Hellwig Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit 08bf540412ed82a15cb9068249ad49b410a7b082 Author: Carlos Maiolino Date: Thu Sep 20 10:32:37 2012 -0300 xfs: make inode64 as the default allocation mode since 64-bit inodes can be accessed while using inode32, and these can also be used on 32-bit kernels, there is no reason to still keep inode32 as the default mount option. If the filesystem cannot handle 64bit inode numbers (i.e CONFIG_LBDAF is not enabled and BITS_PER_LONG == 32), XFS_MOUNT_SMALL_INUMS will still be set by default, so inode64 is not an unconditional default value. Signed-off-by: Carlos Maiolino Reviewed-by: Christoph Hellwig Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit 8aea3ff411b2ce8fe7b46644298ed243a920eb24 Author: Carlos Maiolino Date: Thu Sep 20 10:32:36 2012 -0300 xfs: Fix m_agirotor reset during AG selection xfs_ialloc_next_ag() currently resets m_agirotor when it is equal to m_maxagi: if (++mp->m_agirotor == mp->m_maxagi) mp->m_agirotor = 0; But, if for some reason mp->m_maxagi changes to a lower value than current m_agirotor, this condition will never be true, causing m_agirotor to exceed the maximum allowed value (m_maxagi). This implies mainly during lookups for xfs_perag structs in its radix tree, since the agno value used for the lookup is based on m_agirotor. An out-of-range m_agirotor may cause a lookup failure which in case will return NULL. As an example, the value of m_maxagi is decreased during inode64->inode32 remount process, case where I've found this problem. Signed-off-by: Carlos Maiolino Reviewed-by: Christoph Hellwig Reviewed-by: Mark Tinguely Signed-off-by: Ben Myers commit c3a58fecdd1934a8538ada9073107625f5151687 Author: Carlos Maiolino Date: Fri Aug 17 18:19:38 2012 -0300 Make inode64 a remountable option Actually, there is no reason about why a user must umount and mount a XFS filesystem to enable 'inode64' option. So, this patch makes this a remountable option. Signed-off-by: Carlos Maiolino Reviewed-by: Brian Foster Reviewed-by: Dave Chinner Signed-off-by: Ben Myers ----------------------------------------------------------------------- Summary of changes: fs/xfs/xfs_ialloc.c | 2 +- fs/xfs/xfs_mount.c | 43 +++-------------------- fs/xfs/xfs_super.c | 95 ++++++++++++++++++++++++++++++++++++++++++++++++++- fs/xfs/xfs_super.h | 2 ++ 4 files changed, 102 insertions(+), 40 deletions(-) hooks/post-receive -- XFS development tree From bpm@sgi.com Wed Sep 26 16:21:46 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8QLLkZn257057 for ; Wed, 26 Sep 2012 16:21:46 -0500 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay2.corp.sgi.com (Postfix) with ESMTP id 42970304032; Wed, 26 Sep 2012 14:23:02 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 25CFA4266DC; Wed, 26 Sep 2012 16:23:02 -0500 (CDT) Date: Wed, 26 Sep 2012 16:23:02 -0500 From: Ben Myers To: Carlos Maiolino Cc: xfs@oss.sgi.com Subject: Re: [PATCH 0/6 V4] inode32/inode64 allocation changes Message-ID: <20120926212302.GD13214@sgi.com> References: <1348147961-7520-1-git-send-email-cmaiolino@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1348147961-7520-1-git-send-email-cmaiolino@redhat.com> User-Agent: Mutt/1.5.20 (2009-06-14) On Thu, Sep 20, 2012 at 10:32:35AM -0300, Carlos Maiolino wrote: > This patch set adds inode64 as the default allocation mode, but also includes 2 > patches to remove duplicated code and another one to make inode32 able to be > remounted. > > NOTE: This patch has as dependency "Make inode64 a remountable option" patch. > > V4 properly set pagf_metadata in patch 5 > > V3 has a better factoring of each patch goal, including other dchinner's > suggestions in V2. > Also it contains a fix in how m_agirotor reset is made (patch 01) that I've > found while doing tests with these patches. > > Carlos Maiolino (6): > xfs: Fix m_agirotor reset during AG selection > xfs: make inode64 as the default allocation mode > xfs: reduce code duplication handling inode32/64 options > xfs: Fix mp->m_maxagi update during inode64 remount > xfs: add inode64->inode32 transition into xfs_set_inode32() > xfs: Make inode32 a remountable option > > fs/xfs/xfs_ialloc.c | 2 +- > fs/xfs/xfs_mount.c | 43 +++---------------- > fs/xfs/xfs_super.c | 117 ++++++++++++++++++++++++++++++++++++++++------------ > fs/xfs/xfs_super.h | 2 + > 4 files changed, 99 insertions(+), 65 deletions(-) This series has been committed to git://oss.sgi.com/xfs/xfs.git, master and for-next branches. From bpm@sgi.com Wed Sep 26 16:23:34 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8QLNXFY257206 for ; Wed, 26 Sep 2012 16:23:34 -0500 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay3.corp.sgi.com (Postfix) with ESMTP id 1EC21AC005; Wed, 26 Sep 2012 14:24:45 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 306B34266DC; Wed, 26 Sep 2012 16:24:44 -0500 (CDT) Date: Wed, 26 Sep 2012 16:24:44 -0500 From: Ben Myers To: Carlos Maiolino Cc: xfs@oss.sgi.com Subject: Re: [PATCH V4] Make inode64 a remountable option Message-ID: <20120926212444.GE13214@sgi.com> References: <1345238378-10123-1-git-send-email-cmaiolino@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1345238378-10123-1-git-send-email-cmaiolino@redhat.com> User-Agent: Mutt/1.5.20 (2009-06-14) On Fri, Aug 17, 2012 at 06:19:38PM -0300, Carlos Maiolino wrote: > Actually, there is no reason about why a user must umount and mount a XFS > filesystem to enable 'inode64' option. So, this patch makes this a remountable > option. > > Signed-off-by: Carlos Maiolino committed to git://oss.sgi.com/xfs/xfs.git, master and for-next branches. From bpm@sgi.com Wed Sep 26 16:40:58 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8QLewxU258620 for ; Wed, 26 Sep 2012 16:40:58 -0500 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay1.corp.sgi.com (Postfix) with ESMTP id A84C68F8059; Wed, 26 Sep 2012 14:42:14 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 93A234266DC; Wed, 26 Sep 2012 16:42:14 -0500 (CDT) Date: Wed, 26 Sep 2012 16:42:14 -0500 From: Ben Myers To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: userspace releases? Message-ID: <20120926214214.GF13214@sgi.com> References: <20120925095002.GA26583@infradead.org> <20120925194355.GK1140@sgi.com> <20120926091554.GA13559@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20120926091554.GA13559@infradead.org> User-Agent: Mutt/1.5.20 (2009-06-14) Hey, On Wed, Sep 26, 2012 at 05:15:54AM -0400, Christoph Hellwig wrote: > On Tue, Sep 25, 2012 at 02:43:55PM -0500, Ben Myers wrote: > > Hey Christoph, > > > > On Tue, Sep 25, 2012 at 05:50:02AM -0400, Christoph Hellwig wrote: > > > It's been 6 month since the last releases, and we've acquired a fair > > > amount of fixes in xfsprogs. I think it's time to put out another > > > release soon. > > > > Seems like a good idea to me. How would you prefer to define 'soon'? > > Given the expected rush with the 3.7 merge window I'm perfectly fine > doing it just after that, say mid-October. Mid-October sounds good! -Ben From bpm@sgi.com Wed Sep 26 17:03:18 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_46 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8QM3Il2260180 for ; Wed, 26 Sep 2012 17:03:18 -0500 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay1.corp.sgi.com (Postfix) with ESMTP id 3D2B48F8033; Wed, 26 Sep 2012 15:04:34 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id 2AAA64266DC; Wed, 26 Sep 2012 17:04:34 -0500 (CDT) Date: Wed, 26 Sep 2012 17:04:34 -0500 From: Ben Myers To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfsprog: remove duplicate vector memalign from xfs_io Message-ID: <20120926220434.GG13214@sgi.com> References: <20120925142414.660506845@sgi.com> <20120925142421.398175185@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20120925142421.398175185@sgi.com> User-Agent: Mutt/1.5.20 (2009-06-14) On Tue, Sep 25, 2012 at 09:24:15AM -0500, Mark Tinguely wrote: > The vector feature of xfs_io uses its own memory buffer in the iov structure > and does not use the buffer entry. Remove the duplicate memalign. Looks to me that there is a usage of buffer in __dump_buffer. However, I suspect there shouldn't be. I suggest (untested,ymmv,ianal,etc): :!quilt di Index: xfsprogs/io/pread.c =================================================================== --- xfsprogs.orig/io/pread.c +++ xfsprogs/io/pread.c @@ -130,7 +130,7 @@ __dump_buffer( int i, j; char *p; - for (i = 0, p = (char *)buffer; i < len; i += 16) { + for (i = 0, p = (char *)buf; i < len; i += 16) { char *s = p; printf("%08llx: ", (unsigned long long)offset + i); Otherwise your patch looks good to me. If I'm not off-my-rocker with the above you're welcome to pull it in to your patch, or I can submit it to the list more formally tomorrow. Reviewed-by: Ben Myers From tinguely@sgi.com Wed Sep 26 17:20:07 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_46 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8QMK7t2261454 for ; Wed, 26 Sep 2012 17:20:07 -0500 Received: from [128.162.232.125] (eagdhcp-232-125.americas.sgi.com [128.162.232.125]) by relay1.corp.sgi.com (Postfix) with ESMTP id A69CA8F804B; Wed, 26 Sep 2012 15:21:26 -0700 (PDT) Message-ID: <50637FE1.8060703@sgi.com> Date: Wed, 26 Sep 2012 17:21:21 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Ben Myers CC: xfs@oss.sgi.com Subject: Re: [PATCH] xfsprog: remove duplicate vector memalign from xfs_io References: <20120925142414.660506845@sgi.com> <20120925142421.398175185@sgi.com> <20120926220434.GG13214@sgi.com> In-Reply-To: <20120926220434.GG13214@sgi.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/26/12 17:04, Ben Myers wrote: > On Tue, Sep 25, 2012 at 09:24:15AM -0500, Mark Tinguely wrote: >> The vector feature of xfs_io uses its own memory buffer in the iov structure >> and does not use the buffer entry. Remove the duplicate memalign. > > Looks to me that there is a usage of buffer in __dump_buffer. However, > I suspect there shouldn't be. I suggest (untested,ymmv,ianal,etc): > > :!quilt di > Index: xfsprogs/io/pread.c > =================================================================== > --- xfsprogs.orig/io/pread.c > +++ xfsprogs/io/pread.c > @@ -130,7 +130,7 @@ __dump_buffer( > int i, j; > char *p; > > - for (i = 0, p = (char *)buffer; i< len; i += 16) { > + for (i = 0, p = (char *)buf; i< len; i += 16) { > char *s = p; > > printf("%08llx: ", (unsigned long long)offset + i); > > > Otherwise your patch looks good to me. If I'm not off-my-rocker with > the above you're welcome to pull it in to your patch, or I can submit it > to the list more formally tomorrow. > > Reviewed-by: Ben Myers Interesting. You are on your rocker, I missed the second bug. --Mark. From david@fromorbit.com Wed Sep 26 18:40:35 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_37 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8QNeZIg010129 for ; Wed, 26 Sep 2012 18:40:35 -0500 X-ASG-Debug-ID: 1348702911-04cb6c7944187a0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id cBkAfmkFGGaHM9Lm for ; Wed, 26 Sep 2012 16:41:52 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqQMANKRY1B5LPfb/2dsb2JhbAA9CL1JAQKBDoEJgiABAQQBJxMcIwULCAMYLhQlAyETh38Ft14UiwQWCkxKhFMDlWiQLIJ5gUk Received: from ppp121-44-247-219.lns20.syd7.internode.on.net (HELO dastard) ([121.44.247.219]) by ipmail06.adl6.internode.on.net with ESMTP; 27 Sep 2012 09:11:50 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TH1Ej-0003x7-ED; Thu, 27 Sep 2012 09:41:49 +1000 Date: Thu, 27 Sep 2012 09:41:49 +1000 From: Dave Chinner To: Mark Tinguely Cc: bpm@sgi.com, xfs@oss.sgi.com Subject: Re: [PATCH 0/3] xfs: allocation worker causes freelist buffer lock hang Message-ID: <20120926234149.GJ29154@dastard> X-ASG-Orig-Subj: Re: [PATCH 0/3] xfs: allocation worker causes freelist buffer lock hang References: <20120924171159.GG1140@sgi.com> <201209241809.q8OI94s3003323@eagdhcp-232-125.americas.sgi.com> <20120925005632.GB23520@dastard> <5061CA48.3040202@sgi.com> <20120925220110.GF29154@dastard> <50630DB6.4070405@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50630DB6.4070405@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1348702911 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC5_SA210e X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109680 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 BSF_SC5_SA210e Custom Rule SA210e On Wed, Sep 26, 2012 at 09:14:14AM -0500, Mark Tinguely wrote: > On 09/25/12 17:01, Dave Chinner wrote: > >On Tue, Sep 25, 2012 at 10:14:16AM -0500, Mark Tinguely wrote: > > > > >>>> > >>>>As a bonus, consolidating the loops into one worker actually gives a slight > >>>>performance advantage. > >>> > >>>Can you quantify it? > >> > >>I was comparing the bonnie and iozone benchmarks outputs. I will see > >>if someone can enlighten me on how to quantify those numbers. > > > >Ugh. > > > >Don't bother. Those are two of the worst offenders in the "useless > >benchmarks for regression testing" category. Yeah, they *look* like > >they give decent numbers, but I've wasted so much time looking at > >results from these benhmarks only to find they do basic things wrong > >and give numbers that vary simple because you've made a change that > >increases or decreases the CPU cache footprint of a code path. > > > >e.g. IOZone uses the same memory buffer as the source/destination of > >all it's IO, and does not touch the contents of it at all. Hence for > >small IO, the buffer stays resident in the CPU caches and gives > >unrealsitically high throughput results. Worse is the fact that CPU > >cache residency of the buffer can change according to the kernel > >code path taken, so you can get massive changes in throughput just > >by changing the layout of the code without changing any logic.... > > > >IOZone can be useful if you know exactly what you are doing and > >using it to test a specific code path with a specific set of > >configurations. e.g. comparing ext3/4/xfs/btrfs on the same kernel > >and storage is fine. However, the moment you start using it to > >compare different kernels, it's a total crap shoot.... > > does anyone have a good benchmark XFS should use to share > performance results? A number that we can agree a series does not > degrade the filesystem.. ffsb and fio with benchmark style workload definitions, fsmark when using total runtime rather than files/s for comparison. I also have a bunch of hand written scripts that I've written specifically for purpose for testing stuff like directory traversal and IO parallelism scalability. The problem is that common benchmarks like iozone, postmark, bonnie++ and dbench are really just load generators that output numbers - there are all very sensitive to many non-filesystem changes (e.g. VM tunings) and so have to be run "just right" to produce meaningful numbers. That "just right" changes from kernel to kernel, machine to machine (running the same kernel!) and filesystem to filesystem. Dbench is particularly sensitive to VM changes and tunings, as well as log IO latency. e.g. running it on the same system on different region of the same disk give significantly different results because writes to the log are slower on the inner regions of disk. Indeed, just changing the log stripe unit without changing anything else can have a marked affect on results... I have machines here that I can't use IOzone at all for IO sizes of less than 4MB because the timing loops it uses don't have enough granularity to accurately measure syscall times, and hence it doesn't report throughputs reliably. The worst part is that in the results output, it doesn't tell you it had problems - youhave to look inteh log files to get that information and realise that the entire benchmark run was compromised... > lies, damn lies, statistics and then filesystem benchmarks?! :) I think I've said that myself many times in the past. ;) > >I guess I don't understand what you mean by "loop on > >xfs_alloc_vextent()" then. > > > >The problem I see above is this: > > > >thread 1 worker 1 worker 2..max > >xfs_bmapi_write(userdata) > > loops here calling xfs_bmapi_alloc() I don't think it can for userdata allocations. Metadata, yes, userdata, no. > > xfs_bmapi_allocate(user) > > xfs_alloc_vextent(user) > > wait > > > > _xfs_alloc_vextent() > > locks AGF > > first loop it takes the lock > one of the next times through the above > loop it cannot get a worker. deadlock here. > > I saved the xfs_bmalloca and fs_alloc_arg when > allocating a buffer to verify the paths. > > > _xfs_alloc_vextent() > > blocks on AGF lock > > > completes allocation > > > > And then xfs_bmapi_allocate() increments bma->nallocs after each successful allocation. Hence the only way we can loop there for userdata allocations is if the nmap parameter passes in is > 1. When it returns to xfs-bmapi_write(), it trims and updates the map, and then this code prevents it from looping: /* * If we're done, stop now. Stop when we've allocated * XFS_BMAP_MAX_NMAP extents no matter what. Otherwise * the transaction may get too big. */ if (bno >= end || n >= *nmap || bma.nallocs >= *nmap) break; Because the userdata callers use these values for *nmap: xfs_iomap_write_direct nimaps = 1; xfs_iomap_write_allocate nimaps = 1; xfs_iomap_write_unwritten nimaps = 1; xfs_alloc_file_space nimaps = 1; So basically there will break out of the loop after a single allocation, and hence should not be getting stuck on a second allocation in xfs_bmapi_allocate()/xfs_alloc_vextent() with the AGF locked from this code path. > > xfs_bmap_add_extent_hole_real > > xfs_bmap_extents_to_btree > > xfs_alloc_vextent(user) > > wait > > this does not need a worker, and since in the same I agree that it does not *need* a worker, but it will *use* a worker thread if args->userdata is not initialised to zero. > transaction all locks to the AGF buffer are recursive locks. Right, the worker won't block on the AGF lock, but if it can't get a worker because they are all blocked on the AGF lock, then it deadlocks. As I said before, I cannot see any other path that will trigger a userdata allocation with the AGF locked. So does patch 3 by itself solve the problem? Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Sep 26 18:59:08 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8QNx8Zo011621 for ; Wed, 26 Sep 2012 18:59:08 -0500 X-ASG-Debug-ID: 1348704025-04cb6c794319760001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id jq60rvKNv7ami77U for ; Wed, 26 Sep 2012 17:00:25 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqMMAI+WY1B5LPfb/2dsb2JhbABFvUgBAoEOgQmCIAEBBTocIxAIAxguFCUDIROIBLd7FIsEbEqDc2ADlWiJPYZvgnk Received: from ppp121-44-247-219.lns20.syd7.internode.on.net (HELO dastard) ([121.44.247.219]) by ipmail06.adl6.internode.on.net with ESMTP; 27 Sep 2012 09:30:25 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TH1Wi-0003z3-Fp; Thu, 27 Sep 2012 10:00:24 +1000 Date: Thu, 27 Sep 2012 10:00:24 +1000 From: Dave Chinner To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfsprog: remove duplicate vector memalign from xfs_io Message-ID: <20120927000024.GA15236@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfsprog: remove duplicate vector memalign from xfs_io References: <20120925142414.660506845@sgi.com> <20120925142421.398175185@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20120925142421.398175185@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1348704025 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109682 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Sep 25, 2012 at 09:24:15AM -0500, Mark Tinguely wrote: > The vector feature of xfs_io uses its own memory buffer in the iov structure > and does not use the buffer entry. Remove the duplicate memalign. > > Signed-off-by: Mark Tinguely > --- > io/pread.c | 3 +-- > 1 file changed, 1 insertion(+), 2 deletions(-) > > Index: b/io/pread.c > =================================================================== > --- a/io/pread.c > +++ b/io/pread.c > @@ -76,8 +76,7 @@ alloc_iovec( > buffersize = 0; > for (i = 0; i < vectors; i++) { > iov[i].iov_base = memalign(pagesize, bsize); > - buffer = memalign(pagesize, bsize); > - if (!buffer) { > + if (!iov[i].iov_base) { > perror("memalign"); > goto unwind; > } Classic copy'n'paste bug. My fault. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Sep 26 18:59:45 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_46 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8QNxja9011735 for ; Wed, 26 Sep 2012 18:59:45 -0500 X-ASG-Debug-ID: 1348704062-04cb6c7941197e0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id AoY6wvjwEjpqMEFq for ; Wed, 26 Sep 2012 17:01:03 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqMMAI+WY1B5LPfb/2dsb2JhbABFvUgBAoEOgQmCIAEBBTocIxAIAw4KLhQlAyETiAS3exSLBGxKg3NgA5VoiT2Gb4J5 Received: from ppp121-44-247-219.lns20.syd7.internode.on.net (HELO dastard) ([121.44.247.219]) by ipmail06.adl6.internode.on.net with ESMTP; 27 Sep 2012 09:31:02 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TH1XJ-0003zN-MY; Thu, 27 Sep 2012 10:01:01 +1000 Date: Thu, 27 Sep 2012 10:01:01 +1000 From: Dave Chinner To: Ben Myers Cc: Mark Tinguely , xfs@oss.sgi.com Subject: Re: [PATCH] xfsprog: remove duplicate vector memalign from xfs_io Message-ID: <20120927000101.GB15236@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfsprog: remove duplicate vector memalign from xfs_io References: <20120925142414.660506845@sgi.com> <20120925142421.398175185@sgi.com> <20120926220434.GG13214@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20120926220434.GG13214@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1348704062 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109682 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Wed, Sep 26, 2012 at 05:04:34PM -0500, Ben Myers wrote: > On Tue, Sep 25, 2012 at 09:24:15AM -0500, Mark Tinguely wrote: > > The vector feature of xfs_io uses its own memory buffer in the iov structure > > and does not use the buffer entry. Remove the duplicate memalign. > > Looks to me that there is a usage of buffer in __dump_buffer. However, > I suspect there shouldn't be. I suggest (untested,ymmv,ianal,etc): > > :!quilt di > Index: xfsprogs/io/pread.c > =================================================================== > --- xfsprogs.orig/io/pread.c > +++ xfsprogs/io/pread.c > @@ -130,7 +130,7 @@ __dump_buffer( > int i, j; > char *p; > > - for (i = 0, p = (char *)buffer; i < len; i += 16) { > + for (i = 0, p = (char *)buf; i < len; i += 16) { > char *s = p; > > printf("%08llx: ", (unsigned long long)offset + i); Can you post that as a proper patch? Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Sep 26 19:05:21 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_66 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8R05LwX012226 for ; Wed, 26 Sep 2012 19:05:21 -0500 X-ASG-Debug-ID: 1348704399-04bdf0289d1c0b0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id aqMXcDUiSGtSpHBy for ; Wed, 26 Sep 2012 17:06:39 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqMMANCXY1B5LPfb/2dsb2JhbABFvUgBAoEOgQmCIAEBBTocIxAIAw4KLhQlAyETiAS3fhSLBGxKg3NgA5VokCyCeQ Received: from ppp121-44-247-219.lns20.syd7.internode.on.net (HELO dastard) ([121.44.247.219]) by ipmail06.adl6.internode.on.net with ESMTP; 27 Sep 2012 09:36:38 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TH1ck-00040w-30; Thu, 27 Sep 2012 10:06:38 +1000 Date: Thu, 27 Sep 2012 10:06:38 +1000 From: Dave Chinner To: Dmitry Monakhov Cc: linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org, hch@lst.de, xfs@oss.sgi.com Subject: Re: [PATCH 2/6] xfstest: add configurable load factors Message-ID: <20120927000638.GC15236@dastard> X-ASG-Orig-Subj: Re: [PATCH 2/6] xfstest: add configurable load factors References: <1348496601-32637-1-git-send-email-dmonakhov@openvz.org> <1348496601-32637-2-git-send-email-dmonakhov@openvz.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1348496601-32637-2-git-send-email-dmonakhov@openvz.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1348704399 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109682 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Sep 24, 2012 at 06:23:17PM +0400, Dmitry Monakhov wrote: > Most stress test has probable behaviour, the longer test run the > larger corner cases will be cover. It is reasonable to allow > user to provide some sort of system load factor. > This patch introduce two global variables > LOAD_FACTOR: Usually means factor number of running tasks > TIME_FACTOR: Usually means factor of run time, or number of operations > If not speficied both variables defined to 1, so original behaviour > preserved. > > TODO: Change all stress tests to use this variables > > Signed-off-by: Dmitry Monakhov > --- > common.config | 8 ++++++++ > 1 files changed, 8 insertions(+), 0 deletions(-) > > diff --git a/common.config b/common.config > index d5c8956..cfa7bde 100644 > --- a/common.config > +++ b/common.config > @@ -253,5 +253,13 @@ if [ ! -z "$SCRATCH_MNT" -a ! -d "$SCRATCH_MNT" ]; then > exit 1 > fi > > +if [ -z "$LOAD_FACTOR" ]; then > + LOAD_FACTOR=1 > +fi > + > +if [ -z "$TIME_FACTOR" ]; then > + TIME_FACTOR=1 > +fi They probably need to be exparted variables set up through the check script, not somthing sourced via common.config. i.e. something like this in check where the environment is being set up: export TIME_FACTOR=${TIME_FACTOR:=1} export LOAD_FACTOR=${LOAD_FACTOR:=1} Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Sep 26 19:18:04 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8R0I3nB013312 for ; Wed, 26 Sep 2012 19:18:03 -0500 X-ASG-Debug-ID: 1348705161-04bdf0289a1c8c0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id xZOoBJBJTizmyo2Z for ; Wed, 26 Sep 2012 17:19:21 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqMMAHaaY1B5LPfb/2dsb2JhbABFvUgBAoEOgQmCIAEBBTocIxAIAw4KLhQlAyETiAS3fxSLBGxKg3NgA5VokCyCeQ Received: from ppp121-44-247-219.lns20.syd7.internode.on.net (HELO dastard) ([121.44.247.219]) by ipmail06.adl6.internode.on.net with ESMTP; 27 Sep 2012 09:49:20 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TH1p1-00041y-QY; Thu, 27 Sep 2012 10:19:19 +1000 Date: Thu, 27 Sep 2012 10:19:19 +1000 From: Dave Chinner To: Dmitry Monakhov Cc: linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org, hch@lst.de, xfs@oss.sgi.com Subject: Re: [PATCH 3/6] xfstest: allow fsstress to use load factor where appropriate Message-ID: <20120927001919.GD15236@dastard> X-ASG-Orig-Subj: Re: [PATCH 3/6] xfstest: allow fsstress to use load factor where appropriate References: <1348496601-32637-1-git-send-email-dmonakhov@openvz.org> <1348496601-32637-3-git-send-email-dmonakhov@openvz.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1348496601-32637-3-git-send-email-dmonakhov@openvz.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1348705161 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109682 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Sep 24, 2012 at 06:23:18PM +0400, Dmitry Monakhov wrote: > > Signed-off-by: Dmitry Monakhov > --- > 017 | 5 ++++- > 068 | 4 ++-- > 070 | 4 +++- > 076 | 5 ++++- > 083 | 4 ++-- > 087 | 10 ++++++---- > 104 | 4 ++-- > 114 | 5 +++-- > 167 | 4 ++-- > 232 | 5 +++-- > 233 | 5 +++-- > 269 | 7 ++++--- > 270 | 7 ++++--- > 276 | 11 ++++++----- > 14 files changed, 48 insertions(+), 32 deletions(-) > > diff --git a/017 b/017 > index 9ca0e72..8d35ee8 100755 > --- a/017 > +++ b/017 > @@ -67,7 +67,10 @@ echo "*** test" > for l in 0 1 2 3 4 > do > echo " *** test $l" > - $FSSTRESS_PROG -d $SCRATCH_MNT -n 1000 $FSSTRESS_AVOID >>$seq.full > + NUM=$((1000 * TIME_FACTOR)) $TIME_FACTOR, perhaps? > + CPU=$((1 * LOAD_FACTOR)) > + $FSSTRESS_PROG -d $SCRATCH_MNT -n $NUM -p $CPU \ > + $FSSTRESS_AVOID >>$seq.full I'd much prefer a wrapper around fsstress than have to code this into every test. Something like: run_fstress() { args="" while [ $# -gt 0 ]; do case "$1" in -n) args="$args $1 $(($2 * $TIME_FACTOR))"; shift ;; -p) args="$args $1 $(($2 * $LOAD_FACTOR))"; shift ;; *) args="$args $1" ;; esac shift done $FSSTRESS_PROG $args } And so all you need to do is something like: $ sed -i 's/\$FSSTRESS_PROG/run_fsstress/' [0-9][0-9][0-9] To convert all tests that use fsstress to do this. You might also want to do this for the tests that run dirstress as well, and create a "stress" group so that you can run just the stress tests easily.... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Sep 26 19:18:53 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8R0IrkW013496 for ; Wed, 26 Sep 2012 19:18:53 -0500 X-ASG-Debug-ID: 1348705210-04cbb069c41a020001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id 6RZxczEXzay2YTOS for ; Wed, 26 Sep 2012 17:20:11 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqMMAHaaY1B5LPfb/2dsb2JhbABFvUgBAoEOgQmCIAEBBTocIxAIAw4KLhQlAyETiAS3fxSLBGxKg3NgA5VokCyCeQ Received: from ppp121-44-247-219.lns20.syd7.internode.on.net (HELO dastard) ([121.44.247.219]) by ipmail06.adl6.internode.on.net with ESMTP; 27 Sep 2012 09:50:10 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TH1pf-000427-Dr; Thu, 27 Sep 2012 10:19:59 +1000 Date: Thu, 27 Sep 2012 10:19:59 +1000 From: Dave Chinner To: Dmitry Monakhov Cc: linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org, hch@lst.de, xfs@oss.sgi.com Subject: Re: [PATCH 1/6] xfstests: add fio requirement V2 Message-ID: <20120927001959.GE15236@dastard> X-ASG-Orig-Subj: Re: [PATCH 1/6] xfstests: add fio requirement V2 References: <1348496601-32637-1-git-send-email-dmonakhov@openvz.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1348496601-32637-1-git-send-email-dmonakhov@openvz.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1348705210 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109684 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Sep 24, 2012 at 06:23:16PM +0400, Dmitry Monakhov wrote: > FIO is very flexible io generator, i would call it IO swiss knife. > Currently we have tonns of hardcoded application which reproduces > some predefined scenario. This approach has obvious dissadvantages > 1) Lack of flexability: one written it is hard to modify it in future > 2) Code base is large, many routines written again and again > > At the same time add new fio based tast is just add simle INI file. > This greatly simplify code review. I do beleve that some day we will > replace most of hardcoded io binaries with fio. > > One who is planning to run $FIO_PROG should first check that system > contains appropriate version which is able to handle jobfile > for example: _require_fio 286-job.fio > > Signed-off-by: Dmitry Monakhov Looks good. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Sep 26 20:04:15 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_62 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8R14FdW020295 for ; Wed, 26 Sep 2012 20:04:15 -0500 X-ASG-Debug-ID: 1348707932-04bdf0289a1e900001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id a7fDAPC8nzyjnBWM for ; Wed, 26 Sep 2012 18:05:32 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqQMAHWlY1B5LPfb/2dsb2JhbABFvHgBAoEQgQmCIAEBAQQBAjccIxAIAw4KLhQUEQMhE4gEDLd7FIsEHFBKg3NgA5M8giyBFo8WgnmBSQ Received: from ppp121-44-247-219.lns20.syd7.internode.on.net (HELO dastard) ([121.44.247.219]) by ipmail06.adl6.internode.on.net with ESMTP; 27 Sep 2012 10:35:22 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TH2XV-00046j-Hg; Thu, 27 Sep 2012 11:05:17 +1000 Date: Thu, 27 Sep 2012 11:05:12 +1000 From: Dave Chinner To: Dmitry Monakhov Cc: linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, hch@lst.de Subject: Re: [PATCH 4/6] add fallocate/truncate vs AIO/DIO stress test Message-ID: <20120927010512.GF15236@dastard> X-ASG-Orig-Subj: Re: [PATCH 4/6] add fallocate/truncate vs AIO/DIO stress test References: <1348496601-32637-1-git-send-email-dmonakhov@openvz.org> <1348496601-32637-4-git-send-email-dmonakhov@openvz.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1348496601-32637-4-git-send-email-dmonakhov@openvz.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1348707932 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109686 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Sep 24, 2012 at 06:23:19PM +0400, Dmitry Monakhov wrote: > Run DIO, fallocate and truncate threads on a common file in parallel. > If race exist old dio request may rewrite blocks after it was allocated > to another file, we will catch that by verifying blocks content. > > this patch known to catch deadlock for ext4 > http://lists.openwall.net/linux-ext4/2012/09/06/3 > > Signed-off-by: Dmitry Monakhov > --- > 286 | 154 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > 286.out | 5 ++ > group | 1 + > 3 files changed, 160 insertions(+), 0 deletions(-) > create mode 100755 286 > create mode 100644 286.out > > diff --git a/286 b/286 > new file mode 100755 > index 0000000..8802c56 > --- /dev/null > +++ b/286 > @@ -0,0 +1,154 @@ > +#! /bin/bash > +# FSQA Test No. 286 > +# > +# Test various aio dio vs truncate Can you add a better description of what the test is supposed to do here? The commit message above would be a good start. .... > + > +here=`pwd` > +tmp=/tmp/$$ > +status=1 # failure is the default! > +trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15 > + > +# get standard environment, filters and checks > +. ./common.rc > +. ./common.filter > +run_check() > +{ > + echo "# $@" >> $seq.full 2>&1 > + "$@" >> $seq.full 2>&1 || _fail "failed: '$@'" > +} run-check is being copied from test to test. Can you move it to common.rc? > + > + > +NUM_JOBS=$((4*LOAD_FACTOR)) > +BLK_DEV_SIZE=`blockdev --getsz $SCRATCH_DEV` > +FILE_SIZE=$((BLK_DEV_SIZE * 512)) > + > +cat >$tmp-$seq.fio < +_supported_fs generic > +_supported_os Linux > +_need_to_be_root > +_require_scratch ..... > +## Perform direct aio, to files which may be truncated > +## by external task > +[direct_aio] > +direct=1 > +buffered=0 > +numjobs=${NUM_JOBS} > +rw=randwrite > +runtime=100*${TIME_FACTOR} > +time_based ..... > +_workout() > +{ > + echo "" > + echo "Run fio with random aio-dio pattern" > + echo "" > + cat $tmp-$seq.fio >> $seq.full > + run_check $FIO_PROG $tmp-$seq.fio >> $seq.full & > + pid=$! > + echo "Start fallocate/truncate loop" > + for ((i=0; ; i++)) > + do > + for ((k=1; k <= NUM_JOBS; k++)) > + do > + fallocate -l $FILE_SIZE $SCRATCH_MNT/direct_aio.$k.0 \ > + >> $seq.full 2>&1 > + done It's not clear to me where the file names come from. I think it's because the FIO job takes the name of the file if it's not specified from the job name (i.e. [direct_aio]). If so, can you make that a variable and comment to the effect that the filenames are derived from the FIO job definition? > + for ((k=1; k <= NUM_JOBS; k++)) > + do > + truncate -s 0 $SCRATCH_MNT/direct_aio.$k.0 > + done > + # One fio exit we can stop fallocate/truncate loop Once? > + kill -0 $pid > /dev/null 2>&1 || break /me has to look up what kill -0 does, as 0 is not a valid signal number. The kill(1) man page doesn't document it, kill -l doesn't list 0 as a valid signal, and signal(7) doesn't document it either. Wonderful! Oh, there it is - in the syscall documentation (i.e. kill(2)): "this can be used to check for the existence of a process ID" Right, OK, now I understand the loop. :) .... > +_scratch_mkfs >> $seq.full 2>&1 > +_scratch_mount > + > +if ! _workout; then > + umount $SCRATCH_DEV 2>/dev/null > + exit > +fi No need to unmount the SCRATCH_DEV on exit - that will happen if necessary next time _require_scratch is called by a test.... > + > +if ! _scratch_unmount; then > + echo "failed to umount" > + status=1 > + exit > +fi No need to unmount before checking, the _check_scratch_fs function does that for you and will leave unmount errors in the log if it fails. i.e. the test will fail the check and the reason will be obvious from the output... > +_check_scratch_fs > +status=$? > +exit > diff --git a/286.out b/286.out > new file mode 100644 > index 0000000..d721996 > --- /dev/null > +++ b/286.out > @@ -0,0 +1,5 @@ > +QA output created by 286 > + > +Run fio with random aio-dio pattern > + > +Start fallocate/truncate loop > diff --git a/group b/group > index 697269b..2469f80 100644 > --- a/group > +++ b/group > @@ -404,3 +404,4 @@ deprecated > 283 dump ioctl auto quick > 284 auto > 285 auto dump quota quick > +286 auto rw enospc aio Why the ENOSPC group? I don't see anything that exercises ENOSPC behaviour in the test, and none of the comments indicate that it Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Sep 26 20:07:06 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8R175YQ020654 for ; Wed, 26 Sep 2012 20:07:05 -0500 X-ASG-Debug-ID: 1348708103-04bdf0289d1ebe0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id bymvYlavmWyrWXvU for ; Wed, 26 Sep 2012 18:08:23 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqMMAImmY1B5LPfb/2dsb2JhbABFvHgBAoEQgQmCIAEBBTocIxAIAw4KLhQlAyETiAS4BxSLBGxKhFMDlWiJPYZvgnk Received: from ppp121-44-247-219.lns20.syd7.internode.on.net (HELO dastard) ([121.44.247.219]) by ipmail06.adl6.internode.on.net with ESMTP; 27 Sep 2012 10:37:51 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TH2Zx-00046u-M2; Thu, 27 Sep 2012 11:07:49 +1000 Date: Thu, 27 Sep 2012 11:07:49 +1000 From: Dave Chinner To: Dmitry Monakhov Cc: linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, hch@lst.de Subject: Re: [PATCH 5/6] add fallocate/punch_hole vs AIO/DIO stress test Message-ID: <20120927010749.GG15236@dastard> X-ASG-Orig-Subj: Re: [PATCH 5/6] add fallocate/punch_hole vs AIO/DIO stress test References: <1348496601-32637-1-git-send-email-dmonakhov@openvz.org> <1348496601-32637-5-git-send-email-dmonakhov@openvz.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1348496601-32637-5-git-send-email-dmonakhov@openvz.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1348708103 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109686 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Sep 24, 2012 at 06:23:20PM +0400, Dmitry Monakhov wrote: > Run DIO, fallocate and punch_hole threads on a common file in parallel. > If race exist old dio request may rewrite punched block after it was > allocated to another file, we will catch that by verifying blocks content. > > Signed-off-by: Dmitry Monakhov Same comments as for the previous patch. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Wed Sep 26 20:14:06 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,J_CHICKENPOX_16, J_CHICKENPOX_36 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8R1E6tN021250 for ; Wed, 26 Sep 2012 20:14:06 -0500 X-ASG-Debug-ID: 1348708523-04cbb069c31c7e0001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id EB2d9t4LLLhu8QIU for ; Wed, 26 Sep 2012 18:15:24 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqMMAOanY1B5LPfb/2dsb2JhbABFvHgBAoEQgQmCIAEBBTocIxAIAw4KLhQlAyETiAS4CBSLBGxKhFMDlWiQLIJ5 Received: from ppp121-44-247-219.lns20.syd7.internode.on.net (HELO dastard) ([121.44.247.219]) by ipmail06.adl6.internode.on.net with ESMTP; 27 Sep 2012 10:45:23 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TH2hG-000487-I2; Thu, 27 Sep 2012 11:15:22 +1000 Date: Thu, 27 Sep 2012 11:15:22 +1000 From: Dave Chinner To: Dmitry Monakhov Cc: linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org, hch@lst.de, xfs@oss.sgi.com Subject: Re: [PATCH 6/6] add defragmentation stress test for ext4 Message-ID: <20120927011522.GH15236@dastard> X-ASG-Orig-Subj: Re: [PATCH 6/6] add defragmentation stress test for ext4 References: <1348496601-32637-1-git-send-email-dmonakhov@openvz.org> <1348496601-32637-6-git-send-email-dmonakhov@openvz.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1348496601-32637-6-git-send-email-dmonakhov@openvz.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1348708523 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109686 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Mon, Sep 24, 2012 at 06:23:21PM +0400, Dmitry Monakhov wrote: > Perform various regression tests for ext4defrag subsystem > > Test1: Defragment file while other task does direct AIO > Test2: Perform defragmentation on file under buffered AIO > while third task does direct AIO to donor file > Test3: Two defrag tasks use common donor file. > Test4: Stress defragmentation. Several threads pefrorm > fragmentation at random position use inplace=1 will > allocate and free blocks inside defrag event improve > load pressure. Please do these as 4 separate tests so that it is easy to isolate/reproduce failures caused by a specific test that is being run. Same comments as previous two patches, as well. > +_workout() > +{ > + echo "" > + echo " Start defragment activity " > + echo "" > + cat $tmp-$seq.fio >> $seq.full > + run_check $FIO_PROG $tmp-$seq.fio >> $seq.full > +} > + > +# real QA test starts here > +_supported_fs generic > +_supported_os Linux > +_supported_fs ext4 > +_need_to_be_root > +_require_scratch > +_require_fio $tmp-$seq.fio Even though e4defrag is not used, it's probably still a good idea to call _require_defrag to check for systems that have a recent enough ext4 to run defrag on. e.g. a recent fio on an old distro might result in fio saying "I understand this job file" but then not be able to run defrag... Cheers, Dave. -- Dave Chinner david@fromorbit.com From xfs@tlinx.org Thu Sep 27 06:38:20 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_42 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8RBcKH9089427 for ; Thu, 27 Sep 2012 06:38:20 -0500 X-ASG-Debug-ID: 1348745978-04cb6c794231c90001-NocioJ Received: from Ishtar.sc.tlinx.org (ishtar.tlinx.org [173.164.175.65]) by cuda.sgi.com with ESMTP id CGbwcZ9s5TMGnJCk (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Thu, 27 Sep 2012 04:39:38 -0700 (PDT) X-Barracuda-Envelope-From: xfs@tlinx.org X-Barracuda-Apparent-Source-IP: 173.164.175.65 Received: from [192.168.3.12] (Athenae [192.168.3.12]) by Ishtar.sc.tlinx.org (8.14.5/8.14.4/SuSE Linux 0.8) with ESMTP id q8RBdZfP002223 for ; Thu, 27 Sep 2012 04:39:37 -0700 Message-ID: <50643AF7.7060106@tlinx.org> Date: Thu, 27 Sep 2012 04:39:35 -0700 From: Linda Walsh User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.24) Gecko/20100228 Lightning/0.9 Thunderbird/2.0.0.24 Mnenhy/0.7.6.666 MIME-Version: 1.0 To: xfs-oss Subject: more efficient way to print out inode->block mappings? Content-Type: text/plain; charset=UTF-8; format=flowed X-ASG-Orig-Subj: more efficient way to print out inode->block mappings? Content-Transfer-Encoding: 7bit X-Barracuda-Connect: ishtar.tlinx.org[173.164.175.65] X-Barracuda-Start-Time: 1348745978 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109727 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- I want to be able to rapidly determine the diffs between 2 volumes. Special note 1 is an active lvm snapshot of the other -- meaning it is frozen in time, but otherwise should look identical the the file system as it was when it was snapped. Sooo... a way of speeding checks is finding out what blocks allocated to the indoes are different, since as the new volume gets used, I had hoped that differing block numbers might give me a clue as to what had changed.. I'm thinking though, that the block numbers that will change will be the ones in lvm -- not xfs. So this probably isn't as useful as i'd hoped. Nevertheless, trying to read the blocks allocated/inode with bmap is sorta slow. I've tried to optimize it by starting a pty session to xfs_db and issuing inode/bmap commands -- but I have to wait for a prompt to come back to know that the command has finished, and I'm not really sure it's really returning more than 1 line for any file. -- though interactively, I can find a file with a large ACL, and see it has both a data and attr bmap. I also haven't seen what output would look like if the file(or dir) was split -- as, so far, have only seen files/dirs returned that have 1 allocation/file, So what the means is that I'm not sure about synchronization between commands output and the input I read in -- even though I read in the input after every command. -- but even with a minimal timeout of 1ms, and keeping track of commands outstanding and replies (as measured by 'prompts' recieved, I'm far from convinced it's doing the right thing -- and it still slow going 1 inode at a time over a pty interface. I thought of trying to use blockget -v and parsing the output. I figured that would have the least latency and likely be the fastest way to dump the mappings -- BUT it seems I can't get it to work on an active file system. So how can I get that block info dumped without blockget? I've already told blockget it's in -r only mode... so it shouldn't try to repair inconsistencies...and 99.999% is going to be what I want and any inconsistencies, I can check manually be checking the files through the mounted interface. Oddly, and likely I'm confused about something, but when i try to print the log/log_print, it says it is an invalid log 1 byte long, so even if it were played out, I don't think it would make much difference in the final results. Is it possible to do what I want w/o writing a special util/C prog to dump this? From jeffpc@josefsipek.net Thu Sep 27 07:47:58 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8RClwco094718 for ; Thu, 27 Sep 2012 07:47:58 -0500 X-ASG-Debug-ID: 1348750156-04cbb069c435f00001-NocioJ Received: from josefsipek.net (josefsipek.net [64.9.206.49]) by cuda.sgi.com with ESMTP id syAgvXlLnOdw4QE8 for ; Thu, 27 Sep 2012 05:49:17 -0700 (PDT) X-Barracuda-Envelope-From: jeffpc@josefsipek.net X-Barracuda-Apparent-Source-IP: 64.9.206.49 Received: from poseidon (50-77-229-18-static.hfc.comcastbusiness.net [50.77.229.18]) by josefsipek.net (Postfix) with ESMTPSA id A8D1511260; Thu, 27 Sep 2012 08:49:16 -0400 (EDT) Date: Thu, 27 Sep 2012 08:49:15 -0400 From: "Josef 'Jeff' Sipek" To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: task blocked for more than 120 seconds Message-ID: <20120927124914.GD28852@poseidon> X-ASG-Orig-Subj: Re: task blocked for more than 120 seconds References: <20120418151139.GC4652@poseidon.cudanet.local> <20120418234821.GR6734@dastard> <20120419154601.GB8230@poseidon.cudanet.local> <20120419225603.GA9541@dastard> <20120420135820.GB9189@poseidon.cudanet.local> <20120421002932.GG9541@dastard> <20120423202441.GD21260@poseidon.cudanet.local> <20120423232759.GO9541@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20120423232759.GO9541@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: josefsipek.net[64.9.206.49] X-Barracuda-Start-Time: 1348750157 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109733 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Apr 24, 2012 at 09:27:59AM +1000, Dave Chinner wrote: ... > So, yes, your hangs are definitely due to inode buffer RMW cycles > when trying to flush dirty inodes from the cache. I have a few > ideas on how to fix this - but I'm not sure whether a current TOT > solution will be easily back-portable. The simplest solution is a > readahead based solution - AIL pushing is async, and will cycle back > to inodes that it failed to flush the first time past, so triggering > readahead on the first pass might work just fine. Have you had time to look at this? (We got bitten by this again and I really don't want to go back to ext4.) Is there anything I can help with? Jeff. -- Evolution, n.: A hypothetical process whereby infinitely improbable events occur with alarming frequency, order arises from chaos, and no one is given credit. From tinguely@sgi.com Thu Sep 27 08:09:02 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_46 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8RD91PS097861 for ; Thu, 27 Sep 2012 08:09:02 -0500 Received: from eagdhcp-232-125.americas.sgi.com (eagdhcp-232-125.americas.sgi.com [128.162.232.125]) by relay3.corp.sgi.com (Postfix) with ESMTP id 38BA8AC002; Thu, 27 Sep 2012 06:10:18 -0700 (PDT) Received: from eagdhcp-232-125.americas.sgi.com (localhost [127.0.0.1]) by eagdhcp-232-125.americas.sgi.com (8.14.5/8.14.5) with ESMTP id q8RDABbQ011090; Thu, 27 Sep 2012 08:10:11 -0500 (CDT) (envelope-from tinguely@sgi.com) Received: (from tinguely@localhost) by eagdhcp-232-125.americas.sgi.com (8.14.5/8.14.5/Submit) id q8RDABlc011089; Thu, 27 Sep 2012 08:10:11 -0500 (CDT) (envelope-from tinguely@sgi.com) X-Authentication-Warning: eagdhcp-232-125.americas.sgi.com: tinguely set sender to tinguely@sgi.com using -f Message-Id: <20120927124742.695778439@sgi.com> User-Agent: quilt/0.51-1 Date: Thu, 27 Sep 2012 07:47:36 -0500 From: Mark Tinguely To: xfs@oss.sgi.com Cc: Ben Myers Subject: [PATCH v2] xfsprog: remove duplicate vector memalign from xfs_io References: <20120925142414.660506845@sgi.com> <20120925142421.398175185@sgi.com> <20120926220434.GG13214@sgi.com> Content-Disposition: inline; filename=v2-xfsprogs-io_remove_duplicate_vector_memalign.patch The vector feature of xfs_io uses its own memory buffer in the iov structure and does not use the buffer entry. Remove the duplicate memalign. v2: removed global buffer in __dump_buffer() and use passed buf pointer per Ben's detection. Signed-off-by: Mark Tinguely Reviewed-by: Ben Myers --- io/pread.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) Index: b/io/pread.c =================================================================== --- a/io/pread.c +++ b/io/pread.c @@ -76,8 +76,7 @@ alloc_iovec( buffersize = 0; for (i = 0; i < vectors; i++) { iov[i].iov_base = memalign(pagesize, bsize); - buffer = memalign(pagesize, bsize); - if (!buffer) { + if (!iov[i].iov_base) { perror("memalign"); goto unwind; } @@ -130,7 +129,7 @@ __dump_buffer( int i, j; char *p; - for (i = 0, p = (char *)buffer; i < len; i += 16) { + for (i = 0, p = (char *)buf; i < len; i += 16) { char *s = p; printf("%08llx: ", (unsigned long long)offset + i); From bpm@sgi.com Thu Sep 27 09:58:14 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_46 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay3.corp.sgi.com [198.149.34.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8REwELp108552 for ; Thu, 27 Sep 2012 09:58:14 -0500 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay3.corp.sgi.com (Postfix) with ESMTP id 7D20AAC002; Thu, 27 Sep 2012 07:59:30 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id EA0984266DC; Thu, 27 Sep 2012 09:59:29 -0500 (CDT) Date: Thu, 27 Sep 2012 09:59:29 -0500 From: Ben Myers To: Dave Chinner Cc: Mark Tinguely , xfs@oss.sgi.com Subject: Re: [PATCH] xfsprog: remove duplicate vector memalign from xfs_io Message-ID: <20120927145929.GU25175@sgi.com> References: <20120925142414.660506845@sgi.com> <20120925142421.398175185@sgi.com> <20120926220434.GG13214@sgi.com> <20120927000101.GB15236@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20120927000101.GB15236@dastard> User-Agent: Mutt/1.5.20 (2009-06-14) Hey Dave, On Thu, Sep 27, 2012 at 10:01:01AM +1000, Dave Chinner wrote: > On Wed, Sep 26, 2012 at 05:04:34PM -0500, Ben Myers wrote: > > On Tue, Sep 25, 2012 at 09:24:15AM -0500, Mark Tinguely wrote: > > > The vector feature of xfs_io uses its own memory buffer in the iov structure > > > and does not use the buffer entry. Remove the duplicate memalign. > > > > Looks to me that there is a usage of buffer in __dump_buffer. However, > > I suspect there shouldn't be. I suggest (untested,ymmv,ianal,etc): > > > > :!quilt di > > Index: xfsprogs/io/pread.c > > =================================================================== > > --- xfsprogs.orig/io/pread.c > > +++ xfsprogs/io/pread.c > > @@ -130,7 +130,7 @@ __dump_buffer( > > int i, j; > > char *p; > > > > - for (i = 0, p = (char *)buffer; i < len; i += 16) { > > + for (i = 0, p = (char *)buf; i < len; i += 16) { > > char *s = p; > > > > printf("%08llx: ", (unsigned long long)offset + i); > > Can you post that as a proper patch? Looks like Mark posted it in v2. ;) -Ben From bpm@sgi.com Thu Sep 27 10:04:26 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8RF4Qh2109140 for ; Thu, 27 Sep 2012 10:04:26 -0500 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay1.corp.sgi.com (Postfix) with ESMTP id DACE58F808E; Thu, 27 Sep 2012 08:05:42 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id AADD44266DC; Thu, 27 Sep 2012 10:05:42 -0500 (CDT) Date: Thu, 27 Sep 2012 10:05:42 -0500 From: Ben Myers To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: [PATCH v2] xfsprog: remove duplicate vector memalign from xfs_io Message-ID: <20120927150542.GH13214@sgi.com> References: <20120925142414.660506845@sgi.com> <20120925142421.398175185@sgi.com> <20120926220434.GG13214@sgi.com> <20120927124742.695778439@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20120927124742.695778439@sgi.com> User-Agent: Mutt/1.5.20 (2009-06-14) On Thu, Sep 27, 2012 at 07:47:36AM -0500, Mark Tinguely wrote: > The vector feature of xfs_io uses its own memory buffer in the iov structure > and does not use the buffer entry. Remove the duplicate memalign. > > v2: removed global buffer in __dump_buffer() and use passed buf pointer per > Ben's detection. > > Signed-off-by: Mark Tinguely > Reviewed-by: Ben Myers Still looks good. Don't forget to update the subject to xfsprogs. Also the line width looks like it might wrap. -Ben From bpm@sgi.com Thu Sep 27 10:32:59 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_42 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8RFWx2B111503 for ; Thu, 27 Sep 2012 10:32:59 -0500 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay2.corp.sgi.com (Postfix) with ESMTP id 1527D304032; Thu, 27 Sep 2012 08:34:16 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id C52774266DC; Thu, 27 Sep 2012 10:34:15 -0500 (CDT) Date: Thu, 27 Sep 2012 10:34:15 -0500 From: Ben Myers To: Linda Walsh Cc: xfs-oss Subject: Re: more efficient way to print out inode->block mappings? Message-ID: <20120927153415.GI13214@sgi.com> References: <50643AF7.7060106@tlinx.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50643AF7.7060106@tlinx.org> User-Agent: Mutt/1.5.20 (2009-06-14) Hey Linda, On Thu, Sep 27, 2012 at 04:39:35AM -0700, Linda Walsh wrote: > I want to be able to rapidly determine the diffs between 2 volumes. > > Special note 1 is an active lvm snapshot of the other -- meaning it is > frozen in time, but otherwise should look identical the the file system > as it was when it was snapped. > > Sooo... a way of speeding checks is finding out what blocks allocated to the indoes > are different, since as the new volume gets used, I had hoped that differing > block numbers might give me a clue as to what had changed.. Differing block maps for the same inode on the two filesystems will give you a clue that there are changes but it isn't perfect: Consider xfs_fsr. This might change block numbers for a file but the contents stayed the same. Also consider an overwrite situation. The contents of the file are overwritten and have changed but the block map stayed the same. To detect that we'd need some kind of generation number on every extent, and we don't have that. At this time I don't think we have a solid way to tell you which blocks of a file are different without actually comparing them. I think you are stuck looking at the mtime and then doing a full comparison. Have you looked into using the xfs bulkstat ioctl interfaces? XFS_IOC_FSBULKSTAT won't get you the block map, but maybe it would be useful to you. xfs_bmap is using XFS_IOC_GETBMAP*, but it sounds like you've already considered that. Maybe a creative invocation of xfsdump? Let me know if I misunderstood and went off the rails. ;) HTH, Ben > Nevertheless, trying to read the blocks allocated/inode with bmap is sorta slow. > I've tried to optimize it by starting a pty session to xfs_db and issuing inode/bmap > commands -- but I have to wait for a prompt to come back to know that the command > has finished, and I'm not really sure it's really returning more than 1 line > for any file. -- though interactively, I can find a file with a large ACL, and see > it has both a data and attr bmap. I also haven't seen what output would look like > if the file(or dir) was split -- as, so far, have only seen > files/dirs returned that > have 1 allocation/file, > > So what the means is that I'm not sure about synchronization between commands output > and the input I read in -- even though I read in the input after > every command. -- but even with > a minimal timeout of 1ms, and keeping track of commands outstanding > and replies (as measured > by 'prompts' recieved, I'm far from convinced it's doing the right > thing -- and it still > slow going 1 inode at a time over a pty interface. > > I thought of trying to use blockget -v and parsing the output. I > figured that would > have the least latency and likely be the fastest way to dump the mappings -- BUT > it seems I can't get it to work on an active file system. So how > can I get that block > info dumped without blockget? I've already told blockget it's in -r > only mode... so it > shouldn't try to repair inconsistencies...and 99.999% is going to be > what I want and any > inconsistencies, I can check manually be checking the files through > the mounted interface. > > Oddly, and likely I'm confused about something, but when i try to > print the log/log_print, > it says it is an invalid log 1 byte long, so even if it were played out, I don't > think it would make much difference in the final results. > > Is it possible to do what I want w/o writing a special util/C prog to dump this? > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From bfoster@redhat.com Thu Sep 27 12:42:54 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.9 required=5.0 tests=BAYES_00,LOCAL_GNU_PATCH autolearn=unavailable version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8RHgsQw121762 for ; Thu, 27 Sep 2012 12:42:54 -0500 X-ASG-Debug-ID: 1348767853-04cb6c794143aa0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id UFuqUgO8CozNEML9 for ; Thu, 27 Sep 2012 10:44:13 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8RHiDQm008553 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 27 Sep 2012 13:44:13 -0400 Received: from bfoster.bfoster ([10.16.225.83]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q8RHiCRO026809 for ; Thu, 27 Sep 2012 13:44:12 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 726B6121339; Thu, 27 Sep 2012 13:45:53 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v4 1/8] xfs: add EOFBLOCKS inode tagging/untagging Date: Thu, 27 Sep 2012 13:45:45 -0400 X-ASG-Orig-Subj: [PATCH v4 1/8] xfs: add EOFBLOCKS inode tagging/untagging Message-Id: <1348767952-24229-2-git-send-email-bfoster@redhat.com> In-Reply-To: <1348767952-24229-1-git-send-email-bfoster@redhat.com> References: <1348767952-24229-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1348767853 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com Add the XFS_ICI_EOFBLOCKS_TAG inode tag to identify inodes with speculatively preallocated blocks beyond EOF. An inode is tagged when speculative preallocation occurs and untagged either via truncate down or when post-EOF blocks are freed via release or reclaim. The tag management is intentionally not aggressive to prefer simplicity over the complexity of handling all the corner cases under which post-EOF blocks could be freed (i.e., forward truncation, fallocate, write error conditions, etc.). This means that a tagged inode may or may not have post-EOF blocks after a period of time. The tag is eventually cleared when the inode is released or reclaimed. Signed-off-by: Brian Foster --- fs/xfs/xfs_ag.h | 1 + fs/xfs/xfs_iomap.c | 7 +++++ fs/xfs/xfs_iops.c | 3 ++ fs/xfs/xfs_sync.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_sync.h | 3 ++ fs/xfs/xfs_trace.h | 5 ++++ fs/xfs/xfs_vnodeops.c | 2 + 7 files changed, 83 insertions(+), 0 deletions(-) diff --git a/fs/xfs/xfs_ag.h b/fs/xfs/xfs_ag.h index 44d65c1..22bd4db 100644 --- a/fs/xfs/xfs_ag.h +++ b/fs/xfs/xfs_ag.h @@ -233,6 +233,7 @@ typedef struct xfs_perag { #define XFS_ICI_NO_TAG (-1) /* special flag for an untagged lookup in xfs_inode_ag_iterator */ #define XFS_ICI_RECLAIM_TAG 0 /* inode is to be reclaimed */ +#define XFS_ICI_EOFBLOCKS_TAG 1 /* inode has blocks beyond EOF */ #define XFS_AG_MAXLEVELS(mp) ((mp)->m_ag_maxlevels) #define XFS_MIN_FREELIST_RAW(bl,cl,mp) \ diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index 973dff6..2968ee8 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -459,6 +459,13 @@ retry: if (!(imap[0].br_startblock || XFS_IS_REALTIME_INODE(ip))) return xfs_alert_fsblock_zero(ip, &imap[0]); + /* + * Tag the inode as speculatively preallocated so we can reclaim this + * space on demand, if necessary. + */ + if (prealloc) + xfs_inode_set_eofblocks_tag(ip); + *ret_imap = imap[0]; return 0; } diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index 4e00cf0..dcd1d5f 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -854,6 +854,9 @@ xfs_setattr_size( * and do not wait the usual (long) time for writeout. */ xfs_iflags_set(ip, XFS_ITRUNCATED); + + /* A truncate down always removes post-EOF blocks. */ + xfs_inode_clear_eofblocks_tag(ip); } if (mask & ATTR_CTIME) { diff --git a/fs/xfs/xfs_sync.c b/fs/xfs/xfs_sync.c index 9654817..00c6224 100644 --- a/fs/xfs/xfs_sync.c +++ b/fs/xfs/xfs_sync.c @@ -971,3 +971,65 @@ xfs_reclaim_inodes_count( return reclaimable; } +void +xfs_inode_set_eofblocks_tag( + xfs_inode_t *ip) +{ + struct xfs_mount *mp = ip->i_mount; + struct xfs_perag *pag; + int tagged; + + pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, ip->i_ino)); + spin_lock(&pag->pag_ici_lock); + trace_xfs_inode_set_eofblocks_tag(ip); + + tagged = radix_tree_tagged(&pag->pag_ici_root, + XFS_ICI_EOFBLOCKS_TAG); + radix_tree_tag_set(&pag->pag_ici_root, + XFS_INO_TO_AGINO(ip->i_mount, ip->i_ino), + XFS_ICI_EOFBLOCKS_TAG); + if (!tagged) { + /* propagate the eofblocks tag up into the perag radix tree */ + spin_lock(&ip->i_mount->m_perag_lock); + radix_tree_tag_set(&ip->i_mount->m_perag_tree, + XFS_INO_TO_AGNO(ip->i_mount, ip->i_ino), + XFS_ICI_EOFBLOCKS_TAG); + spin_unlock(&ip->i_mount->m_perag_lock); + + trace_xfs_perag_set_eofblocks(ip->i_mount, pag->pag_agno, + -1, _RET_IP_); + } + + spin_unlock(&pag->pag_ici_lock); + xfs_perag_put(pag); +} + +void +xfs_inode_clear_eofblocks_tag( + xfs_inode_t *ip) +{ + struct xfs_mount *mp = ip->i_mount; + struct xfs_perag *pag; + + pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, ip->i_ino)); + spin_lock(&pag->pag_ici_lock); + trace_xfs_inode_clear_eofblocks_tag(ip); + + radix_tree_tag_clear(&pag->pag_ici_root, + XFS_INO_TO_AGINO(ip->i_mount, ip->i_ino), + XFS_ICI_EOFBLOCKS_TAG); + if (!radix_tree_tagged(&pag->pag_ici_root, XFS_ICI_EOFBLOCKS_TAG)) { + /* clear the eofblocks tag from the perag radix tree */ + spin_lock(&ip->i_mount->m_perag_lock); + radix_tree_tag_clear(&ip->i_mount->m_perag_tree, + XFS_INO_TO_AGNO(ip->i_mount, ip->i_ino), + XFS_ICI_EOFBLOCKS_TAG); + spin_unlock(&ip->i_mount->m_perag_lock); + trace_xfs_perag_clear_eofblocks(ip->i_mount, pag->pag_agno, + -1, _RET_IP_); + } + + spin_unlock(&pag->pag_ici_lock); + xfs_perag_put(pag); +} + diff --git a/fs/xfs/xfs_sync.h b/fs/xfs/xfs_sync.h index 941202e..4486491 100644 --- a/fs/xfs/xfs_sync.h +++ b/fs/xfs/xfs_sync.h @@ -43,6 +43,9 @@ void __xfs_inode_set_reclaim_tag(struct xfs_perag *pag, struct xfs_inode *ip); void __xfs_inode_clear_reclaim_tag(struct xfs_mount *mp, struct xfs_perag *pag, struct xfs_inode *ip); +void xfs_inode_set_eofblocks_tag(struct xfs_inode *ip); +void xfs_inode_clear_eofblocks_tag(struct xfs_inode *ip); + int xfs_sync_inode_grab(struct xfs_inode *ip); int xfs_inode_ag_iterator(struct xfs_mount *mp, int (*execute)(struct xfs_inode *ip, struct xfs_perag *pag, int flags), diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index 7d36ccf..6f46e03 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -130,6 +130,8 @@ DEFINE_PERAG_REF_EVENT(xfs_perag_get_tag); DEFINE_PERAG_REF_EVENT(xfs_perag_put); DEFINE_PERAG_REF_EVENT(xfs_perag_set_reclaim); DEFINE_PERAG_REF_EVENT(xfs_perag_clear_reclaim); +DEFINE_PERAG_REF_EVENT(xfs_perag_set_eofblocks); +DEFINE_PERAG_REF_EVENT(xfs_perag_clear_eofblocks); TRACE_EVENT(xfs_attr_list_node_descend, TP_PROTO(struct xfs_attr_list_context *ctx, @@ -585,6 +587,9 @@ DEFINE_INODE_EVENT(xfs_update_time); DEFINE_INODE_EVENT(xfs_dquot_dqalloc); DEFINE_INODE_EVENT(xfs_dquot_dqdetach); +DEFINE_INODE_EVENT(xfs_inode_set_eofblocks_tag); +DEFINE_INODE_EVENT(xfs_inode_clear_eofblocks_tag); + DECLARE_EVENT_CLASS(xfs_iref_class, TP_PROTO(struct xfs_inode *ip, unsigned long caller_ip), TP_ARGS(ip, caller_ip), diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c index 2a5c6373..d883881 100644 --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c @@ -237,6 +237,8 @@ xfs_free_eofblocks( } else { error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); + if (!error) + xfs_inode_clear_eofblocks_tag(ip); } xfs_iunlock(ip, XFS_ILOCK_EXCL); -- 1.7.7.6 From bfoster@redhat.com Thu Sep 27 12:42:54 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=unavailable version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8RHgsS7121759 for ; Thu, 27 Sep 2012 12:42:54 -0500 X-ASG-Debug-ID: 1348767853-04cb6c794243aa0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id sT6cKrrW3XfPqQ5r for ; Thu, 27 Sep 2012 10:44:13 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8RHiD6A013480 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 27 Sep 2012 13:44:13 -0400 Received: from bfoster.bfoster ([10.16.225.83]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q8RHiC9q026808 for ; Thu, 27 Sep 2012 13:44:12 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 36B52121338; Thu, 27 Sep 2012 13:45:53 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v4 0/8] speculative preallocation inode tracking Date: Thu, 27 Sep 2012 13:45:44 -0400 X-ASG-Orig-Subj: [PATCH v4 0/8] speculative preallocation inode tracking Message-Id: <1348767952-24229-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1348767853 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com Hi all, This is v3 of the speculative preallocation inode tracking patchset. This functionality tracks inodes with post-EOF speculative preallocation for the purpose of background and on-demand trimming. Background scanning occurs on a longish interval (5 minutes by default) and in a best-effort mode (i.e., inodes are skipped due to lock contention or dirty cache). The intent is to clear up post-EOF blocks on inodes that might have allocations hanging around due to open-write-close sequences (NFS). On demand scanning is provided via a new ioctl and supports various parameters such as scan mode, filtering by quota id and minimum file size. A pending use case for on demand scanning is for accurate quota accounting via the gluster scale out filesystem (i.e., to free up preallocated space when near a usage limit). Brian v4: - Fix the broken need_iolock parameter to the xfs_free_eofblocks() call in patch 5 (thanks to Ben M. for testing). This is a one line change. All other patches equivalent to v3. This version survives an xfstests run (with XFS_DEBUG enabled this time :P). v3: - Pushed dirty cache check up into patch 5 (minor clean up). - Reworked xfs_can_free_eofblocks() in patch 3 as per Dave C.'s review. - Rebased from linus' tree to the XFS tree. v2: - Remove unnecessary inode flag clear helper. - Condense eofblocks set/clear tag functions. - Move clear tag call into xfs_free_eofblocks(). - Modify AG walk infrastructure to support tag-based walk and utilize this functionality for the eofblocks scan (as opposed to the previous code duplicated from reclaim scanning). - Improve ioctl functionality: new data structure fields/flags, validate quota is enabled. - Increase default background scanning interval to 5 minutes, add tunable. Brian Foster (8): xfs: add EOFBLOCKS inode tagging/untagging xfs: support a tag-based inode_ag_iterator xfs: create helper to check whether to free eofblocks on inode xfs: export xfs_free_eofblocks() and return EAGAIN on trylock failure xfs: create function to scan and clear EOFBLOCKS inodes xfs: add XFS_IOC_FREE_EOFBLOCKS ioctl xfs: add enhanced filtering to EOFBLOCKS scan xfs: add background scanning to clear EOFBLOCKS inodes fs/xfs/xfs_ag.h | 1 + fs/xfs/xfs_fs.h | 23 +++++ fs/xfs/xfs_globals.c | 1 + fs/xfs/xfs_ioctl.c | 20 ++++ fs/xfs/xfs_iomap.c | 7 ++ fs/xfs/xfs_iops.c | 3 + fs/xfs/xfs_linux.h | 1 + fs/xfs/xfs_mount.h | 2 + fs/xfs/xfs_qm_syscalls.c | 5 +- fs/xfs/xfs_sync.c | 215 ++++++++++++++++++++++++++++++++++++++++++++-- fs/xfs/xfs_sync.h | 11 ++- fs/xfs/xfs_sysctl.c | 9 ++ fs/xfs/xfs_sysctl.h | 1 + fs/xfs/xfs_trace.h | 6 ++ fs/xfs/xfs_vnodeops.c | 27 +++--- fs/xfs/xfs_vnodeops.h | 41 +++++++++- 16 files changed, 344 insertions(+), 29 deletions(-) -- 1.7.7.6 From bfoster@redhat.com Thu Sep 27 12:42:54 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=unavailable version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8RHgs41121758 for ; Thu, 27 Sep 2012 12:42:54 -0500 X-ASG-Debug-ID: 1348767853-04cbb069c4446e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id eajfm4B8h0kWZfZP for ; Thu, 27 Sep 2012 10:44:13 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8RHiDKJ022929 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 27 Sep 2012 13:44:13 -0400 Received: from bfoster.bfoster ([10.16.225.83]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id q8RHiCVR013609 for ; Thu, 27 Sep 2012 13:44:12 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 54379120615; Thu, 27 Sep 2012 13:45:53 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v4 3/8] xfs: create helper to check whether to free eofblocks on inode Date: Thu, 27 Sep 2012 13:45:47 -0400 X-ASG-Orig-Subj: [PATCH v4 3/8] xfs: create helper to check whether to free eofblocks on inode Message-Id: <1348767952-24229-4-git-send-email-bfoster@redhat.com> In-Reply-To: <1348767952-24229-1-git-send-email-bfoster@redhat.com> References: <1348767952-24229-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.12 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1348767853 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com This check is used in multiple places to determine whether we should check for (and potentially free) post EOF blocks on an inode. Add a helper to consolidate the check. Note that when we remove an inode from the cache (xfs_inactive()), we are required to trim post-EOF blocks even if the inode is marked preallocated or append-only to maintain correct space accounting. The 'force' parameter to xfs_can_free_eofblocks() specifies whether we should ignore the prealloc/append-only status of the inode. Signed-off-by: Brian Foster --- fs/xfs/xfs_vnodeops.c | 19 +++++++------------ fs/xfs/xfs_vnodeops.h | 40 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 46 insertions(+), 13 deletions(-) diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c index d883881..12f5087 100644 --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c @@ -435,11 +435,7 @@ xfs_release( if (ip->i_d.di_nlink == 0) return 0; - if ((S_ISREG(ip->i_d.di_mode) && - (VFS_I(ip)->i_size > 0 || - (VN_CACHED(VFS_I(ip)) > 0 || ip->i_delayed_blks > 0)) && - (ip->i_df.if_flags & XFS_IFEXTENTS)) && - (!(ip->i_d.di_flags & (XFS_DIFLAG_PREALLOC | XFS_DIFLAG_APPEND)))) { + if (xfs_can_free_eofblocks(ip, false)) { /* * If we can't get the iolock just skip truncating the blocks @@ -515,13 +511,12 @@ xfs_inactive( goto out; if (ip->i_d.di_nlink != 0) { - if ((S_ISREG(ip->i_d.di_mode) && - (VFS_I(ip)->i_size > 0 || - (VN_CACHED(VFS_I(ip)) > 0 || ip->i_delayed_blks > 0)) && - (ip->i_df.if_flags & XFS_IFEXTENTS) && - (!(ip->i_d.di_flags & - (XFS_DIFLAG_PREALLOC | XFS_DIFLAG_APPEND)) || - ip->i_delayed_blks != 0))) { + /* + * force is true because we are evicting an inode from the + * cache. Post-eof blocks must be freed, lest we end up with + * broken free space accounting. + */ + if (xfs_can_free_eofblocks(ip, true)) { error = xfs_free_eofblocks(mp, ip, false); if (error) return VN_INACTIVE_CACHE; diff --git a/fs/xfs/xfs_vnodeops.h b/fs/xfs/xfs_vnodeops.h index 447e146..d5701e3 100644 --- a/fs/xfs/xfs_vnodeops.h +++ b/fs/xfs/xfs_vnodeops.h @@ -1,6 +1,10 @@ #ifndef _XFS_VNODEOPS_H #define _XFS_VNODEOPS_H 1 +#include "xfs_bmap_btree.h" +#include "xfs_dinode.h" +#include "xfs_inode.h" + struct attrlist_cursor_kern; struct file; struct iattr; @@ -9,8 +13,42 @@ struct iovec; struct kiocb; struct pipe_inode_info; struct uio; -struct xfs_inode; +/* + * Test whether it is appropriate to check an inode for and free post EOF + * blocks. The 'force' parameter determines whether we should also consider + * regular files that are marked preallocated or append-only. + */ +static inline bool +xfs_can_free_eofblocks(struct xfs_inode *ip, bool force) +{ + /* prealloc/delalloc exists only on regular files */ + if (!S_ISREG(ip->i_d.di_mode)) + return false; + + /* + * Zero sized files with no cached pages and delalloc blocks will not + * have speculative prealloc/delalloc blocks to remove. + */ + if (VFS_I(ip)->i_size == 0 && + VN_CACHED(VFS_I(ip)) == 0 && + ip->i_delayed_blks == 0) + return false; + + /* If we haven't read in the extent list, then don't do it now. */ + if (!(ip->i_df.if_flags & XFS_IFEXTENTS)) + return false; + + /* + * Do not free real preallocated or append-only files unless the file + * has delalloc blocks and we are forced to remove them. + */ + if (ip->i_d.di_flags & (XFS_DIFLAG_PREALLOC | XFS_DIFLAG_APPEND)) + if (!force || ip->i_delayed_blks == 0) + return false; + + return true; +} int xfs_setattr_nonsize(struct xfs_inode *ip, struct iattr *vap, int flags); int xfs_setattr_size(struct xfs_inode *ip, struct iattr *vap, int flags); -- 1.7.7.6 From bfoster@redhat.com Thu Sep 27 12:42:54 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=unavailable version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8RHgsAc121766 for ; Thu, 27 Sep 2012 12:42:54 -0500 X-ASG-Debug-ID: 1348767853-04cb6c794443ab0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id 9p3fOiidMD3LTWEw for ; Thu, 27 Sep 2012 10:44:13 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8RHiDeV018982 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 27 Sep 2012 13:44:13 -0400 Received: from bfoster.bfoster ([10.16.225.83]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q8RHiDiJ026820 for ; Thu, 27 Sep 2012 13:44:13 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id CC3FF12133A; Thu, 27 Sep 2012 13:45:53 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v4 7/8] xfs: add enhanced filtering to EOFBLOCKS scan Date: Thu, 27 Sep 2012 13:45:51 -0400 X-ASG-Orig-Subj: [PATCH v4 7/8] xfs: add enhanced filtering to EOFBLOCKS scan Message-Id: <1348767952-24229-8-git-send-email-bfoster@redhat.com> In-Reply-To: <1348767952-24229-1-git-send-email-bfoster@redhat.com> References: <1348767952-24229-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1348767853 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com Support EOFBLOCKS scan filtering by quota ID or minimum file size. Add the appropriate fields/flags to the xfs_eofblocks structure and pass it down to xfs_inode_free_eofblocks() where filtering functionality is implemented. A (user requested) quota ID based scan requires the associated quota mode be enabled. Signed-off-by: Brian Foster --- fs/xfs/xfs_fs.h | 9 +++++++++ fs/xfs/xfs_ioctl.c | 10 +++++++++- fs/xfs/xfs_sync.c | 30 ++++++++++++++++++++++++++---- fs/xfs/xfs_sync.h | 2 +- 4 files changed, 45 insertions(+), 6 deletions(-) diff --git a/fs/xfs/xfs_fs.h b/fs/xfs/xfs_fs.h index 32bb2e8..54c0f39 100644 --- a/fs/xfs/xfs_fs.h +++ b/fs/xfs/xfs_fs.h @@ -343,12 +343,21 @@ typedef struct xfs_error_injection { */ struct xfs_eofblocks { __u32 eof_flags; + __u32 eof_id; + __u64 eof_min_file_size; __s32 version; unsigned char pad[12]; }; /* eof_flags values */ #define XFS_EOF_FLAGS_FORCE 0x01 /* force/wait mode scan */ +#define XFS_EOF_FLAGS_USRID 0x02 /* filter by user id */ +#define XFS_EOF_FLAGS_GRPID 0x04 /* filter by group id */ +#define XFS_EOF_FLAGS_PROJID 0x08 /* filter by project id */ +#define XFS_EOF_FLAGS_MINFILESIZE 0x10 /* minimum file size */ + +#define XFS_EOF_VALID_QUOTA (XFS_EOF_FLAGS_USRID|XFS_EOF_FLAGS_GRPID| \ + XFS_EOF_FLAGS_PROJID) /* diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index 216ca7a..a7bf847 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -1609,8 +1609,16 @@ xfs_file_ioctl( if (copy_from_user(&eofb, arg, sizeof(eofb))) return -XFS_ERROR(EFAULT); + if (((eofb.eof_flags & XFS_EOF_FLAGS_USRID) && + !XFS_IS_UQUOTA_ON(mp)) || + ((eofb.eof_flags & XFS_EOF_FLAGS_GRPID) && + !XFS_IS_GQUOTA_ON(mp)) || + ((eofb.eof_flags & XFS_EOF_FLAGS_PROJID) && + !XFS_IS_PQUOTA_ON(mp))) + return -XFS_ERROR(EINVAL); + flags = (eofb.eof_flags & XFS_EOF_FLAGS_FORCE) ? SYNC_WAIT : SYNC_TRYLOCK; - error = xfs_inodes_free_eofblocks(mp, flags); + error = xfs_inodes_free_eofblocks(mp, flags, &eofb); return -error; } diff --git a/fs/xfs/xfs_sync.c b/fs/xfs/xfs_sync.c index 6854800..c9e1c16 100644 --- a/fs/xfs/xfs_sync.c +++ b/fs/xfs/xfs_sync.c @@ -1015,6 +1015,21 @@ xfs_reclaim_inodes_count( } STATIC int +xfs_inode_match_quota_id( + struct xfs_inode *ip, + struct xfs_eofblocks *eofb) +{ + if (eofb->eof_flags & XFS_EOF_FLAGS_USRID) + return ip->i_d.di_uid == eofb->eof_id; + else if (eofb->eof_flags & XFS_EOF_FLAGS_GRPID) + return ip->i_d.di_gid == eofb->eof_id; + else if (eofb->eof_flags & XFS_EOF_FLAGS_PROJID) + return xfs_get_projid(ip) == eofb->eof_id; + + return 0; +} + +STATIC int xfs_inode_free_eofblocks( struct xfs_inode *ip, struct xfs_perag *pag, @@ -1022,6 +1037,7 @@ xfs_inode_free_eofblocks( void *args) { int ret; + struct xfs_eofblocks *eofb = args; bool force = flags & SYNC_WAIT; if (!xfs_can_free_eofblocks(ip, false)) { @@ -1031,8 +1047,13 @@ xfs_inode_free_eofblocks( return 0; } - if (!force && mapping_tagged(VFS_I(ip)->i_mapping, - PAGECACHE_TAG_DIRTY)) + if ((eofb && + (((eofb->eof_flags & XFS_EOF_VALID_QUOTA) && + !xfs_inode_match_quota_id(ip, eofb)) || + ((eofb->eof_flags & XFS_EOF_FLAGS_MINFILESIZE) && + (XFS_ISIZE(ip) < eofb->eof_min_file_size)))) || + (!force && mapping_tagged(VFS_I(ip)->i_mapping, + PAGECACHE_TAG_DIRTY))) return 0; ret = xfs_free_eofblocks(ip->i_mount, ip, true); @@ -1047,11 +1068,12 @@ xfs_inode_free_eofblocks( int xfs_inodes_free_eofblocks( struct xfs_mount *mp, - int flags) + int flags, + struct xfs_eofblocks *eofb) { ASSERT((flags & ~(SYNC_TRYLOCK|SYNC_WAIT)) == 0); return xfs_inode_ag_iterator_tag(mp, xfs_inode_free_eofblocks, flags, - NULL, XFS_ICI_EOFBLOCKS_TAG); + eofb, XFS_ICI_EOFBLOCKS_TAG); } void diff --git a/fs/xfs/xfs_sync.h b/fs/xfs/xfs_sync.h index 307654a..167f06c 100644 --- a/fs/xfs/xfs_sync.h +++ b/fs/xfs/xfs_sync.h @@ -45,7 +45,7 @@ void __xfs_inode_clear_reclaim_tag(struct xfs_mount *mp, struct xfs_perag *pag, void xfs_inode_set_eofblocks_tag(struct xfs_inode *ip); void xfs_inode_clear_eofblocks_tag(struct xfs_inode *ip); -int xfs_inodes_free_eofblocks(struct xfs_mount *, int); +int xfs_inodes_free_eofblocks(struct xfs_mount *, int, struct xfs_eofblocks *); int xfs_sync_inode_grab(struct xfs_inode *ip); int xfs_inode_ag_iterator(struct xfs_mount *mp, -- 1.7.7.6 From bfoster@redhat.com Thu Sep 27 12:42:54 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=unavailable version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8RHgsdG121760 for ; Thu, 27 Sep 2012 12:42:54 -0500 X-ASG-Debug-ID: 1348767853-04cbb069c3446e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id ydlLaXPKwVaouame for ; Thu, 27 Sep 2012 10:44:13 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8RHiDFA008552 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 27 Sep 2012 13:44:13 -0400 Received: from bfoster.bfoster ([10.16.225.83]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id q8RHiCpN029677 for ; Thu, 27 Sep 2012 13:44:12 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id 92F83121336; Thu, 27 Sep 2012 13:45:53 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v4 2/8] xfs: support a tag-based inode_ag_iterator Date: Thu, 27 Sep 2012 13:45:46 -0400 X-ASG-Orig-Subj: [PATCH v4 2/8] xfs: support a tag-based inode_ag_iterator Message-Id: <1348767952-24229-3-git-send-email-bfoster@redhat.com> In-Reply-To: <1348767952-24229-1-git-send-email-bfoster@redhat.com> References: <1348767952-24229-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1348767853 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com Genericize xfs_inode_ag_walk() to support an optional radix tree tag and args argument for the execute function. Create a new wrapper called xfs_inode_ag_iterator_tag() that performs a tag based walk of perag's and inodes. Signed-off-by: Brian Foster --- fs/xfs/xfs_qm_syscalls.c | 5 ++- fs/xfs/xfs_sync.c | 61 +++++++++++++++++++++++++++++++++++++++------- fs/xfs/xfs_sync.h | 7 ++++- 3 files changed, 60 insertions(+), 13 deletions(-) diff --git a/fs/xfs/xfs_qm_syscalls.c b/fs/xfs/xfs_qm_syscalls.c index 858a3b1..848bd8e 100644 --- a/fs/xfs/xfs_qm_syscalls.c +++ b/fs/xfs/xfs_qm_syscalls.c @@ -845,7 +845,8 @@ STATIC int xfs_dqrele_inode( struct xfs_inode *ip, struct xfs_perag *pag, - int flags) + int flags, + void *args) { /* skip quota inodes */ if (ip == ip->i_mount->m_quotainfo->qi_uquotaip || @@ -881,5 +882,5 @@ xfs_qm_dqrele_all_inodes( uint flags) { ASSERT(mp->m_quotainfo); - xfs_inode_ag_iterator(mp, xfs_dqrele_inode, flags); + xfs_inode_ag_iterator(mp, xfs_dqrele_inode, flags, NULL); } diff --git a/fs/xfs/xfs_sync.c b/fs/xfs/xfs_sync.c index 00c6224..0da93c9 100644 --- a/fs/xfs/xfs_sync.c +++ b/fs/xfs/xfs_sync.c @@ -101,8 +101,11 @@ xfs_inode_ag_walk( struct xfs_mount *mp, struct xfs_perag *pag, int (*execute)(struct xfs_inode *ip, - struct xfs_perag *pag, int flags), - int flags) + struct xfs_perag *pag, int flags, + void *args), + int flags, + void *args, + int tag) { uint32_t first_index; int last_error = 0; @@ -121,9 +124,17 @@ restart: int i; rcu_read_lock(); - nr_found = radix_tree_gang_lookup(&pag->pag_ici_root, + + if (tag == -1) + nr_found = radix_tree_gang_lookup(&pag->pag_ici_root, (void **)batch, first_index, XFS_LOOKUP_BATCH); + else + nr_found = radix_tree_gang_lookup_tag( + &pag->pag_ici_root, + (void **) batch, first_index, + XFS_LOOKUP_BATCH, tag); + if (!nr_found) { rcu_read_unlock(); break; @@ -164,7 +175,7 @@ restart: for (i = 0; i < nr_found; i++) { if (!batch[i]) continue; - error = execute(batch[i], pag, flags); + error = execute(batch[i], pag, flags, args); IRELE(batch[i]); if (error == EAGAIN) { skipped++; @@ -193,8 +204,10 @@ int xfs_inode_ag_iterator( struct xfs_mount *mp, int (*execute)(struct xfs_inode *ip, - struct xfs_perag *pag, int flags), - int flags) + struct xfs_perag *pag, int flags, + void *args), + int flags, + void *args) { struct xfs_perag *pag; int error = 0; @@ -204,7 +217,36 @@ xfs_inode_ag_iterator( ag = 0; while ((pag = xfs_perag_get(mp, ag))) { ag = pag->pag_agno + 1; - error = xfs_inode_ag_walk(mp, pag, execute, flags); + error = xfs_inode_ag_walk(mp, pag, execute, flags, args, -1); + xfs_perag_put(pag); + if (error) { + last_error = error; + if (error == EFSCORRUPTED) + break; + } + } + return XFS_ERROR(last_error); +} + +int +xfs_inode_ag_iterator_tag( + struct xfs_mount *mp, + int (*execute)(struct xfs_inode *ip, + struct xfs_perag *pag, int flags, + void *args), + int flags, + void *args, + int tag) +{ + struct xfs_perag *pag; + int error = 0; + int last_error = 0; + xfs_agnumber_t ag; + + ag = 0; + while ((pag = xfs_perag_get_tag(mp, ag, tag))) { + ag = pag->pag_agno + 1; + error = xfs_inode_ag_walk(mp, pag, execute, flags, args, tag); xfs_perag_put(pag); if (error) { last_error = error; @@ -219,7 +261,8 @@ STATIC int xfs_sync_inode_data( struct xfs_inode *ip, struct xfs_perag *pag, - int flags) + int flags, + void *args) { struct inode *inode = VFS_I(ip); struct address_space *mapping = inode->i_mapping; @@ -252,7 +295,7 @@ xfs_sync_data( ASSERT((flags & ~(SYNC_TRYLOCK|SYNC_WAIT)) == 0); - error = xfs_inode_ag_iterator(mp, xfs_sync_inode_data, flags); + error = xfs_inode_ag_iterator(mp, xfs_sync_inode_data, flags, NULL); if (error) return XFS_ERROR(error); diff --git a/fs/xfs/xfs_sync.h b/fs/xfs/xfs_sync.h index 4486491..463ea0a 100644 --- a/fs/xfs/xfs_sync.h +++ b/fs/xfs/xfs_sync.h @@ -48,7 +48,10 @@ void xfs_inode_clear_eofblocks_tag(struct xfs_inode *ip); int xfs_sync_inode_grab(struct xfs_inode *ip); int xfs_inode_ag_iterator(struct xfs_mount *mp, - int (*execute)(struct xfs_inode *ip, struct xfs_perag *pag, int flags), - int flags); + int (*execute)(struct xfs_inode *ip, struct xfs_perag *pag, int flags, void *args), + int flags, void *args); +int xfs_inode_ag_iterator_tag(struct xfs_mount *mp, + int (*execute)(struct xfs_inode *ip, struct xfs_perag *pag, int flags, void *args), + int flags, void *args, int tag); #endif -- 1.7.7.6 From bfoster@redhat.com Thu Sep 27 12:42:54 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_72 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8RHgsVh121765 for ; Thu, 27 Sep 2012 12:42:54 -0500 X-ASG-Debug-ID: 1348767853-04cbb069c1446e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id gaWGl1jovTUpsFVN for ; Thu, 27 Sep 2012 10:44:13 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8RHiDiR013486 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 27 Sep 2012 13:44:13 -0400 Received: from bfoster.bfoster ([10.16.225.83]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q8RHiDEk018642 for ; Thu, 27 Sep 2012 13:44:13 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id D49F512133D; Thu, 27 Sep 2012 13:45:53 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v4 8/8] xfs: add background scanning to clear EOFBLOCKS inodes Date: Thu, 27 Sep 2012 13:45:52 -0400 X-ASG-Orig-Subj: [PATCH v4 8/8] xfs: add background scanning to clear EOFBLOCKS inodes Message-Id: <1348767952-24229-9-git-send-email-bfoster@redhat.com> In-Reply-To: <1348767952-24229-1-git-send-email-bfoster@redhat.com> References: <1348767952-24229-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1348767853 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com Create a delayed_work to enable background scanning and freeing of EOFBLOCKS inodes. The scanner kicks in once speculative preallocation occurs and stops requeueing itself when no EOFBLOCKS inodes exist. Scans are queued on the existing syncd workqueue and the interval is based on the new eofb_timer tunable (default to 5m). The background scanner performs unfiltered, best effort scans (which skips inodes under lock contention or with a dirty cache mapping). Signed-off-by: Brian Foster --- fs/xfs/xfs_globals.c | 1 + fs/xfs/xfs_linux.h | 1 + fs/xfs/xfs_mount.h | 2 ++ fs/xfs/xfs_sync.c | 30 ++++++++++++++++++++++++++++++ fs/xfs/xfs_sysctl.c | 9 +++++++++ fs/xfs/xfs_sysctl.h | 1 + 6 files changed, 44 insertions(+), 0 deletions(-) diff --git a/fs/xfs/xfs_globals.c b/fs/xfs/xfs_globals.c index 76e81cf..fda9a66 100644 --- a/fs/xfs/xfs_globals.c +++ b/fs/xfs/xfs_globals.c @@ -40,4 +40,5 @@ xfs_param_t xfs_params = { .rotorstep = { 1, 1, 255 }, .inherit_nodfrg = { 0, 1, 1 }, .fstrm_timer = { 1, 30*100, 3600*100}, + .eofb_timer = { 1*100, 300*100, 7200*100}, }; diff --git a/fs/xfs/xfs_linux.h b/fs/xfs/xfs_linux.h index 828662f..bbad99b 100644 --- a/fs/xfs/xfs_linux.h +++ b/fs/xfs/xfs_linux.h @@ -118,6 +118,7 @@ #define xfs_rotorstep xfs_params.rotorstep.val #define xfs_inherit_nodefrag xfs_params.inherit_nodfrg.val #define xfs_fstrm_centisecs xfs_params.fstrm_timer.val +#define xfs_eofb_centisecs xfs_params.eofb_timer.val #define current_cpu() (raw_smp_processor_id()) #define current_pid() (current->pid) diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index deee09e..bf5ecfa 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -199,6 +199,8 @@ typedef struct xfs_mount { struct xfs_mru_cache *m_filestream; /* per-mount filestream data */ struct delayed_work m_sync_work; /* background sync work */ struct delayed_work m_reclaim_work; /* background inode reclaim */ + struct delayed_work m_eofblocks_work; /* background eof blocks + trimming */ struct work_struct m_flush_work; /* background inode flush */ __int64_t m_update_flags; /* sb flags we need to update on the next remount,rw */ diff --git a/fs/xfs/xfs_sync.c b/fs/xfs/xfs_sync.c index c9e1c16..31f678a 100644 --- a/fs/xfs/xfs_sync.c +++ b/fs/xfs/xfs_sync.c @@ -532,6 +532,31 @@ xfs_flush_worker( xfs_sync_data(mp, SYNC_TRYLOCK | SYNC_WAIT); } +/* + * Background scanning to trim post-EOF preallocated space. This is queued + * based on the 'eofb_centisecs' tunable (5m by default). + */ +STATIC void +xfs_queue_eofblocks( + struct xfs_mount *mp) +{ + rcu_read_lock(); + if (radix_tree_tagged(&mp->m_perag_tree, XFS_ICI_EOFBLOCKS_TAG)) + queue_delayed_work(xfs_syncd_wq, &mp->m_eofblocks_work, + msecs_to_jiffies(xfs_eofb_centisecs * 10)); + rcu_read_unlock(); +} + +STATIC void +xfs_eofblocks_worker( +struct work_struct *work) +{ + struct xfs_mount *mp = container_of(to_delayed_work(work), + struct xfs_mount, m_eofblocks_work); + xfs_inodes_free_eofblocks(mp, SYNC_TRYLOCK, NULL); + xfs_queue_eofblocks(mp); +} + int xfs_syncd_init( struct xfs_mount *mp) @@ -539,6 +564,7 @@ xfs_syncd_init( INIT_WORK(&mp->m_flush_work, xfs_flush_worker); INIT_DELAYED_WORK(&mp->m_sync_work, xfs_sync_worker); INIT_DELAYED_WORK(&mp->m_reclaim_work, xfs_reclaim_worker); + INIT_DELAYED_WORK(&mp->m_eofblocks_work, xfs_eofblocks_worker); xfs_syncd_queue_sync(mp); @@ -551,6 +577,7 @@ xfs_syncd_stop( { cancel_delayed_work_sync(&mp->m_sync_work); cancel_delayed_work_sync(&mp->m_reclaim_work); + cancel_delayed_work_sync(&mp->m_eofblocks_work); cancel_work_sync(&mp->m_flush_work); } @@ -1101,6 +1128,9 @@ xfs_inode_set_eofblocks_tag( XFS_ICI_EOFBLOCKS_TAG); spin_unlock(&ip->i_mount->m_perag_lock); + /* kick off background trimming */ + xfs_queue_eofblocks(ip->i_mount); + trace_xfs_perag_set_eofblocks(ip->i_mount, pag->pag_agno, -1, _RET_IP_); } diff --git a/fs/xfs/xfs_sysctl.c b/fs/xfs/xfs_sysctl.c index ee2d2ad..45d74fc 100644 --- a/fs/xfs/xfs_sysctl.c +++ b/fs/xfs/xfs_sysctl.c @@ -202,6 +202,15 @@ static ctl_table xfs_table[] = { .extra1 = &xfs_params.fstrm_timer.min, .extra2 = &xfs_params.fstrm_timer.max, }, + { + .procname = "eofb_centisecs", + .data = &xfs_params.eofb_timer.val, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = proc_dointvec_minmax, + .extra1 = &xfs_params.eofb_timer.min, + .extra2 = &xfs_params.eofb_timer.max, + }, /* please keep this the last entry */ #ifdef CONFIG_PROC_FS { diff --git a/fs/xfs/xfs_sysctl.h b/fs/xfs/xfs_sysctl.h index b9937d4..bd8e157 100644 --- a/fs/xfs/xfs_sysctl.h +++ b/fs/xfs/xfs_sysctl.h @@ -47,6 +47,7 @@ typedef struct xfs_param { xfs_sysctl_val_t rotorstep; /* inode32 AG rotoring control knob */ xfs_sysctl_val_t inherit_nodfrg;/* Inherit the "nodefrag" inode flag. */ xfs_sysctl_val_t fstrm_timer; /* Filestream dir-AG assoc'n timeout. */ + xfs_sysctl_val_t eofb_timer; /* Interval between eofb scan wakeups */ } xfs_param_t; /* -- 1.7.7.6 From bfoster@redhat.com Thu Sep 27 12:42:54 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8RHgsuR121764 for ; Thu, 27 Sep 2012 12:42:54 -0500 X-ASG-Debug-ID: 1348767853-04cbb069c2446e0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id jHWiWEEhoZV5Ntq6 for ; Thu, 27 Sep 2012 10:44:13 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8RHiD4w022937 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 27 Sep 2012 13:44:13 -0400 Received: from bfoster.bfoster ([10.16.225.83]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q8RHiD15026817 for ; Thu, 27 Sep 2012 13:44:13 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id B1DD012133B; Thu, 27 Sep 2012 13:45:53 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v4 6/8] xfs: add XFS_IOC_FREE_EOFBLOCKS ioctl Date: Thu, 27 Sep 2012 13:45:50 -0400 X-ASG-Orig-Subj: [PATCH v4 6/8] xfs: add XFS_IOC_FREE_EOFBLOCKS ioctl Message-Id: <1348767952-24229-7-git-send-email-bfoster@redhat.com> In-Reply-To: <1348767952-24229-1-git-send-email-bfoster@redhat.com> References: <1348767952-24229-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1348767853 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com The XFS_IOC_FREE_EOFBLOCKS ioctl allows users to invoke an EOFBLOCKS scan. The xfs_eofblocks structure is defined to support the command parameters (scan mode). Signed-off-by: Brian Foster --- fs/xfs/xfs_fs.h | 14 ++++++++++++++ fs/xfs/xfs_ioctl.c | 12 ++++++++++++ 2 files changed, 26 insertions(+), 0 deletions(-) diff --git a/fs/xfs/xfs_fs.h b/fs/xfs/xfs_fs.h index c13fed8..32bb2e8 100644 --- a/fs/xfs/xfs_fs.h +++ b/fs/xfs/xfs_fs.h @@ -339,6 +339,19 @@ typedef struct xfs_error_injection { /* + * Speculative preallocation trimming. + */ +struct xfs_eofblocks { + __u32 eof_flags; + __s32 version; + unsigned char pad[12]; +}; + +/* eof_flags values */ +#define XFS_EOF_FLAGS_FORCE 0x01 /* force/wait mode scan */ + + +/* * The user-level Handle Request interface structure. */ typedef struct xfs_fsop_handlereq { @@ -456,6 +469,7 @@ typedef struct xfs_handle { /* XFS_IOC_GETBIOSIZE ---- deprecated 47 */ #define XFS_IOC_GETBMAPX _IOWR('X', 56, struct getbmap) #define XFS_IOC_ZERO_RANGE _IOW ('X', 57, struct xfs_flock64) +#define XFS_IOC_FREE_EOFBLOCKS _IOR ('X', 58, struct xfs_eofblocks) /* * ioctl commands that replace IRIX syssgi()'s diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c index 0e0232c..216ca7a 100644 --- a/fs/xfs/xfs_ioctl.c +++ b/fs/xfs/xfs_ioctl.c @@ -1602,6 +1602,18 @@ xfs_file_ioctl( error = xfs_errortag_clearall(mp, 1); return -error; + case XFS_IOC_FREE_EOFBLOCKS: { + struct xfs_eofblocks eofb; + int flags; + + if (copy_from_user(&eofb, arg, sizeof(eofb))) + return -XFS_ERROR(EFAULT); + + flags = (eofb.eof_flags & XFS_EOF_FLAGS_FORCE) ? SYNC_WAIT : SYNC_TRYLOCK; + error = xfs_inodes_free_eofblocks(mp, flags); + return -error; + } + default: return -ENOTTY; } -- 1.7.7.6 From bfoster@redhat.com Thu Sep 27 12:42:55 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=unavailable version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8RHgsGH121767 for ; Thu, 27 Sep 2012 12:42:54 -0500 X-ASG-Debug-ID: 1348767853-04bdf0289b47be0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id qecSjPbcRch5PgyC for ; Thu, 27 Sep 2012 10:44:13 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8RHiDNj013484 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 27 Sep 2012 13:44:13 -0400 Received: from bfoster.bfoster ([10.16.225.83]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q8RHiD0q026816 for ; Thu, 27 Sep 2012 13:44:13 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id C01F712133C; Thu, 27 Sep 2012 13:45:53 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v4 4/8] xfs: export xfs_free_eofblocks() and return EAGAIN on trylock failure Date: Thu, 27 Sep 2012 13:45:48 -0400 X-ASG-Orig-Subj: [PATCH v4 4/8] xfs: export xfs_free_eofblocks() and return EAGAIN on trylock failure Message-Id: <1348767952-24229-5-git-send-email-bfoster@redhat.com> In-Reply-To: <1348767952-24229-1-git-send-email-bfoster@redhat.com> References: <1348767952-24229-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1348767853 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com Turn xfs_free_eofblocks() into a non-static function, return EAGAIN to indicate trylock failure and make sure this error is not propagated in xfs_release(). Signed-off-by: Brian Foster --- fs/xfs/xfs_vnodeops.c | 6 +++--- fs/xfs/xfs_vnodeops.h | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c index 12f5087..a61e852 100644 --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c @@ -150,7 +150,7 @@ xfs_readlink( * when the link count isn't zero and by xfs_dm_punch_hole() when * punching a hole to EOF. */ -STATIC int +int xfs_free_eofblocks( xfs_mount_t *mp, xfs_inode_t *ip, @@ -199,7 +199,7 @@ xfs_free_eofblocks( if (need_iolock) { if (!xfs_ilock_nowait(ip, XFS_IOLOCK_EXCL)) { xfs_trans_cancel(tp, 0); - return 0; + return EAGAIN; } } @@ -462,7 +462,7 @@ xfs_release( return 0; error = xfs_free_eofblocks(mp, ip, true); - if (error) + if (error && error != EAGAIN) return error; /* delalloc blocks after truncation means it really is dirty */ diff --git a/fs/xfs/xfs_vnodeops.h b/fs/xfs/xfs_vnodeops.h index d5701e3..1e03c4b 100644 --- a/fs/xfs/xfs_vnodeops.h +++ b/fs/xfs/xfs_vnodeops.h @@ -95,5 +95,6 @@ int xfs_flush_pages(struct xfs_inode *ip, xfs_off_t first, int xfs_wait_on_pages(struct xfs_inode *ip, xfs_off_t first, xfs_off_t last); int xfs_zero_eof(struct xfs_inode *, xfs_off_t, xfs_fsize_t); +int xfs_free_eofblocks(struct xfs_mount *, struct xfs_inode *, bool); #endif /* _XFS_VNODEOPS_H */ -- 1.7.7.6 From bfoster@redhat.com Thu Sep 27 12:42:54 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=unavailable version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8RHgs5W121761 for ; Thu, 27 Sep 2012 12:42:54 -0500 X-ASG-Debug-ID: 1348767853-04bdf0289c47be0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id vAXiGnVrYBz4aV2Y for ; Thu, 27 Sep 2012 10:44:13 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8RHiDkI022927 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 27 Sep 2012 13:44:13 -0400 Received: from bfoster.bfoster ([10.16.225.83]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q8RHiCov013002 for ; Thu, 27 Sep 2012 13:44:12 -0400 Received: by bfoster.bfoster (Postfix, from userid 1000) id A39E0121337; Thu, 27 Sep 2012 13:45:53 -0400 (EDT) From: Brian Foster To: xfs@oss.sgi.com Subject: [PATCH v4 5/8] xfs: create function to scan and clear EOFBLOCKS inodes Date: Thu, 27 Sep 2012 13:45:49 -0400 X-ASG-Orig-Subj: [PATCH v4 5/8] xfs: create function to scan and clear EOFBLOCKS inodes Message-Id: <1348767952-24229-6-git-send-email-bfoster@redhat.com> In-Reply-To: <1348767952-24229-1-git-send-email-bfoster@redhat.com> References: <1348767952-24229-1-git-send-email-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1348767853 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com xfs_inodes_free_eofblocks() implements scanning functionality for EOFBLOCKS inodes. It uses the AG iterator to walk the tagged inodes and free post-EOF blocks via the xfs_inode_free_eofblocks() execute function. The scan can be invoked in best-effort mode or wait (force) mode. A best-effort scan (default) handles all inodes that do not have a dirty cache and we successfully acquire the io lock via trylock. In wait mode, we continue to cycle through an AG until all inodes are handled. Signed-off-by: Brian Foster --- fs/xfs/xfs_sync.c | 40 ++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_sync.h | 1 + fs/xfs/xfs_trace.h | 1 + 3 files changed, 42 insertions(+), 0 deletions(-) diff --git a/fs/xfs/xfs_sync.c b/fs/xfs/xfs_sync.c index 0da93c9..6854800 100644 --- a/fs/xfs/xfs_sync.c +++ b/fs/xfs/xfs_sync.c @@ -1014,6 +1014,46 @@ xfs_reclaim_inodes_count( return reclaimable; } +STATIC int +xfs_inode_free_eofblocks( + struct xfs_inode *ip, + struct xfs_perag *pag, + int flags, + void *args) +{ + int ret; + bool force = flags & SYNC_WAIT; + + if (!xfs_can_free_eofblocks(ip, false)) { + /* inode could be preallocated or append-only */ + trace_xfs_inode_free_eofblocks_invalid(ip); + xfs_inode_clear_eofblocks_tag(ip); + return 0; + } + + if (!force && mapping_tagged(VFS_I(ip)->i_mapping, + PAGECACHE_TAG_DIRTY)) + return 0; + + ret = xfs_free_eofblocks(ip->i_mount, ip, true); + + /* ignore EAGAIN on a best effort scan */ + if (!force && (ret == EAGAIN)) + ret = 0; + + return ret; +} + +int +xfs_inodes_free_eofblocks( + struct xfs_mount *mp, + int flags) +{ + ASSERT((flags & ~(SYNC_TRYLOCK|SYNC_WAIT)) == 0); + return xfs_inode_ag_iterator_tag(mp, xfs_inode_free_eofblocks, flags, + NULL, XFS_ICI_EOFBLOCKS_TAG); +} + void xfs_inode_set_eofblocks_tag( xfs_inode_t *ip) diff --git a/fs/xfs/xfs_sync.h b/fs/xfs/xfs_sync.h index 463ea0a..307654a 100644 --- a/fs/xfs/xfs_sync.h +++ b/fs/xfs/xfs_sync.h @@ -45,6 +45,7 @@ void __xfs_inode_clear_reclaim_tag(struct xfs_mount *mp, struct xfs_perag *pag, void xfs_inode_set_eofblocks_tag(struct xfs_inode *ip); void xfs_inode_clear_eofblocks_tag(struct xfs_inode *ip); +int xfs_inodes_free_eofblocks(struct xfs_mount *, int); int xfs_sync_inode_grab(struct xfs_inode *ip); int xfs_inode_ag_iterator(struct xfs_mount *mp, diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index 6f46e03..cb52346 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h @@ -589,6 +589,7 @@ DEFINE_INODE_EVENT(xfs_dquot_dqdetach); DEFINE_INODE_EVENT(xfs_inode_set_eofblocks_tag); DEFINE_INODE_EVENT(xfs_inode_clear_eofblocks_tag); +DEFINE_INODE_EVENT(xfs_inode_free_eofblocks_invalid); DECLARE_EVENT_CLASS(xfs_iref_class, TP_PROTO(struct xfs_inode *ip, unsigned long caller_ip), -- 1.7.7.6 From tinguely@sgi.com Thu Sep 27 15:09:28 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8RK9SDw134968 for ; Thu, 27 Sep 2012 15:09:28 -0500 Received: from [128.162.232.125] (eagdhcp-232-125.americas.sgi.com [128.162.232.125]) by relay2.corp.sgi.com (Postfix) with ESMTP id 72E8C304048; Thu, 27 Sep 2012 13:10:45 -0700 (PDT) Message-ID: <5064B2BE.8060405@sgi.com> Date: Thu, 27 Sep 2012 15:10:38 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: bpm@sgi.com, xfs@oss.sgi.com Subject: Re: [PATCH 0/3] xfs: allocation worker causes freelist buffer lock hang References: <20120924171159.GG1140@sgi.com> <201209241809.q8OI94s3003323@eagdhcp-232-125.americas.sgi.com> <20120925005632.GB23520@dastard> <5061CA48.3040202@sgi.com> <20120925220110.GF29154@dastard> <50630DB6.4070405@sgi.com> <20120926234149.GJ29154@dastard> In-Reply-To: <20120926234149.GJ29154@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/26/12 18:41, Dave Chinner wrote: > On Wed, Sep 26, 2012 at 09:14:14AM -0500, Mark Tinguely wrote: >> On 09/25/12 17:01, Dave Chinner wrote: >>> On Tue, Sep 25, 2012 at 10:14:16AM -0500, Mark Tinguely wrote: >> >> >> >>>>>> >>>>>> As a bonus, consolidating the loops into one worker actually gives a slight >>>>>> performance advantage. >>>>> >>>>> Can you quantify it? >>>> >>>> I was comparing the bonnie and iozone benchmarks outputs. I will see >>>> if someone can enlighten me on how to quantify those numbers. >>> >>> Ugh. >>> >>> Don't bother. Those are two of the worst offenders in the "useless >>> benchmarks for regression testing" category. Yeah, they *look* like >>> they give decent numbers, but I've wasted so much time looking at >>> results from these benhmarks only to find they do basic things wrong >>> and give numbers that vary simple because you've made a change that >>> increases or decreases the CPU cache footprint of a code path. >>> >>> e.g. IOZone uses the same memory buffer as the source/destination of >>> all it's IO, and does not touch the contents of it at all. Hence for >>> small IO, the buffer stays resident in the CPU caches and gives >>> unrealsitically high throughput results. Worse is the fact that CPU >>> cache residency of the buffer can change according to the kernel >>> code path taken, so you can get massive changes in throughput just >>> by changing the layout of the code without changing any logic.... >>> >>> IOZone can be useful if you know exactly what you are doing and >>> using it to test a specific code path with a specific set of >>> configurations. e.g. comparing ext3/4/xfs/btrfs on the same kernel >>> and storage is fine. However, the moment you start using it to >>> compare different kernels, it's a total crap shoot.... >> >> does anyone have a good benchmark XFS should use to share >> performance results? A number that we can agree a series does not >> degrade the filesystem.. > > ffsb and fio with benchmark style workload definitions, fsmark when > using total runtime rather than files/s for comparison. I also have a > bunch of hand written scripts that I've written specifically for > purpose for testing stuff like directory traversal and IO > parallelism scalability. > > The problem is that common benchmarks like iozone, postmark, > bonnie++ and dbench are really just load generators that output > numbers - there are all very sensitive to many non-filesystem > changes (e.g. VM tunings) and so have to be run "just right" to > produce meaningful numbers. That "just right" changes from kernel > to kernel, machine to machine (running the same kernel!) and > filesystem to filesystem. > > Dbench is particularly sensitive to VM changes and tunings, as well as > log IO latency. e.g. running it on the same system on different > region of the same disk give significantly different results because > writes to the log are slower on the inner regions of disk. Indeed, > just changing the log stripe unit without changing anything else can > have a marked affect on results... > > I have machines here that I can't use IOzone at all for IO sizes of > less than 4MB because the timing loops it uses don't have enough > granularity to accurately measure syscall times, and hence it > doesn't report throughputs reliably. The worst part is that in the > results output, it doesn't tell you it had problems - youhave to > look inteh log files to get that information and realise that the > entire benchmark run was compromised... > >> lies, damn lies, statistics and then filesystem benchmarks?! :) > > I think I've said that myself many times in the past. ;) Thank-you for the information. > >>> I guess I don't understand what you mean by "loop on >>> xfs_alloc_vextent()" then. >>> >>> The problem I see above is this: >>> >>> thread 1 worker 1 worker 2..max >>> xfs_bmapi_write(userdata) >> >> loops here calling xfs_bmapi_alloc() > > I don't think it can for userdata allocations. Metadata, yes, > userdata, no. > >>> xfs_bmapi_allocate(user) >>> xfs_alloc_vextent(user) >>> wait >>> >>> _xfs_alloc_vextent() >>> locks AGF >> >> first loop it takes the lock > >> one of the next times through the above >> loop it cannot get a worker. deadlock here. > >> >> I saved the xfs_bmalloca and fs_alloc_arg when >> allocating a buffer to verify the paths. >> >>> _xfs_alloc_vextent() >>> blocks on AGF lock >> >>> completes allocation >>> >>> > > And then xfs_bmapi_allocate() increments bma->nallocs after each > successful allocation. Hence the only way we can loop there for > userdata allocations is if the nmap parameter passes in is> 1. > > When it returns to xfs-bmapi_write(), it trims and updates the map, > and then this code prevents it from looping: > > /* > * If we're done, stop now. Stop when we've allocated > * XFS_BMAP_MAX_NMAP extents no matter what. Otherwise > * the transaction may get too big. > */ > if (bno>= end || n>= *nmap || bma.nallocs>= *nmap) > break; > > Because the userdata callers use these values for *nmap: > > xfs_iomap_write_direct nimaps = 1; > xfs_iomap_write_allocate nimaps = 1; > xfs_iomap_write_unwritten nimaps = 1; > xfs_alloc_file_space nimaps = 1; > > So basically there will break out of the loop after a single > allocation, and hence should not be getting stuck on a second > allocation in xfs_bmapi_allocate()/xfs_alloc_vextent() with the AGF > locked from this code path. > > >>> xfs_bmap_add_extent_hole_real >>> xfs_bmap_extents_to_btree >>> xfs_alloc_vextent(user) >>> wait >> >> this does not need a worker, and since in the same > > I agree that it does not *need* a worker, but it will *use* a worker > thread if args->userdata is not initialised to zero. > >> transaction all locks to the AGF buffer are recursive locks. > > Right, the worker won't block on the AGF lock, but if it can't get a > worker because they are all blocked on the AGF lock, then it > deadlocks. > > As I said before, I cannot see any other path that will trigger a > userdata allocation with the AGF locked. So does patch 3 by itself > solve the problem? > I thought I tried it, but I will retry it when I have a free machine. --Mark. From bpm@sgi.com Thu Sep 27 17:47:36 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_48 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8RMlaNW148957 for ; Thu, 27 Sep 2012 17:47:36 -0500 Received: from whiskey.americas.sgi.com (eagdhcp-232-197.americas.sgi.com [128.162.232.197]) by relay1.corp.sgi.com (Postfix) with ESMTP id 1794E8F8059; Thu, 27 Sep 2012 15:48:53 -0700 (PDT) Received: by whiskey.americas.sgi.com (Postfix, from userid 4600) id B2A6E4266DC; Thu, 27 Sep 2012 17:48:52 -0500 (CDT) Date: Thu, 27 Sep 2012 17:48:52 -0500 From: Ben Myers To: Mark Tinguely Cc: xfs@oss.sgi.com Subject: Re: [PATCH 0/3] xfs: allocation worker causes freelist buffer lock hang Message-ID: <20120927224852.GJ13214@sgi.com> References: <20120924171159.GG1140@sgi.com> <201209241809.q8OI94s3003323@eagdhcp-232-125.americas.sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <201209241809.q8OI94s3003323@eagdhcp-232-125.americas.sgi.com> User-Agent: Mutt/1.5.20 (2009-06-14) Hey Mark, On Mon, Sep 24, 2012 at 01:09:04PM -0500, Mark Tinguely wrote: > > From bpm@sgi.com Mon Sep 24 12:11:59 2012 > > Date: Mon, 24 Sep 2012 12:11:59 -0500 > > From: Ben Myers > > To: > > Subject: Re: [PATCH 0/3] xfs: allocation worker causes freelist buffer lock > > hang > > Cc: > > > > Hi Mark, > > > > On Wed, Sep 19, 2012 at 11:31:33AM -0500, tinguely@sgi.com wrote: > > ... > > > I traced the callers of xfs_alloc_vextent(), noting transaction creation, > > > commits and cancels; I noted loops in the callers and which were marked > > > as metadata/userdata. I can send this document to reviewers. > > > > I'd like to see the doc of xfs_alloc_vextent callers and which of them loop. > > Can you post your doc to the list? > > > > Regards, > > Ben > > > Here are the Linux 3.6.x callers of xfs_alloc_vextent() stopping at the > transaction commit/cancel level. Thanks. Here I am going to make some notes to help me to understand the deadlock as you have described. I'm going to make some idiotic, redundant, and obvious commentary for my own understanding and benefit, and then go and spam the list with it. > XFS_BMAPI_METADATA *not* being set implies user data. > > Userdata being set is the community designated indication that an allocate > worker is needed to prevent the overflow of the kernel stack. Even when XFS_BMAPI_METADATA is set, this doesn't necessarily translate into userdata being clear in struct xfs_alloc_arg. This is due to declaring that structure on the stack and then forgetting to zero it. You have fixed all occurances of that in patch 3 of this series. They are: xfs_alloc_fix_freelist, xfs_bmap_btalloc, * xfs_bmap_extents_to_btree, xfs_bmap_local_to_extents, xfs_ialloc_ag_alloc In each of those five stacks we could have intended not to use a worker thread for the allocation, but we used one anyway due to having forgotten to zero the structure. * In xfs_bmap_btalloc, args.userdata is set from ap->userdata before the first call to xfs_alloc_vextent. As long as ap->userdata is initialized properly this one is ok. > Calling xfs_alloc_vextent() several times with the same transaction can cause > a dead lock if a new allocation worker can not be allocated. I noted where the > loops occur. xfs_alloc_vextent() can call itself, those calls must be in the > same allocation worker. This deadlock is characterized by a thread having taken the agf buffer lock in this code path: __xfs_alloc_vextent xfs_alloc_fix_freelist xfs_alloc_read_agf xfs_read_agf The agf buffer gets logged during allocation and stays locked until transaction commit or cancel. The deadlock comes when the transaction which holds the agf lock blocks waiting for a worker, and all of the workers are blocked on the agf lock. So... because the work being done in __xfs_alloc_vextent will always have need of the agf buffer lock, we must never hold the agf lock and then go after a worker thread for allocation. The availability of a worker thread cannot be guaranteed. It's not just a problem with loops. We risk deadlock on every call to xfs_alloc_vextent in the same transaction while the agf lock is held. e.g. multiple tries in xfs_bmap_btalloc. > As a bonus, consolidating the loops into one worker actually gives a slight > performance advantage. > > Sorry this is wider than 80 characters wide. > --- > xfs_bmap_btalloc(xfs_bmalloca_t) args.userdata = ap->userdata; * not worried about patch 3 here > ! xfs_bmap_alloc(xfs_bmalloca_t) > ! ! xfs_bmapi_allocate(xfs_bmalloca_t, ...) > ! ! ! xfs_bmapi_write(xfs_trans_t ...) loops over above Here we risk deadlock in the loop on xfs_bmapi_allocate. That appears to be limited by the number of maps requested. > ! ! ! ! xfs_attr_rmtval_set(xfs_da_args_t) loops over bmapi_write (xfs_attr_set_int) **XFS_BMAPI_METADATA** > ! ! ! ! ! xfs_attr_leaf_addname(xfs_da_args_t) may do a trans_roll > ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel > ! ! ! ! ! xfs_attr_node_addname(xfs_da_args_t) may do a trans_roll > ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel > ! ! ! ! ! ! xfs_attr_leaf_addname(xfs_da_args_t) may do a trans_roll > ! ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel > ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel xfs_attr_rmtval_set calls xfs_bmapi_write in a loop. XFS_BMAPI_METADATA flag was set, so this cannot be using a worker. No risk of this deadlock here. > ! ! ! ! xfs_da_grow_inode_int(xfs_da_args_t) loops over bmapi_write **XFS_BMAPI_METADATA** > ! ! ! ! ! xfs_dir2_grow_inode(struct xfs_da_args) > ! ! ! ! ! ! xfs_dir2_sf_to_block(xfs_da_args_t) > ! ! ! ! ! ! ! xfs_bmap_add_attrfork_local(xfs_trans_t ..) > ! ! ! ! ! ! ! ! xfs_bmap_add_attrfork(...) trans alloc, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! xfs_dir2_sf_addname((xfs_da_args_t) > ! ! ! ! ! ! ! ! xfs_dir_createname(xfs_trans_t) > ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! xfs_dir_canenter(xfs_trans_t ...) > ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! xfs_dir2_leaf_addname(xfs_da_args_t) > ! ! ! ! ! ! ! xfs_dir_createname(xfs_trans_t) > ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! xfs_dir_canenter(xfs_trans_t) > ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! xfs_dir2_block_addname(xfs_da_args_t) > ! ! ! ! ! ! ! xfs_dir_createname(xfs_trans_t) > ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! xfs_dir_canenter(xfs_trans_t ...) > ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! xfs_dir2_sf_addname((xfs_da_args_t) > ! ! ! ! ! ! ! ! xfs_dir_createname(xfs_trans_t) > ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! xfs_dir_canenter(xfs_trans_t ...) > ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! xfs_dir2_leaf_to_node(xfs_da_args_t) > ! ! ! ! ! ! ! xfs_dir2_leaf_addname(xfs_da_args_t) > ! ! ! ! ! ! ! ! xfs_dir_createname(xfs_trans_t) > ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! xfs_dir_canenter(xfs_trans_t ...) > ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! xfs_dir2_block_addname(xfs_da_args_t) > ! ! ! ! ! ! ! ! ! xfs_dir_createname(xfs_trans_t) > ! ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! xfs_dir_canenter(xfs_trans_t ...) > ! ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! xfs_dir2_sf_addname((xfs_da_args_t) > ! ! ! ! ! ! ! ! ! ! xfs_dir_createname(xfs_trans_t) > ! ! ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! ! xfs_dir_canenter(xfs_trans_t ...) > ! ! ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! xfs_dir2_node_addname_int(xfs_da_args_t ...) > ! ! ! ! ! ! ! xfs_dir2_node_addname(xfs_da_args_t) > ! ! ! ! ! ! ! ! xfs_dir_createname(xfs_trans_t) > ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! xfs_dir_canenter(xfs_trans_t ...) > ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! xfs_dir2_leaf_addname(xfs_da_args_t) > ! ! ! ! ! ! ! ! ! xfs_dir_createname(xfs_trans_t) > ! ! ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! xfs_dir_canenter(xfs_trans_t) > ! ! ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! xfs_da_grow_inode(xfs_da_args) > ! ! ! ! ! ! xfs_attr_shortform_to_leaf(xfs_da_args_t) > ! ! ! ! ! ! ! xfs_attr_set_int(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! xfs_attr_leaf_to_node(xfs_da_args_t) > ! ! ! ! ! ! ! xfs_attr_leaf_addname(xfs_da_args_t) may do a trans_roll > ! ! ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel > ! ! ! ! ! ! ! xfs_attr_node_addname(xfs_da_args_t) may do a trans_roll > ! ! ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel > ! ! ! ! ! ! ! ! xfs_attr_leaf_addname(xfs_da_args_t) may do a trans_roll > ! ! ! ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel > ! ! ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel > ! ! ! ! ! ! xfs_attr_leaf_split(xfs_da_state_t ...) > ! ! ! ! ! ! ! xfs_da_split(xfs_da_state_t) loops over xfs_attr_leaf_split > ! ! ! ! ! ! ! ! xfs_attr_node_addname(xfs_da_args_t) trans_roll > ! ! ! ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel > ! ! ! ! ! ! ! ! ! xfs_attr_leaf_addname(xfs_da_args_t) may do a trans_roll > ! ! ! ! ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel > ! ! ! ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel > ! ! ! ! ! ! ! ! xfs_dir2_node_addname(xfs_da_args_t) > ! ! ! ! ! ! ! ! ! xfs_dir_createname(xfs_trans_t) > ! ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! xfs_dir_canenter(xfs_trans_t ...) > ! ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! xfs_dir2_leaf_addname(xfs_da_args_t) > ! ! ! ! ! ! ! ! ! ! xfs_dir_createname(xfs_trans_t) > ! ! ! ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! ! xfs_dir_canenter(xfs_trans_t) > ! ! ! ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! xfs_da_root_split(xfs_da_state_t ...) > ! ! ! ! ! ! ! xfs_da_split(xfs_da_state_t) loops over xfs_attr_leaf_split > ! ! ! ! ! ! ! ! xfs_attr_node_addname(xfs_da_args_t) trans_roll > ! ! ! ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel > ! ! ! ! ! ! ! ! ! xfs_attr_leaf_addname(xfs_da_args_t) may do a trans_roll > ! ! ! ! ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel > ! ! ! ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel > ! ! ! ! ! ! xfs_da_node_split(xfs_da_state_t ...) > ! ! ! ! ! ! ! ! xfs_da_split(xfs_da_state_t) loops over xfs_attr_leaf_split > ! ! ! ! ! ! ! ! ! xfs_attr_node_addname(xfs_da_args_t) trans_roll > ! ! ! ! ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel > ! ! ! ! ! ! ! ! ! ! xfs_attr_leaf_addname(xfs_da_args_t) may do a trans_roll > ! ! ! ! ! ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel > ! ! ! ! ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel > ! ! ! ! ! ! xfs_dir2_block_to_leaf(xfs_da_args_t ...) > ! ! ! ! ! ! ! xfs_dir2_block_addname(xfs_da_args_t) > ! ! ! ! ! ! ! ! xfs_dir_createname(xfs_trans_t) > ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! xfs_dir_canenter(xfs_trans_t ...) > ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! xfs_dir2_sf_addname((xfs_da_args_t) > ! ! ! ! ! ! ! ! ! xfs_dir_createname(xfs_trans_t) > ! ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! xfs_dir_canenter(xfs_trans_t ...) > ! ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! xfs_dir2_leafn_split(xfs_da_state_t...) > ! ! ! ! ! ! ! xfs_da_split(xfs_da_state_t) loops over xfs_attr_leaf_split > ! ! ! ! ! ! ! ! xfs_attr_node_addname(xfs_da_args_t) trans_roll > ! ! ! ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel > ! ! ! ! ! ! ! ! ! xfs_attr_leaf_addname(xfs_da_args_t) may do a trans_roll > ! ! ! ! ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel > ! ! ! ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel No risk of deadlock here due to XFS_BMAPI_METADATA flag. > ! ! ! ! xfs_qm_dqalloc(xfs_trans_t ...) does a xfs_bmap_finish/cancel **XFS_BMAPI_METADATA** > ! ! ! ! ! xfs_qm_dqtobp(xfs_trans_t ...) > ! ! ! ! ! ! xfs_qm_dqread(...) does the trans_alloc/commit/cancel No risk of deadlock here due to XFS_BMAPI_METADATA flag. > ! ! ! ! xfs_iomap_write_direct(...) alloc trans, xfs_trans_commit/cancel This allocates it's own transaction and will use a worker since it isn't metadata. Hmm. > ! ! ! ! xfs_iomap_write_allocate(...) alloc trans, xfs_trans_commit/cancel safe loop So this is a safe loop because the transaction alloc/commit is within the loop... and nmap = 1. Pfff. This is in the stack you posted for this series. So I'm a little confused. I haven't got through the full list yet. I'll send this today to keep things moving and pick up again tomorrow. Regards, Ben > ! ! ! ! xfs_iomap_write_unwritten(..) alloc trans, xfs_trans_commit/cancel safe loop > ! ! ! ! xfs_growfs_rt_alloc(..) alloc trans, xfs_trans_commit/cancel safe loop > ! ! ! ! xfs_symlink(...) allocates trans does a xfs_trans_commit/cancel > ! ! ! ! xfs_alloc_file_space(...) alloc trans, xfs_trans_commit/cancel safe loop > > xfs_bmap_extents_to_btree(xfs_trans_t ...) <- set userdata to 0 (patch 3) > ! xfs_bmap_add_attrfork_extents(xfs_trans_t ...) > ! ! xfs_bmap_add_attrfork(...) allocates trans does a xfs_trans_commit/cancel > ! xfs_bmap_add_extent_delay_real(fs_bmalloca) > ! ! xfs_bmapi_allocate(xfs_bmalloca_t, ...) > ! ! ! > ! xfs_bmap_add_extent_unwritten_real(xfs_trans_t ...) > ! ! xfs_bmapi_convert_unwritten(xfs_bmalloca ...) > ! ! ! xfs_bmapi_write(xfs_trans ...) calls xfs_bmapi_convert_unwritten in loop XFS_BMAPI_METADATA > ! ! ! ! ... > ! ! xfs_bunmapi(xfs_trans_t ...) XFS_BMAPI_METADATA > ! ! ! xfs_attr_rmtval_remove(xfs_da_args_t) loops calling xfs_bunmapi **XFS_BMAPI_METADATA** > ! ! ! ! xfs_attr_leaf_addname(xfs_da_args_t) may do a trans_roll > ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel > ! ! ! ! xfs_attr_node_addname(xfs_da_args_t) trans_roll > ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel > ! ! ! ! ! xfs_attr_leaf_addname(xfs_da_args_t) may do a trans_roll > ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel > ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel > ! ! ! ! xfs_attr_node_removename(xfs_da_args_t) > ! ! ! ! ! xfs_attr_remove_int(...) allocates trans does a xfs_trans_commit/cancel > ! ! ! xfs_dir2_shrink_inode(xfs_da_args_t) **XFS_BMAPI_METADATA** > ! ! ! ! xfs_dir2_leaf_trim_data(xfs_da_args_t) > ! ! ! ! ! xfs_dir2_leaf_to_block(xfs_da_args_t ...) > ! ! ! ! ! ! xfs_dir2_leaf_removename(xfs_da_args_t) > ! ! ! ! ! ! ! xfs_dir_removename(xfs_trans ...) > ! ! ! ! ! ! ! ! xfs_remove(...) allocates trans does a xfs_trans_commit/cancel > ! ! ! ! xfs_dir2_leaf_trim_data(xfs_da_args_t) > ! ! ! ! ! xfs_dir2_leaf_to_block(xfs_da_args_t ...) > ! ! ! ! ! ! xfs_dir2_leaf_removename(xfs_da_args_t) > ! ! ! ! ! ! ! xfs_dir_removename(xfs_trans ...) > ! ! ! ! ! ! ! ! xfs_remove(...) allocates trans does a xfs_trans_commit/cancel > ! ! ! ! ! ! xfs_dir2_node_to_leaf(xfs_da_state_t) > ! ! ! ! ! ! ! xfs_dir2_node_removename(xfs_da_args_t) > ! ! ! ! ! ! ! ! xfs_dir_removename(xfs_trans_t ...) creates the xfs_da_args_t > ! ! ! ! ! ! ! ! ! xfs_remove(...) allocates trans does a xfs_trans_commit/cancel > ! ! ! ! xfs_dir2_node_to_leaf(xfs_da_state_t) > ! ! ! ! ! xfs_dir2_node_removename(xfs_da_args_t) > ! ! ! ! ! ! xfs_dir_removename(xfs_trans_t ...) creates the xfs_da_args_t > ! ! ! ! ! ! ! xfs_remove(...) allocates trans does a xfs_trans_commit/cancel > ! ! ! xfs_bmap_punch_delalloc_range(...) loops calling xfs_bunmapi with NULL tp > ! ! ! xfs_da_shrink_inode(xfs_da_args_t) loops calling xfs_bunmapi **XFS_BMAPI_METADATA** > ! ! ! ! xfs_dir2_leaf_to_block(xfs_da_args_t ...) > ! ! ! ! ! xfs_dir2_leaf_removename(xfs_da_args_t) > ! ! ! ! ! ! xfs_dir_removename(xfs_trans ...) > ! ! ! ! ! ! ! xfs_remove(...) allocates trans does a xfs_trans_commit/cancel > ! ! ! xfs_itruncate_extents(xfs_trans ...) loops calling xfs_bunmapi with new tp > ! ! ! xfs_inactive_symlink_rmt(..., xfs_trans_t) does a trans_commit and trans_dup > ! ! ! xfs_free_file_space(...) loops calling xfs_bmapi with new tp > ! xfs_bmap_add_extent_hole_real(xfs_bmalloca ...) > ! ! xfs_bmapi_allocate(xfs_bmalloca_t, ...) > ! ! ! ... > ! xfs_bunmapi(xfs_trans_t ...) XFS_BMAPI_METADATA > ! ! ... > > xfs_bmap_local_to_extents(xfs_trans_t ...) <- set userdata to 0 (patch 3) > ! xfs_bmap_add_attrfork_local(xfs_trans_t ..) > ! ! xfs_bmap_add_attrfork(...) trans alloc, bmap_finish trans_commit/cancel > ! xfs_bmapi_write(xfs_trans_t ...) XFS_BMAPI_METADATA > ! ! ... > > xfs_ialloc_ag_alloc(xfs_trans_t ...) userdata == 0 > ! xfs_dialloc(xfs_trans ...) loops over the above > ! ! xfs_ialloc(xfs_trans ...) > ! ! ! xfs_dir_ialloc(xfs_trans ...) > ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel > > xfs_bmbt_alloc_block(xfs_btree_cur, ...) userdata == 0 > ! xfs_btree_split(xfs_btree_cur, ...) > ! ! xfs_btree_make_block_unfull > ! ! ! xfs_btree_insrec(xfs_btree_cur, ...) > ! ! ! ! xfs_btree_insert(xfs_btree_cur, ...) > ! ! ! ! ! xfs_alloc_fixup_trees(xfs_btree_cur, ...) > ! ! ! ! ! ! xfs_alloc_ag_vextent_exact(xfs_alloc_arg) > ! ! ! ! ! ! ! xfs_alloc_ag_vextent(xfs_alloc_arg) > ! ! ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) > ! ! ! ! ! ! xfs_alloc_ag_vextent_near(xfs_alloc_arg) > ! ! ! ! ! ! ! xfs_alloc_ag_vextent(xfs_alloc_arg) > ! ! ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) > ! ! ! ! ! ! xfs_alloc_ag_vextent_size(xfs_alloc_arg) > ! ! ! ! ! ! ! xfs_alloc_ag_vextent(xfs_alloc_arg) > ! ! ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) > ! ! ! ! ! xfs_free_ag_extent(xfs_trans ...) > ! ! ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) > ! ! ! ! ! xfs_bmap_add_extent_delay_real(xfs_bmalloca) > ! ! ! ! ! ! xfs_bmapi_allocate(xfs_bmalloca_t, ...) > ! ! ! ! ! ! ! ! ... > ! ! ! ! ! xfs_bmap_add_extent_hole_real(xfs_bmalloca) > ! ! ! ! ! ! xfs_bmapi_allocate(xfs_bmalloca_t, ...) > ! ! ! ! ! ! ! ! ... > ! ! ! ! ! xfs_bmap_add_extent_unwritten_real(xfs_trans, ...) > ! ! ! ! ! ! xfs_bunmapi(xfs_trans_t ...) XFS_BMAPI_METADATA > ! ! ! ! ! ! ! ... > ! ! ! ! ! ! xfs_bmapi_convert_unwritten(xfs_bmalloca, ...) > ! ! ! ! ! ! ! xfs_bmapi_write(xfs_trans_t ...) loop over the above > ! ! ! ! ! ! ! ! ... > ! ! ! ! ! xfs_bmap_del_extent(xfs_trans, ...) > ! ! ! ! ! ! xfs_bunmapi(xfs_trans_t ...) XFS_BMAPI_METADATA > ! ! ! ! ! ! ! ... > ! ! ! ! ! xfs_ialloc_ag_alloc(xfs_trans, ...) loops over the above > ! ! ! ! ! ! xfs_dialloc(xfs_trans ...) loops over the above > ! ! ! ! ! ! ! xfs_ialloc(xfs_trans ...) > ! ! ! ! ! ! ! ! xfs_dir_ialloc(xfs_trans ...) > ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel > ! xfs_btree_new_iroot(xfs_btree_cur, ...) > ! ! xfs_btree_make_block_unfull(xfs_btree_cur, ...) > ! ! ! xfs_btree_insrec(xfs_btree_cur, ...) > ! ! ! ! xfs_btree_insert(xfs_btree_cur, ...) > ! ! ! ! ! xfs_alloc_fixup_trees(xfs_btree_cur, ...) > ! ! ! ! ! ! xfs_alloc_ag_vextent_exact(xfs_alloc_arg) > ! ! ! ! ! ! ! xfs_alloc_ag_vextent(xfs_alloc_arg) > ! ! ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) > ! ! ! ! ! ! xfs_alloc_ag_vextent_near(xfs_alloc_arg) > ! ! ! ! ! ! ! xfs_alloc_ag_vextent(xfs_alloc_arg) > ! ! ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) > ! ! ! ! ! ! xfs_alloc_ag_vextent_size(xfs_alloc_arg) > ! ! ! ! ! ! ! xfs_alloc_ag_vextent(xfs_alloc_arg) > ! ! ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) > ! ! xfs_bmap_add_attrfork_btree(xfs_trans_t ...) > ! ! ! xfs_bmap_add_attrfork(...) allocates trans does a xfs_trans_commit/cancel > ! xfs_btree_new_root(xfs_btree_cur, ...) > ! ! xfs_btree_insrec(xfs_btree_cur, ...) > ! ! ! xfs_btree_insert(xfs_btree_cur, ...) > ! ! ! xfs_alloc_fixup_trees(xfs_btree_cur, ...) > ! ! ! ! xfs_alloc_ag_vextent_exact(xfs_alloc_arg) > ! ! ! ! ! xfs_alloc_ag_vextent(xfs_alloc_arg) > ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) > ! ! ! ! xfs_alloc_ag_vextent_near(xfs_alloc_arg) > ! ! ! ! ! xfs_alloc_ag_vextent(xfs_alloc_arg) > ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) > ! ! ! ! xfs_alloc_ag_vextent_size(xfs_alloc_arg) > ! ! ! ! ! xfs_alloc_ag_vextent(xfs_alloc_arg) > ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) > > xfs_inobt_alloc_block(xfs_btree_cur, ...) userdata == 0 > ! xfs_btree_split(xfs_btree_cur, ...) > ! ! xfs_btree_make_block_unfull > ! ! ! xfs_btree_insrec(xfs_btree_cur, ...) > ! ! ! ! xfs_btree_insert(xfs_btree_cur, ...) > ! ! ! ! ! xfs_alloc_fixup_trees(xfs_btree_cur, ...) > ! ! ! ! ! ! xfs_alloc_ag_vextent_exact(xfs_alloc_arg) > ! ! ! ! ! ! ! xfs_alloc_ag_vextent(xfs_alloc_arg) > ! ! ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) > ! ! ! ! ! ! xfs_alloc_ag_vextent_near(xfs_alloc_arg) > ! ! ! ! ! ! ! xfs_alloc_ag_vextent(xfs_alloc_arg) > ! ! ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) > ! ! ! ! ! ! xfs_alloc_ag_vextent_size(xfs_alloc_arg) > ! ! ! ! ! ! ! xfs_alloc_ag_vextent(xfs_alloc_arg) > ! ! ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) > ! ! ! ! ! xfs_free_ag_extent(xfs_trans ...) > ! ! ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) > ! ! ! ! ! xfs_bmap_add_extent_delay_real(xfs_bmalloca) > ! ! ! ! ! ! xfs_bmapi_allocate(xfs_bmalloca_t, ...) > ! ! ! ! ! ! ! ! ... > ! ! ! ! ! xfs_bmap_add_extent_hole_real(xfs_bmalloca) > ! ! ! ! ! ! xfs_bmapi_allocate(xfs_bmalloca_t, ...) > ! ! ! ! ! ! ! ! ... > ! ! ! ! ! xfs_bmap_add_extent_unwritten_real(xfs_trans, ...) > ! ! ! ! ! ! xfs_bunmapi(xfs_trans_t ...) XFS_BMAPI_METADATA > ! ! ! ! ! ! ! ... > ! ! ! ! ! ! xfs_bmapi_convert_unwritten(xfs_bmalloca, ...) > ! ! ! ! ! ! ! xfs_bmapi_write(xfs_trans_t ...) loop over the above > ! ! ! ! ! ! ! ! ... > ! ! ! ! ! xfs_bmap_del_extent(xfs_trans, ...) > ! ! ! ! ! ! xfs_bunmapi(xfs_trans_t ...) XFS_BMAPI_METADATA > ! ! ! ! ! ! ! ... > ! ! ! ! ! xfs_ialloc_ag_alloc(xfs_trans, ...) loops over the above > ! ! ! ! ! ! xfs_dialloc(xfs_trans ...) loops over the above > ! ! ! ! ! ! ! xfs_ialloc(xfs_trans ...) > ! ! ! ! ! ! ! ! xfs_dir_ialloc(xfs_trans ...) > ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel > ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel > ! xfs_btree_new_iroot(xfs_btree_cur, ...) > ! ! xfs_btree_make_block_unfull(xfs_btree_cur, ...) > ! ! ! xfs_btree_insrec(xfs_btree_cur, ...) > ! ! ! ! xfs_btree_insert(xfs_btree_cur, ...) > ! ! ! ! ! xfs_alloc_fixup_trees(xfs_btree_cur, ...) > ! ! ! ! ! ! xfs_alloc_ag_vextent_exact(xfs_alloc_arg) > ! ! ! ! ! ! ! xfs_alloc_ag_vextent(xfs_alloc_arg) > ! ! ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) > ! ! ! ! ! ! xfs_alloc_ag_vextent_near(xfs_alloc_arg) > ! ! ! ! ! ! ! xfs_alloc_ag_vextent(xfs_alloc_arg) > ! ! ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) > ! ! ! ! ! ! xfs_alloc_ag_vextent_size(xfs_alloc_arg) > ! ! ! ! ! ! ! xfs_alloc_ag_vextent(xfs_alloc_arg) > ! ! ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) > ! ! xfs_bmap_add_attrfork_btree(xfs_trans_t ...) > ! ! ! xfs_bmap_add_attrfork(...) allocates trans does a xfs_trans_commit/cancel > ! xfs_btree_new_root(xfs_btree_cur, ...) > ! ! xfs_btree_insrec(xfs_btree_cur, ...) > ! ! ! xfs_btree_insert(xfs_btree_cur, ...) > ! ! ! xfs_alloc_fixup_trees(xfs_btree_cur, ...) > ! ! ! ! xfs_alloc_ag_vextent_exact(xfs_alloc_arg) > ! ! ! ! ! xfs_alloc_ag_vextent(xfs_alloc_arg) > ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) > ! ! ! ! xfs_alloc_ag_vextent_near(xfs_alloc_arg) > ! ! ! ! ! xfs_alloc_ag_vextent(xfs_alloc_arg) > ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) > ! ! ! ! xfs_alloc_ag_vextent_size(xfs_alloc_arg) > ! ! ! ! ! xfs_alloc_ag_vextent(xfs_alloc_arg) > ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) > > --Mark. > > _______________________________________________ > xfs mailing list > xfs@oss.sgi.com > http://oss.sgi.com/mailman/listinfo/xfs From david@fromorbit.com Thu Sep 27 17:49:32 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8RMnWJM149145 for ; Thu, 27 Sep 2012 17:49:32 -0500 X-ASG-Debug-ID: 1348786251-04cb6c794251030001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id QX2PCNuO6lqbhNM3 for ; Thu, 27 Sep 2012 15:50:51 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Aq0MAPLXZFB5LPfb/2dsb2JhbAA9CIUit1EBAoETgQmCIAEBBTocIxAIAxguFCUDIRMbh2m4KRSLBBZXRYQLYAOVaJAsgnk Received: from ppp121-44-247-219.lns20.syd7.internode.on.net (HELO dastard) ([121.44.247.219]) by ipmail04.adl6.internode.on.net with ESMTP; 28 Sep 2012 08:20:50 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1THMup-0006ho-GT; Fri, 28 Sep 2012 08:50:43 +1000 Date: Fri, 28 Sep 2012 08:50:43 +1000 From: Dave Chinner To: "Josef 'Jeff' Sipek" Cc: xfs@oss.sgi.com Subject: Re: task blocked for more than 120 seconds Message-ID: <20120927225043.GA25626@dastard> X-ASG-Orig-Subj: Re: task blocked for more than 120 seconds References: <20120418151139.GC4652@poseidon.cudanet.local> <20120418234821.GR6734@dastard> <20120419154601.GB8230@poseidon.cudanet.local> <20120419225603.GA9541@dastard> <20120420135820.GB9189@poseidon.cudanet.local> <20120421002932.GG9541@dastard> <20120423202441.GD21260@poseidon.cudanet.local> <20120423232759.GO9541@dastard> <20120927124914.GD28852@poseidon> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20120927124914.GD28852@poseidon> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1348786251 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109772 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Sep 27, 2012 at 08:49:15AM -0400, Josef 'Jeff' Sipek wrote: > On Tue, Apr 24, 2012 at 09:27:59AM +1000, Dave Chinner wrote: > ... > > So, yes, your hangs are definitely due to inode buffer RMW cycles > > when trying to flush dirty inodes from the cache. I have a few > > ideas on how to fix this - but I'm not sure whether a current TOT > > solution will be easily back-portable. The simplest solution is a > > readahead based solution - AIL pushing is async, and will cycle back > > to inodes that it failed to flush the first time past, so triggering > > readahead on the first pass might work just fine. > > Have you had time to look at this? No. > (We got bitten by this again and I > really don't want to go back to ext4.) Is there anything I can help with? What is needed is a xfs_inode_readahead function(), which takes an xfs inode and attempts to issue readahead on the underlying buffer if it is not found in cache. The simplest thing to do is add another flag to xfs_buf_read that is passed through from xfs_iflush() to say "don't block on read". Indeed, we used to have a XBF_DONT_BLOCK flag that we removed recently becuse it was the default behaviour for everything. That could be reintroduced to tell xfs_buf_read_map() that it should return the bufer if it is in cache, or issue readahead and return null if it is not found in memory so that a read a little while later might find it. COmbined iwth the XBF_TRYLOCK that xfs_iflush alrady uses, it won't block on read IO already in progress, either. i.e. there's a difference between not-in-cache and in-cache-but-locked when it comes to issuing readahead, so there might need to be slight changes to xfs_buf_find() to accomodate that. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Thu Sep 27 17:51:31 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8RMpVQU149353 for ; Thu, 27 Sep 2012 17:51:31 -0500 X-ASG-Debug-ID: 1348786369-04bdf0289d55c80001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 5W9sX8TT7PAJt0i1 for ; Thu, 27 Sep 2012 15:52:50 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Aq0MAPLXZFB5LPfb/2dsb2JhbABFhSK3UQECgROBCYIgAQEFOhwjEAgDGC4UJQMhE4gEuCkUiwRtRYQLYAOVaIk9hm+CeQ Received: from ppp121-44-247-219.lns20.syd7.internode.on.net (HELO dastard) ([121.44.247.219]) by ipmail04.adl6.internode.on.net with ESMTP; 28 Sep 2012 08:22:49 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1THMwq-0006iX-U2; Fri, 28 Sep 2012 08:52:48 +1000 Date: Fri, 28 Sep 2012 08:52:48 +1000 From: Dave Chinner To: Mark Tinguely Cc: xfs@oss.sgi.com, Ben Myers Subject: Re: [PATCH v2] xfsprog: remove duplicate vector memalign from xfs_io Message-ID: <20120927225248.GB25626@dastard> X-ASG-Orig-Subj: Re: [PATCH v2] xfsprog: remove duplicate vector memalign from xfs_io References: <20120925142414.660506845@sgi.com> <20120925142421.398175185@sgi.com> <20120926220434.GG13214@sgi.com> <20120927124742.695778439@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20120927124742.695778439@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1348786369 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109772 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Sep 27, 2012 at 07:47:36AM -0500, Mark Tinguely wrote: > The vector feature of xfs_io uses its own memory buffer in the iov structure > and does not use the buffer entry. Remove the duplicate memalign. > > v2: removed global buffer in __dump_buffer() and use passed buf pointer per > Ben's detection. > > Signed-off-by: Mark Tinguely > Reviewed-by: Ben Myers Looks good, Thanks for fixing this. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From tinguely@sgi.com Thu Sep 27 18:16:05 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_48 autolearn=no version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8RNG5Jw151830 for ; Thu, 27 Sep 2012 18:16:05 -0500 Received: from [128.162.232.125] (eagdhcp-232-125.americas.sgi.com [128.162.232.125]) by relay1.corp.sgi.com (Postfix) with ESMTP id 7A9978F808E; Thu, 27 Sep 2012 16:17:22 -0700 (PDT) Message-ID: <5064DE7A.6000608@sgi.com> Date: Thu, 27 Sep 2012 18:17:14 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Ben Myers CC: xfs@oss.sgi.com Subject: Re: [PATCH 0/3] xfs: allocation worker causes freelist buffer lock hang References: <20120924171159.GG1140@sgi.com> <201209241809.q8OI94s3003323@eagdhcp-232-125.americas.sgi.com> <20120927224852.GJ13214@sgi.com> In-Reply-To: <20120927224852.GJ13214@sgi.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/27/12 17:48, Ben Myers wrote: > Hey Mark, > > On Mon, Sep 24, 2012 at 01:09:04PM -0500, Mark Tinguely wrote: >>> From bpm@sgi.com Mon Sep 24 12:11:59 2012 >>> Date: Mon, 24 Sep 2012 12:11:59 -0500 >>> From: Ben Myers >>> To: >>> Subject: Re: [PATCH 0/3] xfs: allocation worker causes freelist buffer lock >>> hang >>> Cc: >>> >>> Hi Mark, >>> >>> On Wed, Sep 19, 2012 at 11:31:33AM -0500, tinguely@sgi.com wrote: >>> ... >>>> I traced the callers of xfs_alloc_vextent(), noting transaction creation, >>>> commits and cancels; I noted loops in the callers and which were marked >>>> as metadata/userdata. I can send this document to reviewers. >>> >>> I'd like to see the doc of xfs_alloc_vextent callers and which of them loop. >>> Can you post your doc to the list? >>> >>> Regards, >>> Ben >> >> >> Here are the Linux 3.6.x callers of xfs_alloc_vextent() stopping at the >> transaction commit/cancel level. > > Thanks. Here I am going to make some notes to help me to understand the > deadlock as you have described. I'm going to make some idiotic, redundant, and > obvious commentary for my own understanding and benefit, and then go and spam > the list with it. > >> XFS_BMAPI_METADATA *not* being set implies user data. >> >> Userdata being set is the community designated indication that an allocate >> worker is needed to prevent the overflow of the kernel stack. > > Even when XFS_BMAPI_METADATA is set, this doesn't necessarily translate into > userdata being clear in struct xfs_alloc_arg. This is due to declaring that > structure on the stack and then forgetting to zero it. You have fixed all > occurances of that in patch 3 of this series. They are: > > xfs_alloc_fix_freelist, > xfs_bmap_btalloc, * > xfs_bmap_extents_to_btree, > xfs_bmap_local_to_extents, > xfs_ialloc_ag_alloc > > In each of those five stacks we could have intended not to use a worker thread > for the allocation, but we used one anyway due to having forgotten to zero the > structure. > > * In xfs_bmap_btalloc, args.userdata is set from ap->userdata before the first > call to xfs_alloc_vextent. As long as ap->userdata is initialized properly > this one is ok. > >> Calling xfs_alloc_vextent() several times with the same transaction can cause >> a dead lock if a new allocation worker can not be allocated. I noted where the >> loops occur. xfs_alloc_vextent() can call itself, those calls must be in the >> same allocation worker. > > This deadlock is characterized by a thread having taken the agf buffer lock in > this code path: > > __xfs_alloc_vextent > xfs_alloc_fix_freelist > xfs_alloc_read_agf > xfs_read_agf > > The agf buffer gets logged during allocation and stays locked until transaction > commit or cancel. > > The deadlock comes when the transaction which holds the agf lock blocks waiting > for a worker, and all of the workers are blocked on the agf lock. > > So... because the work being done in __xfs_alloc_vextent will always have need > of the agf buffer lock, we must never hold the agf lock and then go after a > worker thread for allocation. The availability of a worker thread cannot be > guaranteed. > > It's not just a problem with loops. We risk deadlock on every call to > xfs_alloc_vextent in the same transaction while the agf lock is held. e.g. > multiple tries in xfs_bmap_btalloc. > >> As a bonus, consolidating the loops into one worker actually gives a slight >> performance advantage. >> >> Sorry this is wider than 80 characters wide. >> --- >> xfs_bmap_btalloc(xfs_bmalloca_t) > > args.userdata = ap->userdata; * not worried about patch 3 here > >> ! xfs_bmap_alloc(xfs_bmalloca_t) >> ! ! xfs_bmapi_allocate(xfs_bmalloca_t, ...) >> ! ! ! xfs_bmapi_write(xfs_trans_t ...) loops over above > > Here we risk deadlock in the loop on xfs_bmapi_allocate. That appears to be > limited by the number of maps requested. > >> ! ! ! ! xfs_attr_rmtval_set(xfs_da_args_t) loops over bmapi_write (xfs_attr_set_int) **XFS_BMAPI_METADATA** >> ! ! ! ! ! xfs_attr_leaf_addname(xfs_da_args_t) may do a trans_roll >> ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel >> ! ! ! ! ! xfs_attr_node_addname(xfs_da_args_t) may do a trans_roll >> ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel >> ! ! ! ! ! ! xfs_attr_leaf_addname(xfs_da_args_t) may do a trans_roll >> ! ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel >> ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel > > xfs_attr_rmtval_set calls xfs_bmapi_write in a loop. XFS_BMAPI_METADATA flag > was set, so this cannot be using a worker. No risk of this deadlock here. > >> ! ! ! ! xfs_da_grow_inode_int(xfs_da_args_t) loops over bmapi_write **XFS_BMAPI_METADATA** >> ! ! ! ! ! xfs_dir2_grow_inode(struct xfs_da_args) >> ! ! ! ! ! ! xfs_dir2_sf_to_block(xfs_da_args_t) >> ! ! ! ! ! ! ! xfs_bmap_add_attrfork_local(xfs_trans_t ..) >> ! ! ! ! ! ! ! ! xfs_bmap_add_attrfork(...) trans alloc, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! xfs_dir2_sf_addname((xfs_da_args_t) >> ! ! ! ! ! ! ! ! xfs_dir_createname(xfs_trans_t) >> ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! xfs_dir_canenter(xfs_trans_t ...) >> ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! xfs_dir2_leaf_addname(xfs_da_args_t) >> ! ! ! ! ! ! ! xfs_dir_createname(xfs_trans_t) >> ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! xfs_dir_canenter(xfs_trans_t) >> ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! xfs_dir2_block_addname(xfs_da_args_t) >> ! ! ! ! ! ! ! xfs_dir_createname(xfs_trans_t) >> ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! xfs_dir_canenter(xfs_trans_t ...) >> ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! xfs_dir2_sf_addname((xfs_da_args_t) >> ! ! ! ! ! ! ! ! xfs_dir_createname(xfs_trans_t) >> ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! xfs_dir_canenter(xfs_trans_t ...) >> ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! xfs_dir2_leaf_to_node(xfs_da_args_t) >> ! ! ! ! ! ! ! xfs_dir2_leaf_addname(xfs_da_args_t) >> ! ! ! ! ! ! ! ! xfs_dir_createname(xfs_trans_t) >> ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! xfs_dir_canenter(xfs_trans_t ...) >> ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! xfs_dir2_block_addname(xfs_da_args_t) >> ! ! ! ! ! ! ! ! ! xfs_dir_createname(xfs_trans_t) >> ! ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! xfs_dir_canenter(xfs_trans_t ...) >> ! ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! xfs_dir2_sf_addname((xfs_da_args_t) >> ! ! ! ! ! ! ! ! ! ! xfs_dir_createname(xfs_trans_t) >> ! ! ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! ! xfs_dir_canenter(xfs_trans_t ...) >> ! ! ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! xfs_dir2_node_addname_int(xfs_da_args_t ...) >> ! ! ! ! ! ! ! xfs_dir2_node_addname(xfs_da_args_t) >> ! ! ! ! ! ! ! ! xfs_dir_createname(xfs_trans_t) >> ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! xfs_dir_canenter(xfs_trans_t ...) >> ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! xfs_dir2_leaf_addname(xfs_da_args_t) >> ! ! ! ! ! ! ! ! ! xfs_dir_createname(xfs_trans_t) >> ! ! ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! xfs_dir_canenter(xfs_trans_t) >> ! ! ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! xfs_da_grow_inode(xfs_da_args) >> ! ! ! ! ! ! xfs_attr_shortform_to_leaf(xfs_da_args_t) >> ! ! ! ! ! ! ! xfs_attr_set_int(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! xfs_attr_leaf_to_node(xfs_da_args_t) >> ! ! ! ! ! ! ! xfs_attr_leaf_addname(xfs_da_args_t) may do a trans_roll >> ! ! ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel >> ! ! ! ! ! ! ! xfs_attr_node_addname(xfs_da_args_t) may do a trans_roll >> ! ! ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel >> ! ! ! ! ! ! ! ! xfs_attr_leaf_addname(xfs_da_args_t) may do a trans_roll >> ! ! ! ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel >> ! ! ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel >> ! ! ! ! ! ! xfs_attr_leaf_split(xfs_da_state_t ...) >> ! ! ! ! ! ! ! xfs_da_split(xfs_da_state_t) loops over xfs_attr_leaf_split >> ! ! ! ! ! ! ! ! xfs_attr_node_addname(xfs_da_args_t) trans_roll >> ! ! ! ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel >> ! ! ! ! ! ! ! ! ! xfs_attr_leaf_addname(xfs_da_args_t) may do a trans_roll >> ! ! ! ! ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel >> ! ! ! ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel >> ! ! ! ! ! ! ! ! xfs_dir2_node_addname(xfs_da_args_t) >> ! ! ! ! ! ! ! ! ! xfs_dir_createname(xfs_trans_t) >> ! ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! xfs_dir_canenter(xfs_trans_t ...) >> ! ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! xfs_dir2_leaf_addname(xfs_da_args_t) >> ! ! ! ! ! ! ! ! ! ! xfs_dir_createname(xfs_trans_t) >> ! ! ! ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! ! xfs_dir_canenter(xfs_trans_t) >> ! ! ! ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! xfs_da_root_split(xfs_da_state_t ...) >> ! ! ! ! ! ! ! xfs_da_split(xfs_da_state_t) loops over xfs_attr_leaf_split >> ! ! ! ! ! ! ! ! xfs_attr_node_addname(xfs_da_args_t) trans_roll >> ! ! ! ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel >> ! ! ! ! ! ! ! ! ! xfs_attr_leaf_addname(xfs_da_args_t) may do a trans_roll >> ! ! ! ! ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel >> ! ! ! ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel >> ! ! ! ! ! ! xfs_da_node_split(xfs_da_state_t ...) >> ! ! ! ! ! ! ! ! xfs_da_split(xfs_da_state_t) loops over xfs_attr_leaf_split >> ! ! ! ! ! ! ! ! ! xfs_attr_node_addname(xfs_da_args_t) trans_roll >> ! ! ! ! ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel >> ! ! ! ! ! ! ! ! ! ! xfs_attr_leaf_addname(xfs_da_args_t) may do a trans_roll >> ! ! ! ! ! ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel >> ! ! ! ! ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel >> ! ! ! ! ! ! xfs_dir2_block_to_leaf(xfs_da_args_t ...) >> ! ! ! ! ! ! ! xfs_dir2_block_addname(xfs_da_args_t) >> ! ! ! ! ! ! ! ! xfs_dir_createname(xfs_trans_t) >> ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! xfs_dir_canenter(xfs_trans_t ...) >> ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! xfs_dir2_sf_addname((xfs_da_args_t) >> ! ! ! ! ! ! ! ! ! xfs_dir_createname(xfs_trans_t) >> ! ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! xfs_dir_canenter(xfs_trans_t ...) >> ! ! ! ! ! ! ! ! ! ! xfs_rename(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! ! xfs_link(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! xfs_dir2_leafn_split(xfs_da_state_t...) >> ! ! ! ! ! ! ! xfs_da_split(xfs_da_state_t) loops over xfs_attr_leaf_split >> ! ! ! ! ! ! ! ! xfs_attr_node_addname(xfs_da_args_t) trans_roll >> ! ! ! ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel >> ! ! ! ! ! ! ! ! ! xfs_attr_leaf_addname(xfs_da_args_t) may do a trans_roll >> ! ! ! ! ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel >> ! ! ! ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel > > No risk of deadlock here due to XFS_BMAPI_METADATA flag. > >> ! ! ! ! xfs_qm_dqalloc(xfs_trans_t ...) does a xfs_bmap_finish/cancel **XFS_BMAPI_METADATA** >> ! ! ! ! ! xfs_qm_dqtobp(xfs_trans_t ...) >> ! ! ! ! ! ! xfs_qm_dqread(...) does the trans_alloc/commit/cancel > > No risk of deadlock here due to XFS_BMAPI_METADATA flag. > >> ! ! ! ! xfs_iomap_write_direct(...) alloc trans, xfs_trans_commit/cancel > > This allocates it's own transaction and will use a worker since it isn't > metadata. Hmm. > >> ! ! ! ! xfs_iomap_write_allocate(...) alloc trans, xfs_trans_commit/cancel safe loop > > So this is a safe loop because the transaction alloc/commit is within the > loop... and nmap = 1. > > Pfff. This is in the stack you posted for this series. So I'm a little confused. > > I haven't got through the full list yet. I'll send this today to keep things > moving and pick up again tomorrow. > > Regards, > Ben > >> ! ! ! ! xfs_iomap_write_unwritten(..) alloc trans, xfs_trans_commit/cancel safe loop >> ! ! ! ! xfs_growfs_rt_alloc(..) alloc trans, xfs_trans_commit/cancel safe loop >> ! ! ! ! xfs_symlink(...) allocates trans does a xfs_trans_commit/cancel >> ! ! ! ! xfs_alloc_file_space(...) alloc trans, xfs_trans_commit/cancel safe loop >> >> xfs_bmap_extents_to_btree(xfs_trans_t ...)<- set userdata to 0 (patch 3) >> ! xfs_bmap_add_attrfork_extents(xfs_trans_t ...) >> ! ! xfs_bmap_add_attrfork(...) allocates trans does a xfs_trans_commit/cancel >> ! xfs_bmap_add_extent_delay_real(fs_bmalloca) >> ! ! xfs_bmapi_allocate(xfs_bmalloca_t, ...) >> ! ! ! >> ! xfs_bmap_add_extent_unwritten_real(xfs_trans_t ...) >> ! ! xfs_bmapi_convert_unwritten(xfs_bmalloca ...) >> ! ! ! xfs_bmapi_write(xfs_trans ...) calls xfs_bmapi_convert_unwritten in loop XFS_BMAPI_METADATA >> ! ! ! ! ... >> ! ! xfs_bunmapi(xfs_trans_t ...) XFS_BMAPI_METADATA >> ! ! ! xfs_attr_rmtval_remove(xfs_da_args_t) loops calling xfs_bunmapi **XFS_BMAPI_METADATA** >> ! ! ! ! xfs_attr_leaf_addname(xfs_da_args_t) may do a trans_roll >> ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel >> ! ! ! ! xfs_attr_node_addname(xfs_da_args_t) trans_roll >> ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel >> ! ! ! ! ! xfs_attr_leaf_addname(xfs_da_args_t) may do a trans_roll >> ! ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel >> ! ! ! ! ! xfs_attr_set_int(..) does the trans_alloc/commit/cancel >> ! ! ! ! xfs_attr_node_removename(xfs_da_args_t) >> ! ! ! ! ! xfs_attr_remove_int(...) allocates trans does a xfs_trans_commit/cancel >> ! ! ! xfs_dir2_shrink_inode(xfs_da_args_t) **XFS_BMAPI_METADATA** >> ! ! ! ! xfs_dir2_leaf_trim_data(xfs_da_args_t) >> ! ! ! ! ! xfs_dir2_leaf_to_block(xfs_da_args_t ...) >> ! ! ! ! ! ! xfs_dir2_leaf_removename(xfs_da_args_t) >> ! ! ! ! ! ! ! xfs_dir_removename(xfs_trans ...) >> ! ! ! ! ! ! ! ! xfs_remove(...) allocates trans does a xfs_trans_commit/cancel >> ! ! ! ! xfs_dir2_leaf_trim_data(xfs_da_args_t) >> ! ! ! ! ! xfs_dir2_leaf_to_block(xfs_da_args_t ...) >> ! ! ! ! ! ! xfs_dir2_leaf_removename(xfs_da_args_t) >> ! ! ! ! ! ! ! xfs_dir_removename(xfs_trans ...) >> ! ! ! ! ! ! ! ! xfs_remove(...) allocates trans does a xfs_trans_commit/cancel >> ! ! ! ! ! ! xfs_dir2_node_to_leaf(xfs_da_state_t) >> ! ! ! ! ! ! ! xfs_dir2_node_removename(xfs_da_args_t) >> ! ! ! ! ! ! ! ! xfs_dir_removename(xfs_trans_t ...) creates the xfs_da_args_t >> ! ! ! ! ! ! ! ! ! xfs_remove(...) allocates trans does a xfs_trans_commit/cancel >> ! ! ! ! xfs_dir2_node_to_leaf(xfs_da_state_t) >> ! ! ! ! ! xfs_dir2_node_removename(xfs_da_args_t) >> ! ! ! ! ! ! xfs_dir_removename(xfs_trans_t ...) creates the xfs_da_args_t >> ! ! ! ! ! ! ! xfs_remove(...) allocates trans does a xfs_trans_commit/cancel >> ! ! ! xfs_bmap_punch_delalloc_range(...) loops calling xfs_bunmapi with NULL tp >> ! ! ! xfs_da_shrink_inode(xfs_da_args_t) loops calling xfs_bunmapi **XFS_BMAPI_METADATA** >> ! ! ! ! xfs_dir2_leaf_to_block(xfs_da_args_t ...) >> ! ! ! ! ! xfs_dir2_leaf_removename(xfs_da_args_t) >> ! ! ! ! ! ! xfs_dir_removename(xfs_trans ...) >> ! ! ! ! ! ! ! xfs_remove(...) allocates trans does a xfs_trans_commit/cancel >> ! ! ! xfs_itruncate_extents(xfs_trans ...) loops calling xfs_bunmapi with new tp >> ! ! ! xfs_inactive_symlink_rmt(..., xfs_trans_t) does a trans_commit and trans_dup >> ! ! ! xfs_free_file_space(...) loops calling xfs_bmapi with new tp >> ! xfs_bmap_add_extent_hole_real(xfs_bmalloca ...) >> ! ! xfs_bmapi_allocate(xfs_bmalloca_t, ...) >> ! ! ! ... >> ! xfs_bunmapi(xfs_trans_t ...) XFS_BMAPI_METADATA >> ! ! ... >> >> xfs_bmap_local_to_extents(xfs_trans_t ...)<- set userdata to 0 (patch 3) >> ! xfs_bmap_add_attrfork_local(xfs_trans_t ..) >> ! ! xfs_bmap_add_attrfork(...) trans alloc, bmap_finish trans_commit/cancel >> ! xfs_bmapi_write(xfs_trans_t ...) XFS_BMAPI_METADATA >> ! ! ... >> >> xfs_ialloc_ag_alloc(xfs_trans_t ...) userdata == 0 >> ! xfs_dialloc(xfs_trans ...) loops over the above >> ! ! xfs_ialloc(xfs_trans ...) >> ! ! ! xfs_dir_ialloc(xfs_trans ...) >> ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel >> >> xfs_bmbt_alloc_block(xfs_btree_cur, ...) userdata == 0 >> ! xfs_btree_split(xfs_btree_cur, ...) >> ! ! xfs_btree_make_block_unfull >> ! ! ! xfs_btree_insrec(xfs_btree_cur, ...) >> ! ! ! ! xfs_btree_insert(xfs_btree_cur, ...) >> ! ! ! ! ! xfs_alloc_fixup_trees(xfs_btree_cur, ...) >> ! ! ! ! ! ! xfs_alloc_ag_vextent_exact(xfs_alloc_arg) >> ! ! ! ! ! ! ! xfs_alloc_ag_vextent(xfs_alloc_arg) >> ! ! ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) >> ! ! ! ! ! ! xfs_alloc_ag_vextent_near(xfs_alloc_arg) >> ! ! ! ! ! ! ! xfs_alloc_ag_vextent(xfs_alloc_arg) >> ! ! ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) >> ! ! ! ! ! ! xfs_alloc_ag_vextent_size(xfs_alloc_arg) >> ! ! ! ! ! ! ! xfs_alloc_ag_vextent(xfs_alloc_arg) >> ! ! ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) >> ! ! ! ! ! xfs_free_ag_extent(xfs_trans ...) >> ! ! ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) >> ! ! ! ! ! xfs_bmap_add_extent_delay_real(xfs_bmalloca) >> ! ! ! ! ! ! xfs_bmapi_allocate(xfs_bmalloca_t, ...) >> ! ! ! ! ! ! ! ! ... >> ! ! ! ! ! xfs_bmap_add_extent_hole_real(xfs_bmalloca) >> ! ! ! ! ! ! xfs_bmapi_allocate(xfs_bmalloca_t, ...) >> ! ! ! ! ! ! ! ! ... >> ! ! ! ! ! xfs_bmap_add_extent_unwritten_real(xfs_trans, ...) >> ! ! ! ! ! ! xfs_bunmapi(xfs_trans_t ...) XFS_BMAPI_METADATA >> ! ! ! ! ! ! ! ... >> ! ! ! ! ! ! xfs_bmapi_convert_unwritten(xfs_bmalloca, ...) >> ! ! ! ! ! ! ! xfs_bmapi_write(xfs_trans_t ...) loop over the above >> ! ! ! ! ! ! ! ! ... >> ! ! ! ! ! xfs_bmap_del_extent(xfs_trans, ...) >> ! ! ! ! ! ! xfs_bunmapi(xfs_trans_t ...) XFS_BMAPI_METADATA >> ! ! ! ! ! ! ! ... >> ! ! ! ! ! xfs_ialloc_ag_alloc(xfs_trans, ...) loops over the above >> ! ! ! ! ! ! xfs_dialloc(xfs_trans ...) loops over the above >> ! ! ! ! ! ! ! xfs_ialloc(xfs_trans ...) >> ! ! ! ! ! ! ! ! xfs_dir_ialloc(xfs_trans ...) >> ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel >> ! xfs_btree_new_iroot(xfs_btree_cur, ...) >> ! ! xfs_btree_make_block_unfull(xfs_btree_cur, ...) >> ! ! ! xfs_btree_insrec(xfs_btree_cur, ...) >> ! ! ! ! xfs_btree_insert(xfs_btree_cur, ...) >> ! ! ! ! ! xfs_alloc_fixup_trees(xfs_btree_cur, ...) >> ! ! ! ! ! ! xfs_alloc_ag_vextent_exact(xfs_alloc_arg) >> ! ! ! ! ! ! ! xfs_alloc_ag_vextent(xfs_alloc_arg) >> ! ! ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) >> ! ! ! ! ! ! xfs_alloc_ag_vextent_near(xfs_alloc_arg) >> ! ! ! ! ! ! ! xfs_alloc_ag_vextent(xfs_alloc_arg) >> ! ! ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) >> ! ! ! ! ! ! xfs_alloc_ag_vextent_size(xfs_alloc_arg) >> ! ! ! ! ! ! ! xfs_alloc_ag_vextent(xfs_alloc_arg) >> ! ! ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) >> ! ! xfs_bmap_add_attrfork_btree(xfs_trans_t ...) >> ! ! ! xfs_bmap_add_attrfork(...) allocates trans does a xfs_trans_commit/cancel >> ! xfs_btree_new_root(xfs_btree_cur, ...) >> ! ! xfs_btree_insrec(xfs_btree_cur, ...) >> ! ! ! xfs_btree_insert(xfs_btree_cur, ...) >> ! ! ! xfs_alloc_fixup_trees(xfs_btree_cur, ...) >> ! ! ! ! xfs_alloc_ag_vextent_exact(xfs_alloc_arg) >> ! ! ! ! ! xfs_alloc_ag_vextent(xfs_alloc_arg) >> ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) >> ! ! ! ! xfs_alloc_ag_vextent_near(xfs_alloc_arg) >> ! ! ! ! ! xfs_alloc_ag_vextent(xfs_alloc_arg) >> ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) >> ! ! ! ! xfs_alloc_ag_vextent_size(xfs_alloc_arg) >> ! ! ! ! ! xfs_alloc_ag_vextent(xfs_alloc_arg) >> ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) >> >> xfs_inobt_alloc_block(xfs_btree_cur, ...) userdata == 0 >> ! xfs_btree_split(xfs_btree_cur, ...) >> ! ! xfs_btree_make_block_unfull >> ! ! ! xfs_btree_insrec(xfs_btree_cur, ...) >> ! ! ! ! xfs_btree_insert(xfs_btree_cur, ...) >> ! ! ! ! ! xfs_alloc_fixup_trees(xfs_btree_cur, ...) >> ! ! ! ! ! ! xfs_alloc_ag_vextent_exact(xfs_alloc_arg) >> ! ! ! ! ! ! ! xfs_alloc_ag_vextent(xfs_alloc_arg) >> ! ! ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) >> ! ! ! ! ! ! xfs_alloc_ag_vextent_near(xfs_alloc_arg) >> ! ! ! ! ! ! ! xfs_alloc_ag_vextent(xfs_alloc_arg) >> ! ! ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) >> ! ! ! ! ! ! xfs_alloc_ag_vextent_size(xfs_alloc_arg) >> ! ! ! ! ! ! ! xfs_alloc_ag_vextent(xfs_alloc_arg) >> ! ! ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) >> ! ! ! ! ! xfs_free_ag_extent(xfs_trans ...) >> ! ! ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) >> ! ! ! ! ! xfs_bmap_add_extent_delay_real(xfs_bmalloca) >> ! ! ! ! ! ! xfs_bmapi_allocate(xfs_bmalloca_t, ...) >> ! ! ! ! ! ! ! ! ... >> ! ! ! ! ! xfs_bmap_add_extent_hole_real(xfs_bmalloca) >> ! ! ! ! ! ! xfs_bmapi_allocate(xfs_bmalloca_t, ...) >> ! ! ! ! ! ! ! ! ... >> ! ! ! ! ! xfs_bmap_add_extent_unwritten_real(xfs_trans, ...) >> ! ! ! ! ! ! xfs_bunmapi(xfs_trans_t ...) XFS_BMAPI_METADATA >> ! ! ! ! ! ! ! ... >> ! ! ! ! ! ! xfs_bmapi_convert_unwritten(xfs_bmalloca, ...) >> ! ! ! ! ! ! ! xfs_bmapi_write(xfs_trans_t ...) loop over the above >> ! ! ! ! ! ! ! ! ... >> ! ! ! ! ! xfs_bmap_del_extent(xfs_trans, ...) >> ! ! ! ! ! ! xfs_bunmapi(xfs_trans_t ...) XFS_BMAPI_METADATA >> ! ! ! ! ! ! ! ... >> ! ! ! ! ! xfs_ialloc_ag_alloc(xfs_trans, ...) loops over the above >> ! ! ! ! ! ! xfs_dialloc(xfs_trans ...) loops over the above >> ! ! ! ! ! ! ! xfs_ialloc(xfs_trans ...) >> ! ! ! ! ! ! ! ! xfs_dir_ialloc(xfs_trans ...) >> ! ! ! ! ! ! ! ! ! xfs_create(...) trans allocated, bmap_finish trans_commit/cancel >> ! ! ! ! ! ! ! ! ! xfs_symlink(...) trans allocated, bmap_finish trans_commit/cancel >> ! xfs_btree_new_iroot(xfs_btree_cur, ...) >> ! ! xfs_btree_make_block_unfull(xfs_btree_cur, ...) >> ! ! ! xfs_btree_insrec(xfs_btree_cur, ...) >> ! ! ! ! xfs_btree_insert(xfs_btree_cur, ...) >> ! ! ! ! ! xfs_alloc_fixup_trees(xfs_btree_cur, ...) >> ! ! ! ! ! ! xfs_alloc_ag_vextent_exact(xfs_alloc_arg) >> ! ! ! ! ! ! ! xfs_alloc_ag_vextent(xfs_alloc_arg) >> ! ! ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) >> ! ! ! ! ! ! xfs_alloc_ag_vextent_near(xfs_alloc_arg) >> ! ! ! ! ! ! ! xfs_alloc_ag_vextent(xfs_alloc_arg) >> ! ! ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) >> ! ! ! ! ! ! xfs_alloc_ag_vextent_size(xfs_alloc_arg) >> ! ! ! ! ! ! ! xfs_alloc_ag_vextent(xfs_alloc_arg) >> ! ! ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) >> ! ! xfs_bmap_add_attrfork_btree(xfs_trans_t ...) >> ! ! ! xfs_bmap_add_attrfork(...) allocates trans does a xfs_trans_commit/cancel >> ! xfs_btree_new_root(xfs_btree_cur, ...) >> ! ! xfs_btree_insrec(xfs_btree_cur, ...) >> ! ! ! xfs_btree_insert(xfs_btree_cur, ...) >> ! ! ! xfs_alloc_fixup_trees(xfs_btree_cur, ...) >> ! ! ! ! xfs_alloc_ag_vextent_exact(xfs_alloc_arg) >> ! ! ! ! ! xfs_alloc_ag_vextent(xfs_alloc_arg) >> ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) >> ! ! ! ! xfs_alloc_ag_vextent_near(xfs_alloc_arg) >> ! ! ! ! ! xfs_alloc_ag_vextent(xfs_alloc_arg) >> ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) >> ! ! ! ! xfs_alloc_ag_vextent_size(xfs_alloc_arg) >> ! ! ! ! ! xfs_alloc_ag_vextent(xfs_alloc_arg) >> ! ! ! ! ! ! __xfs_alloc_vextent(xfs_alloc_arg) >> >> --Mark. >> Adding just the 3 patch does not prevent the hang. penguin9:~/xfstests-dev # cat /proc/11432/stack [] xfs_alloc_vextent+0x58/0x80 [xfs] [] xfs_bmap_btalloc+0x319/0x9b0 [xfs] [] xfs_bmap_alloc+0x1a/0x30 [xfs] [] xfs_bmapi_allocate+0xce/0x390 [xfs] [] xfs_bmapi_write+0x5b8/0xb90 [xfs] [] xfs_iomap_write_allocate+0x1b8/0x420 [xfs] [] xfs_map_blocks+0x282/0x410 [xfs] [] xfs_vm_writepage+0x27e/0x660 [xfs] [] __writepage+0xb/0x30 [] write_cache_pages+0x18f/0x3e0 [] generic_writepages+0x37/0x50 [] xfs_vm_writepages+0x2f/0x40 [xfs] [] do_writepages+0x1c/0x30 [] __filemap_fdatawrite_range+0x4f/0x60 [] filemap_fdatawrite_range+0x26/0x30 [] xfs_flush_pages+0x6e/0xe0 [xfs] [] xfs_file_buffered_aio_write+0x11b/0x1c0 [xfs] [] xfs_file_aio_write+0xeb/0x170 [xfs] [] do_sync_write+0x94/0xd0 [] vfs_write+0x8a/0x160 [] sys_pwrite64+0x7b/0x80 [] syscall_call+0x7/0xb [] 0xffffffff penguin9:~/xfstests-dev # cat /proc/11434/stack [] xfs_alloc_vextent+0x58/0x80 [xfs] [] xfs_bmap_btalloc+0x319/0x9b0 [xfs] [] xfs_bmap_alloc+0x1a/0x30 [xfs] [] xfs_bmapi_allocate+0xce/0x390 [xfs] [] xfs_bmapi_write+0x5b8/0xb90 [xfs] [] xfs_iomap_write_allocate+0x1b8/0x420 [xfs] [] xfs_map_blocks+0x282/0x410 [xfs] [] xfs_vm_writepage+0x27e/0x660 [xfs] [] __writepage+0xb/0x30 [] write_cache_pages+0x18f/0x3e0 [] generic_writepages+0x37/0x50 [] xfs_vm_writepages+0x2f/0x40 [xfs] [] do_writepages+0x1c/0x30 [] __filemap_fdatawrite_range+0x4f/0x60 [] filemap_fdatawrite_range+0x26/0x30 [] xfs_flush_pages+0x6e/0xe0 [xfs] [] xfs_file_buffered_aio_write+0x11b/0x1c0 [xfs] [] xfs_file_aio_write+0xeb/0x170 [xfs] [] do_sync_write+0x94/0xd0 [] vfs_write+0x8a/0x160 [] sys_pwrite64+0x7b/0x80 [] syscall_call+0x7/0xb [] 0xffffffff penguin9:~/xfstests-dev # cat /proc/11440/stack [] xfs_alloc_vextent+0x58/0x80 [xfs] [] xfs_bmap_extents_to_btree+0x198/0x5d0 [xfs] [] xfs_bmap_add_extent_delay_real+0x2057/0x2700 [xfs] [] xfs_bmapi_allocate+0x267/0x390 [xfs] [] xfs_bmapi_write+0x5b8/0xb90 [xfs] [] xfs_iomap_write_allocate+0x1b8/0x420 [xfs] [] xfs_map_blocks+0x282/0x410 [xfs] [] xfs_vm_writepage+0x27e/0x660 [xfs] [] __writepage+0xb/0x30 [] write_cache_pages+0x18f/0x3e0 [] generic_writepages+0x37/0x50 [] xfs_vm_writepages+0x2f/0x40 [xfs] [] do_writepages+0x1c/0x30 [] __filemap_fdatawrite_range+0x4f/0x60 [] filemap_fdatawrite_range+0x26/0x30 [] xfs_flush_pages+0x6e/0xe0 [xfs] [] xfs_file_buffered_aio_write+0x11b/0x1c0 [xfs] [] xfs_file_aio_write+0xeb/0x170 [xfs] [] do_sync_write+0x94/0xd0 [] vfs_write+0x8a/0x160 [] sys_pwrite64+0x7b/0x80 [] syscall_call+0x7/0xb [] 0xffffffff penguin9:~/xfstests-dev # cat /proc/11443/stack [] xfs_alloc_vextent+0x58/0x80 [xfs] [] xfs_bmap_btalloc+0x319/0x9b0 [xfs] [] xfs_bmap_alloc+0x1a/0x30 [xfs] [] xfs_bmapi_allocate+0xce/0x390 [xfs] [] xfs_bmapi_write+0x5b8/0xb90 [xfs] [] xfs_iomap_write_allocate+0x1b8/0x420 [xfs] [] xfs_map_blocks+0x282/0x410 [xfs] [] xfs_vm_writepage+0x27e/0x660 [xfs] [] __writepage+0xb/0x30 [] write_cache_pages+0x18f/0x3e0 [] generic_writepages+0x37/0x50 [] xfs_vm_writepages+0x2f/0x40 [xfs] [] do_writepages+0x1c/0x30 [] __filemap_fdatawrite_range+0x4f/0x60 [] filemap_fdatawrite_range+0x26/0x30 [] xfs_flush_pages+0x6e/0xe0 [xfs] [] xfs_file_buffered_aio_write+0x11b/0x1c0 [xfs] [] xfs_file_aio_write+0xeb/0x170 [xfs] [] do_sync_write+0x94/0xd0 [] vfs_write+0x8a/0x160 [] sys_pwrite64+0x7b/0x80 [] syscall_call+0x7/0xb [] 0xffffffff I will run a x86_64 machine overnight to see if I can get a hang on that box too. We are dealing with multiple AGs here, so analysing this one may take more time. Rarely but sometimes, this machine will save core upon receiving a NMI. I will try to get as much information before trying that. --Mark. From tinguely@sgi.com Thu Sep 27 18:25:59 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8RNPxjr152664 for ; Thu, 27 Sep 2012 18:25:59 -0500 Received: from [128.162.232.125] (eagdhcp-232-125.americas.sgi.com [128.162.232.125]) by relay2.corp.sgi.com (Postfix) with ESMTP id 445CB304048; Thu, 27 Sep 2012 16:27:16 -0700 (PDT) Message-ID: <5064E0CC.1000203@sgi.com> Date: Thu, 27 Sep 2012 18:27:08 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Ben Myers CC: xfs@oss.sgi.com Subject: Re: [PATCH 0/3] xfs: allocation worker causes freelist buffer lock hang References: <20120924171159.GG1140@sgi.com> <201209241809.q8OI94s3003323@eagdhcp-232-125.americas.sgi.com> <20120927224852.GJ13214@sgi.com> <5064DE7A.6000608@sgi.com> In-Reply-To: <5064DE7A.6000608@sgi.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/27/12 18:17, Mark Tinguely wrote: > I will run a x86_64 machine overnight to see if I can get a hang > on that box too. > > We are dealing with multiple AGs here, so analysing this one may take > more time. > > Rarely but sometimes, this machine will save core upon receiving a NMI. > I will try to get as much information before trying that. > > --Mark. Sorry, I am tired. This does not have to be multiple AGs. Anyway, the clearing of the xfs_alloc_args structure does not prevent the hang. More tomorrow. --Mark. From tiwarikanand@gmail.com Thu Sep 27 20:25:59 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, HTML_MESSAGE,LOCAL_GNU_PATCH,T_DKIM_INVALID autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8S1PwBu159928 for ; Thu, 27 Sep 2012 20:25:58 -0500 X-ASG-Debug-ID: 1348795636-04bdf0289c5b5d0001-NocioJ Received: from mail-vc0-f181.google.com (mail-vc0-f181.google.com [209.85.220.181]) by cuda.sgi.com with ESMTP id IWTvY1s99cACNmgT (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Thu, 27 Sep 2012 18:27:17 -0700 (PDT) X-Barracuda-Envelope-From: tiwarikanand@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.220.181 X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.181] Received: by vchn11 with SMTP id n11so2838810vch.26 for ; Thu, 27 Sep 2012 18:27:16 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.181] X-Barracuda-IPDD: Level1 [gmail.com/209.85.220.181] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=Gl5beXe5GpLKJ2mjcyFbNppgqc0G2fMspfThMlkOofg=; b=usycr6XrErqb26Viq586QG7vkthjJwRp7AB6vMqEOpEc6hComfFU4LKpfQRyOx0O+u oCOEUvZ/Tpeu/Y8jYrtzZQWWo/9EaASc1TKiPMh6ER/GJLEJvqW4lig8Vl137ENOV3M4 6WS1ucqJI3ezFv+EjjzBjubQts4QAlbKNvQjjQzmnwFVvzSX7XnvhVgIiVPhZDoLglbU TfppZUBJDVXalgStZ6dqkhNV+LMwwRHMIjFztY06fxNF5oRNv5wYkyFg4S4wBe+RNgi5 fwFAwkV8SvM5zTSO6mAr+XvRu+jktfyORISaFd4D8wGZFegcN/n+pGAZz6LXWulb23sF WNyg== MIME-Version: 1.0 Received: by 10.58.74.196 with SMTP id w4mr3332327vev.7.1348795636650; Thu, 27 Sep 2012 18:27:16 -0700 (PDT) Received: by 10.58.255.227 with HTTP; Thu, 27 Sep 2012 18:27:16 -0700 (PDT) In-Reply-To: <20120926061732.GI29154@dastard> References: <505BF45D.5050909@sandeen.net> <20120924075551.GF20960@dastard> <20120926024403.GH29154@dastard> <20120926061732.GI29154@dastard> Date: Thu, 27 Sep 2012 19:27:16 -0600 Message-ID: Subject: Re: xfs_repair deleting realtime files. From: Anand Tiwari X-ASG-Orig-Subj: Re: xfs_repair deleting realtime files. To: Dave Chinner Cc: Eric Sandeen , xfs@oss.sgi.com Content-Type: multipart/alternative; boundary=047d7b86edf6cc149504cab8f458 X-Barracuda-Connect: mail-vc0-f181.google.com[209.85.220.181] X-Barracuda-Start-Time: 1348795637 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED, HTML_MESSAGE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109781 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature 0.00 HTML_MESSAGE BODY: HTML included in message --047d7b86edf6cc149504cab8f458 Content-Type: text/plain; charset=ISO-8859-1 On Wed, Sep 26, 2012 at 12:17 AM, Dave Chinner wrote: > On Tue, Sep 25, 2012 at 09:45:07PM -0600, Anand Tiwari wrote: > > thanks Dave for prompt reply, I meant to implement option 2 as you > > explained (option 3). I will start working on it tomorrow. In the mean > > time, I also had to put something in xfs_repair for the files which > > already exists on the disk. Would you guys willing to review/comment on > > that ? > > Sure. > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > following are my changes for xfs_repair. my goal is to keep changes minimum as they may not included in upstream. I had to do these changes as we already have files with extent map not properly aligned. As we know, this happens only when we are growing a file in a realtime volume. by keeping this in mind, I am checking if start of a record in extent map is not aligned, check previous record and if they are contiguous, we can skip that part of record. let me know if you any issues with this or if someone has better approach. I would like to use pointers for prev and irec but again, I wanted to keep changes minimum thanks anand XFS currently can have records in extent map, which starts from unaligned block w.r.t rextsize. -------------------------------------- xfs_repair considers this as a bug (multiple claims for a one real time extent) and deletes the file. This patch addresses the issue, by comparing current and previous records and make sure they are contiguous and not overlapped. diff --git a/repair/dinode.c b/repair/dinode.c index 5a2da39..5537f1c 100644 --- a/repair/dinode.c +++ b/repair/dinode.c @@ -406,6 +406,7 @@ verify_agbno(xfs_mount_t *mp, static int process_rt_rec( xfs_mount_t *mp, + xfs_bmbt_irec_t *prev, xfs_bmbt_irec_t *irec, xfs_ino_t ino, xfs_drfsbno_t *tot, @@ -413,8 +414,11 @@ process_rt_rec( { xfs_dfsbno_t b; xfs_drtbno_t ext; + xfs_drtbno_t start_block; + xfs_filblks_t block_count; int state; int pwe; /* partially-written extent */ + int rtext_remainder; /* start block is not aligned w.r.t rextsize */ /* * check numeric validity of the extent @@ -461,12 +465,32 @@ _("malformed rt inode extent [%" PRIu64 " %" PRIu64 "] (fs rtext size = %u)\n"), return 1; } + /* If we have start of record unaligned w.r.t to rextsize, see + * if we are sharing this realtime extent with previous record. sharing is only + * allowed with previous extent. fail otherwise. + * Also, if above condition is true, align start block and block count + */ + rtext_remainder = irec->br_startblock % mp->m_sb.sb_rextsize; + if (rtext_remainder) { + do_warn( +_("data fork in rt ino %" PRIu64 " has unalinged start block %"PRIu64 "\n"), + ino, + irec->br_startblock); + if ((prev->br_startoff + prev->br_blockcount == irec->br_startoff) && + (prev->br_startblock + prev->br_blockcount == irec->br_startblock)) { + start_block = irec->br_startblock + (mp->m_sb.sb_rextsize - rtext_remainder); + block_count = irec->br_blockcount - (mp->m_sb.sb_rextsize - rtext_remainder); + } + } else { + start_block = irec->br_startblock; + block_count = irec->br_blockcount; + } + /* * set the appropriate number of extents * this iterates block by block, this can be optimised using extents */ - for (b = irec->br_startblock; b < irec->br_startblock + - irec->br_blockcount; b += mp->m_sb.sb_rextsize) { + for (b = start_block; b < start_block + block_count; b += mp->m_sb.sb_rextsize) { ext = (xfs_drtbno_t) b / mp->m_sb.sb_rextsize; pwe = xfs_sb_version_hasextflgbit(&mp->m_sb) && irec->br_state == XFS_EXT_UNWRITTEN && @@ -548,6 +572,7 @@ process_bmbt_reclist_int( int check_dups, int whichfork) { + xfs_bmbt_irec_t prev; xfs_bmbt_irec_t irec; xfs_dfilblks_t cp = 0; /* prev count */ xfs_dfsbno_t sp = 0; /* prev start */ @@ -574,6 +599,11 @@ process_bmbt_reclist_int( else ftype = _("regular"); + prev.br_startoff = 0; + prev.br_blockcount = 0; + prev.br_startblock = 0; + prev.br_state = 0; + for (i = 0; i < *numrecs; i++) { libxfs_bmbt_disk_get_all(rp + i, &irec); if (i == 0) @@ -610,12 +640,13 @@ _("zero length extent (off = %" PRIu64 ", fsbno = %" PRIu64 ") in ino %" PRIu64 * realtime bitmaps don't use AG locks, so returning * immediately is fine for this code path. */ - if (process_rt_rec(mp, &irec, ino, tot, check_dups)) + if (process_rt_rec(mp, &prev, &irec, ino, tot, check_dups)) return 1; /* * skip rest of loop processing since that'irec.br_startblock * all for regular file forks and attr forks */ + memcpy(&prev, &irec, sizeof(xfs_bmbt_irec_t)); continue; } --047d7b86edf6cc149504cab8f458 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable

On Wed, Sep 26, 2012 at 12:17 AM, Dave C= hinner <david@fromorbit.com> wrote:
On Tue, Sep 25, 2012 at 09:45:07PM -0600, Anand Tiwari wr= ote:
> thanks Dave for prompt reply, I meant to implement option 2 as you
> explained (option 3). =A0I will start working on it tomorrow. In the m= ean
> time, I also had =A0to put something in xfs_repair for the files which=
> already exists on the disk. Would you guys willing to review/comment o= n
> that ?

Sure.

Cheers,

Dave.
--
Dave Chinner
david@fromorbit.com

following are my changes for xfs_re= pair. my goal =A0is to keep changes minimum as they may not included in ups= tream. I had to do these changes as we already have files with extent map n= ot properly aligned.
As we know, this happens only when we are growing a file in a realtime= volume. by keeping this in mind, I am checking if start of a record in ext= ent map is not aligned, check previous record and if they are contiguous, w= e can skip that part of record.=A0

let me know if you any issues with this or if someone h= as better approach. I would like to use pointers for prev and irec but agai= n, I wanted to keep changes minimum

thanks
anand


XFS currently can h= ave records in extent map, which starts from unaligned block w.r.t rextsize= .

--------------------------------------

xfs_repair considers this as a bug (multiple claims for= a one real time extent) and deletes the file.
This patch address= es the issue, by comparing current and previous records and make sure they = are
contiguous and not overlapped.

diff --git a/r= epair/dinode.c b/repair/dinode.c
index 5a2da39..5537f1c 100644
--- a/repair/dinode.c
+++ b/repair/dinode.c
@@ -406,6 +406,7 @@ verify_agbno(xfs_mount_t *mp,
=A0static int
= =A0process_rt_rec(
=A0 xfs_mount_t *mp,
+ xfs_= bmbt_irec_t *prev,
=A0 xfs_bmbt_irec_t *irec,
=A0 xf= s_ino_t in= o,
=A0 <= /span>xfs_drfsbno_t *tot,
@@ -413,8 +414,11 @@ process_rt_rec(
=A0{
=A0 xfs_dfsbno_t b;
=A0 xfs_dr= tbno_t ext= ;
+ xfs_= drtbno_t s= tart_block;
+ xfs_filblks_t block_count;
=A0 in= t state;<= /div>
=A0 int pw= e; /* part= ially-written extent */
+ int = rtext_re= mainder; /*= start block is not aligned w.r.t rextsize */
=A0
=A0 /*
=A0 * check numeric validity of the extent
@@ -461= ,12 +465,32 @@ _("malformed rt inode extent [%" PRIu64 " %&q= uot; PRIu64 "] (fs rtext size =3D %u)\n"),
=A0 r= eturn 1;
=A0 }
=A0
+ /* If we have start of record unaligned w.r.t = to rextsize, see
+ * i= f we are sharing this realtime extent with previous record. sharing is only=
+ * allowed with previous extent. fail otherwise.
+ * A= lso, if above condition is true, align start block and block count
+ */
+ rtext_rem= ainder =3D irec->br_startblock % mp->m_sb.sb_rextsize;
+ if (rtext_rem= ainder) {
+ do_= warn(
+_("data fork in rt ino %" PRIu64 " has unal= inged start block %"PRIu64 "\n"),
+ ino,
+ ire= c->br_startblock);
+ if ((prev->br_startoff + prev->br_blockcount = =3D=3D irec->br_startoff) &&
+ = =A0 =A0(prev->br_startblock + prev->br_blockcount =3D=3D irec->br_= startblock)) {
+ start_block =3D irec->br_startblock + (mp->m_sb.sb_= rextsize - rtext_remainder);
+ bl= ock_count =3D irec->br_blockcount - (mp->m_sb.sb_rextsize - rtext_rem= ainder);
+ }
+ } el= se {
+ = start_block =3D irec->br_startblock;
+ block_count =3D irec->b= r_blockcount;
+ }
+
=A0 /*
=A0 * set the appropriate number of extents
=A0 *= this iterates block by block, this can be optimised using extents
=A0 */
- for (b = =3D irec->br_startblock; b < irec->br_startblock +
- irec->br_= blockcount; b +=3D mp->m_sb.sb_rextsize) =A0{
+ for = (b =3D start_block; b < start_block + block_count; b +=3D mp->m_sb.sb= _rextsize) =A0{
=A0 ext =3D (xfs_drtbno_t) b / mp->m_sb.sb_rextsize;
=A0 p= we =3D xfs_sb_version_hasextflgbit(&mp->m_sb) &&
= =A0 irec= ->br_state =3D=3D XFS_EXT_UNWRITTEN &&
@@ -548,6 +572,7 @@ process_bmbt_reclist_int(
=A0 int check_dups,
=A0<= span class=3D"Apple-tab-span" style=3D"white-space:pre"> int whichfork)
=A0{
+ xfs_bmbt_irec_t prev;
=A0 xfs_bmbt_irec_t irec;
=A0 xf= s_dfilblks_t cp =3D 0; /* prev count */
=A0 xf= s_dfsbno_t sp =3D 0; /* prev start */
@@ -574,6 +599,11 @@ process_bmbt_reclist_int(
=A0 else
=A0 ftype =3D _= ("regular");
=A0
+ prev.br_startoff =3D 0;
+ prev.br_blockcount =3D 0;
+ prev.br_start= block =3D 0;
+ prev= .br_state =3D 0;
+
=A0 for (i =3D 0; i < *numrecs; i++) {
=
=A0 l= ibxfs_bmbt_disk_get_all(rp + i, &irec);
=A0 i= f (i =3D=3D 0)
@@ -610,12 +640,13 @@ _("zero length extent (= off =3D %" PRIu64 ", fsbno =3D %" PRIu64 ") in ino %&qu= ot; PRIu64
=A0 = * realtime bitmaps don't use AG locks, so returning
=A0 * immediatel= y is fine for this code path.
=A0 = */
- = if (process_rt_rec(mp, &irec, ino, tot, check_dups))
+= if (proc= ess_rt_rec(mp, &prev, &irec, ino, tot, check_dups))
=A0 return 1;
=A0 /*
=A0 * skip rest of loop processing since that'irec= .br_startblock
=A0 = * all for regular file forks and attr forks
=A0 */
+ memcpy(&prev, = &irec, sizeof(xfs_bmbt_irec_t));
=A0 = continue;
=A0 }
=A0

--047d7b86edf6cc149504cab8f458-- From xfs@tlinx.org Thu Sep 27 21:12:57 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8S2Cvru164543 for ; Thu, 27 Sep 2012 21:12:57 -0500 X-ASG-Debug-ID: 1348798455-04cb6c794458170001-NocioJ Received: from Ishtar.sc.tlinx.org (ishtar.tlinx.org [173.164.175.65]) by cuda.sgi.com with ESMTP id M5n7J75XT5P8hsre (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO); Thu, 27 Sep 2012 19:14:16 -0700 (PDT) X-Barracuda-Envelope-From: xfs@tlinx.org X-Barracuda-Apparent-Source-IP: 173.164.175.65 Received: from [192.168.3.12] (Athenae [192.168.3.12]) by Ishtar.sc.tlinx.org (8.14.5/8.14.4/SuSE Linux 0.8) with ESMTP id q8S2EDGn021428; Thu, 27 Sep 2012 19:14:15 -0700 Message-ID: <506507F5.5020707@tlinx.org> Date: Thu, 27 Sep 2012 19:14:13 -0700 From: Linda Walsh User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.24) Gecko/20100228 Lightning/0.9 Thunderbird/2.0.0.24 Mnenhy/0.7.6.666 MIME-Version: 1.0 To: Ben Myers CC: xfs-oss Subject: Re: more efficient way to print out inode->block mappings? References: <50643AF7.7060106@tlinx.org> <20120927153415.GI13214@sgi.com> X-ASG-Orig-Subj: Re: more efficient way to print out inode->block mappings? In-Reply-To: <20120927153415.GI13214@sgi.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Barracuda-Connect: ishtar.tlinx.org[173.164.175.65] X-Barracuda-Start-Time: 1348798456 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109784 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Ben Myers wrote: > Hey Linda, > > On Thu, Sep 27, 2012 at 04:39:35AM -0700, Linda Walsh wrote: >> I want to be able to rapidly determine the diffs between 2 volumes. >> >> Special note 1 is an active lvm snapshot of the other -- meaning it is >> frozen in time, but otherwise should look identical the the file system >> as it was when it was snapped. >> >> Sooo... a way of speeding checks is finding out what blocks allocated to the indoes >> are different, since as the new volume gets used, I had hoped that differing >> block numbers might give me a clue as to what had changed.. > > Differing block maps for the same inode on the two filesystems will give you a > clue that there are changes but it isn't perfect: > > Consider xfs_fsr. This might change block numbers for a file but the contents > stayed the same. ---- Yeah -- I figured out the downsides (like a rewrite -- but I was going to try to use the mtime/filesize and block allocs to indicated stuff... But neverthless-- it wouldn't be perfect, so sorta a moot point. What I really need is to look at the block mappings of the underlying lvm -- and see what parts of the FS have been changed due to 'COW'....o What i'm doing is taking successive daily snapshots that overlap each other and picking up the differences and putting them into a tiny static volume I'll probably keep around for a few weeks. The reason -- is that when mounted under a 'special dir', @GMT-time/date, Windows will see those "differences" as previous versions of the files -- unlike the windows version, it keeps active snapshots going... lvm isn't quite so efficient to keep them going for weeks or so.. so I'm only keeping "sparse" trees of the differences. The RUB in all of this is making the "difference" -- rsync takes anywhere from 80-100 minutes running local-local using no compression, and telling it to NOT try to checksum diffs, or send differences - but whole files only... (as anything that would do a checksum of the file will take longer than actually copying the file 2-3 times. It's a 1T partition with usually .8-2.5GB of change/day. I figure anything would be faster than rsync, which is why I'm trying to build up a diff-detector. The resulting 'diff' only takes 30-100 seconds in 'cp' -- that's how little data is usually there... So I figured if any inodes or blocknumbers or sizes or timestamps change, that would be a good basis for finding any builk of changes. It's NOT meant to be a backup mechanism, but a convenience mechanism. -- i.e. It's alot easier to browse to a file on the desktop, and right click and ask for previous versions than it is to restore the file from daily towerhanoi-xfs backups. That's just so much effort, I really have to want the file -- but a right click and look for yesterday's copy? pretty simple. > > Also consider an overwrite situation. The contents of the file are overwritten > and have changed but the block map stayed the same. To detect that we'd need > some kind of generation number on every extent, and we don't have that. > > At this time I don't think we have a solid way to tell you which blocks of a > file are different without actually comparing them. I think you are stuck > looking at the mtime and then doing a full comparison. --- Yeah, and I'm sure I can do it faster than rsync, BUT.. I'd rather take a shortcut if I can catch most of the cases -- and leave the absolute catch everything to the dailies... But I could go either way for this type of application. Given it's known that it isn't going to keep exact backups, but is trying to keep snapshot of files that change -- if something is really written-to, as subtly as writing in place, from a windows client... and it takes 5 times as long... it might not be worth it to catch it. But knowing how to dump the blocks could still be useful in walking the directory and/or comparing files -- the directory walk alone -- if I know the blocks numbers of the dirs, I could walk the directory in the order of the next nearest block -- and when I encounter new dirs, do some type of binary-insertion based on the block numbers .. might get some benefit that way... while my top speed is 1GB/s, I'm lucky to get 100MB on small random i/o's with 20-50 being not-atypical. Certainly an rsync that takes 90 minutes /day to run is a a bit of a pain -- though no one is really 'waiting on it' (other than me to see if I run into a new bug to fix! ;-) ). OTOH, if I could do a snap and diff of the vol in 5 minutes... then doing multiple snapshots in a day might be practical. > Have you looked into using the xfs bulkstat ioctl interfaces? > XFS_IOC_FSBULKSTAT won't get you the block map, but maybe it would be useful to > you. xfs_bmap is using XFS_IOC_GETBMAP*, but it sounds like you've already > considered that. Maybe a creative invocation of xfsdump? --- Yeah... my script is in perl right now ~ 2500 lines or so...mixing required 'C' in with that would be a drag... > > Let me know if I misunderstood and went off the rails. ;) --- not so much -- considering how far off the rails my app is... ;-) From david@fromorbit.com Thu Sep 27 22:07:33 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_65 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8S37Wqb168361 for ; Thu, 27 Sep 2012 22:07:32 -0500 X-ASG-Debug-ID: 1348801730-04cbb069c45b2d0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id lHKc0J0d2dAYqzWU for ; Thu, 27 Sep 2012 20:08:50 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqQMAAIUZVB5LPfb/2dsb2JhbABFvHQBAoESgQmCIAEBBScTHCMQCAMVAy4UJQMhE4gEuDIUiwQVWk2EC2ADkjiDMJAsgnmBSQ Received: from ppp121-44-247-219.lns20.syd7.internode.on.net (HELO dastard) ([121.44.247.219]) by ipmail04.adl6.internode.on.net with ESMTP; 28 Sep 2012 12:38:49 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1THQwZ-00079l-Jq; Fri, 28 Sep 2012 13:08:47 +1000 Date: Fri, 28 Sep 2012 13:08:47 +1000 From: Dave Chinner To: Mark Tinguely Cc: bpm@sgi.com, xfs@oss.sgi.com Subject: Re: [PATCH 0/3] xfs: allocation worker causes freelist buffer lock hang Message-ID: <20120928030847.GC25626@dastard> X-ASG-Orig-Subj: Re: [PATCH 0/3] xfs: allocation worker causes freelist buffer lock hang References: <20120924171159.GG1140@sgi.com> <201209241809.q8OI94s3003323@eagdhcp-232-125.americas.sgi.com> <20120925005632.GB23520@dastard> <5061CA48.3040202@sgi.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5061CA48.3040202@sgi.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1348801730 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109788 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Tue, Sep 25, 2012 at 10:14:16AM -0500, Mark Tinguely wrote: > On 09/24/12 19:56, Dave Chinner wrote: > >On Mon, Sep 24, 2012 at 01:09:04PM -0500, Mark Tinguely wrote: > Your patch hangs when limiting the available workers on test 109 on > the 3 machines (2 x86_64 and a x86_32) that I tried it on. I am > trying a fourth machine to be sure. Update version attached - it was just a loop exit case that didn't work, and that case is only triggered on xbf_low allocations (i.e. ENOSPC). It doesn't cause any problems here on 3.6-rc7 (combined with your patch 3), and the two patches also fix the same hangs on my RHEL test kernels that only have one worker thread per CPU. Cheers, Dave. -- Dave Chinner david@fromorbit.com xfs: don't block xfs_alloc_wq on AGF locks From: Dave Chinner When the workqueue runs out of worker threads because all the allocations are blockd on the AGF lock, the AGF lock holder cannot run to complete the allocation transaction that will unlock the AGF. As a result, allocations stop making progress. Raising the workqueue concurrency limit does not solve the problem, just raises the number of allocations that need to block before we hit the starvation issue. To avoid workqueue starvation, instead of blocking on the AGF lock only try to lock the AGF when caled from worker thread context. If we fail to get the lock on all the AGs we are allowed to try, return an EAGAIN error and have the worker requeue the allocation work for a short time in the future when progress has been made. Because we no longer block worker threads, we avoid the issue of starving allocations requests of service and hence will always make progress. Because the trylock semantics are now slightly different, add a "try-harder" flag to ensure that we avoid conflating the new "trylock" with the existing "avoid allocating data in a metadata prefered AG" semantics. The "try-harder" flag is now used to indicate data allocation in metadata-preferred AGs is allowed. Signed-off-by: Dave Chinner --- fs/xfs/xfs_alloc.c | 68 ++++++++++++++++++++++++++++++++++++---------------- fs/xfs/xfs_alloc.h | 3 ++- 2 files changed, 50 insertions(+), 21 deletions(-) diff --git a/fs/xfs/xfs_alloc.c b/fs/xfs/xfs_alloc.c index 0287f3b..57fad5f 100644 --- a/fs/xfs/xfs_alloc.c +++ b/fs/xfs/xfs_alloc.c @@ -1764,9 +1764,9 @@ xfs_alloc_fix_freelist( xfs_trans_t *tp; /* transaction pointer */ mp = args->mp; - pag = args->pag; tp = args->tp; + if (!pag->pagf_init) { if ((error = xfs_alloc_read_agf(mp, tp, args->agno, flags, &agbp))) @@ -1775,7 +1775,7 @@ xfs_alloc_fix_freelist( ASSERT(flags & XFS_ALLOC_FLAG_TRYLOCK); ASSERT(!(flags & XFS_ALLOC_FLAG_FREEING)); args->agbp = NULL; - return 0; + return EAGAIN; } } else agbp = NULL; @@ -1786,7 +1786,7 @@ xfs_alloc_fix_freelist( * try harder at this point */ if (pag->pagf_metadata && args->userdata && - (flags & XFS_ALLOC_FLAG_TRYLOCK)) { + (flags & XFS_ALLOC_FLAG_TRYHARD)) { ASSERT(!(flags & XFS_ALLOC_FLAG_FREEING)); args->agbp = NULL; return 0; @@ -1822,7 +1822,7 @@ xfs_alloc_fix_freelist( ASSERT(flags & XFS_ALLOC_FLAG_TRYLOCK); ASSERT(!(flags & XFS_ALLOC_FLAG_FREEING)); args->agbp = NULL; - return 0; + return EAGAIN; } } /* @@ -2209,7 +2209,8 @@ xfs_alloc_read_agf( */ int /* error */ __xfs_alloc_vextent( - xfs_alloc_arg_t *args) /* allocation argument structure */ + xfs_alloc_arg_t *args, + bool trylock) { xfs_agblock_t agsize; /* allocation group size */ int error; @@ -2250,6 +2251,7 @@ __xfs_alloc_vextent( } minleft = args->minleft; + flags = trylock ? XFS_ALLOC_FLAG_TRYLOCK : 0; switch (type) { case XFS_ALLOCTYPE_THIS_AG: case XFS_ALLOCTYPE_NEAR_BNO: @@ -2260,7 +2262,7 @@ __xfs_alloc_vextent( args->agno = XFS_FSB_TO_AGNO(mp, args->fsbno); args->pag = xfs_perag_get(mp, args->agno); args->minleft = 0; - error = xfs_alloc_fix_freelist(args, 0); + error = xfs_alloc_fix_freelist(args, flags); args->minleft = minleft; if (error) { trace_xfs_alloc_vextent_nofix(args); @@ -2310,7 +2312,8 @@ __xfs_alloc_vextent( args->agno = XFS_FSB_TO_AGNO(mp, args->fsbno); args->type = XFS_ALLOCTYPE_THIS_AG; sagno = 0; - flags = 0; + trylock = 0; + flags |= XFS_ALLOC_FLAG_TRYHARD; } else { if (type == XFS_ALLOCTYPE_START_AG) args->type = XFS_ALLOCTYPE_THIS_AG; @@ -2329,7 +2332,7 @@ __xfs_alloc_vextent( if (no_min) args->minleft = 0; error = xfs_alloc_fix_freelist(args, flags); args->minleft = minleft; - if (error) { + if (error && error != EAGAIN) { trace_xfs_alloc_vextent_nofix(args); goto error0; } @@ -2373,10 +2376,18 @@ __xfs_alloc_vextent( trace_xfs_alloc_vextent_allfailed(args); break; } - if (flags == 0) { + if (flags == XFS_ALLOC_FLAG_TRYHARD) { no_min = 1; + } else if (trylock && + flags == XFS_ALLOC_FLAG_TRYLOCK) { + flags |= XFS_ALLOC_FLAG_TRYHARD; + } else if (trylock && + (flags & XFS_ALLOC_FLAG_TRYHARD)) { + error = EAGAIN; + trace_xfs_alloc_vextent_noagbp(args); + goto error0; } else { - flags = 0; + flags = XFS_ALLOC_FLAG_TRYHARD; if (type == XFS_ALLOCTYPE_START_BNO) { args->agbno = XFS_FSB_TO_AGBNO(mp, args->fsbno); @@ -2418,28 +2429,45 @@ error0: return error; } +/* + * The worker is not allowed to block indefinitely on AGF locks. This prevents + * worker thread starvation from preventing allocation progress from being made. + * This occurs when the transaction holding the AGF cannot be scheduled to run + * in a worker because all worker threads are blocked on the AGF lock and no + * more can be allocated. + */ static void xfs_alloc_vextent_worker( struct work_struct *work) { - struct xfs_alloc_arg *args = container_of(work, + struct delayed_work *dwork = container_of(work, + struct delayed_work, work); + struct xfs_alloc_arg *args = container_of(dwork, struct xfs_alloc_arg, work); unsigned long pflags; + int result; /* we are in a transaction context here */ current_set_flags_nested(&pflags, PF_FSTRANS); - args->result = __xfs_alloc_vextent(args); - complete(args->done); + result = __xfs_alloc_vextent(args, true); + if (result == EAGAIN) { + /* requeue for a later retry */ + queue_delayed_work(xfs_alloc_wq, &args->work, + msecs_to_jiffies(10)); + } else { + args->result = result; + complete(args->done); + } current_restore_flags_nested(&pflags, PF_FSTRANS); } /* * Data allocation requests often come in with little stack to work on. Push - * them off to a worker thread so there is lots of stack to use. Metadata - * requests, OTOH, are generally from low stack usage paths, so avoid the - * context switch overhead here. + * them off to a worker thread so there is lots of stack to use if we are not + * already in a worker thread context. Metadata requests, OTOH, are generally + * from low stack usage paths, so avoid the context switch overhead here. */ int xfs_alloc_vextent( @@ -2447,13 +2475,13 @@ xfs_alloc_vextent( { DECLARE_COMPLETION_ONSTACK(done); - if (!args->userdata) - return __xfs_alloc_vextent(args); + if (!args->userdata || (current->flags & PF_WQ_WORKER)) + return __xfs_alloc_vextent(args, false); args->done = &done; - INIT_WORK_ONSTACK(&args->work, xfs_alloc_vextent_worker); - queue_work(xfs_alloc_wq, &args->work); + INIT_DELAYED_WORK_ONSTACK(&args->work, xfs_alloc_vextent_worker); + queue_delayed_work(xfs_alloc_wq, &args->work, 0); wait_for_completion(&done); return args->result; } diff --git a/fs/xfs/xfs_alloc.h b/fs/xfs/xfs_alloc.h index 93be4a6..047a239 100644 --- a/fs/xfs/xfs_alloc.h +++ b/fs/xfs/xfs_alloc.h @@ -54,6 +54,7 @@ typedef unsigned int xfs_alloctype_t; */ #define XFS_ALLOC_FLAG_TRYLOCK 0x00000001 /* use trylock for buffer locking */ #define XFS_ALLOC_FLAG_FREEING 0x00000002 /* indicate caller is freeing extents*/ +#define XFS_ALLOC_FLAG_TRYHARD 0x00000004 /* also use metadata AGs for data */ /* * In order to avoid ENOSPC-related deadlock caused by @@ -121,7 +122,7 @@ typedef struct xfs_alloc_arg { char userdata; /* set if this is user data */ xfs_fsblock_t firstblock; /* io first block allocated */ struct completion *done; - struct work_struct work; + struct delayed_work work; int result; } xfs_alloc_arg_t; From sandeen@redhat.com Thu Sep 27 22:32:27 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8S3WR2P170491 for ; Thu, 27 Sep 2012 22:32:27 -0500 X-ASG-Debug-ID: 1348803226-04bdf0289a5ed70001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id oonPDAMZuRrxtZQi for ; Thu, 27 Sep 2012 20:33:47 -0700 (PDT) X-Barracuda-Envelope-From: sandeen@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8S3XkW6024234 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 27 Sep 2012 23:33:46 -0400 Received: from liberator.sandeen.net (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id q8S3XjDF011359 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Thu, 27 Sep 2012 23:33:46 -0400 Message-ID: <50651A99.1070307@redhat.com> Date: Thu, 27 Sep 2012 22:33:45 -0500 From: Eric Sandeen User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20120907 Thunderbird/15.0.1 MIME-Version: 1.0 To: xfs-oss Subject: [PATCH] xfstests 068: Add mmap load X-Enigmail-Version: 1.4.4 X-ASG-Orig-Subj: [PATCH] xfstests 068: Add mmap load Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1348803226 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com Test 068 is the go-to test for freeze deadlock coverage; unfortunately it only uses fsstress, which doesn't do any mmap IO. Using the existing fstest binary gets us a cheap mmap exerciser as well. Signed-off-by: Eric Sandeen --- I think it's fair to modify this test vs. making a new one - it's never passed yet, and will only start passing in kernel 3.6, so it shouldn't cause new test regressions to add mmap ops. And I can verify that this finds mmap bugs; I had a backport which messed up ext4's freeze vs. mmap handling, and this exposes it. :) diff --git a/068 b/068 index 617420c..a0bf425 100755 --- a/068 +++ b/068 @@ -90,6 +90,21 @@ touch $tmp.running rmdir $STRESS_DIR } & +# start fstest -m loop in a background block; this gets us mmap coverage +{ + FSTEST_DIR="$SCRATCH_MNT/fstest_test_dir" + mkdir "$FSTEST_DIR" + + procs=2 + while [ -f "$tmp.running" ] + do + src/fstest -m -p $FSTEST_DIR -n $procs -f 4 > /dev/null 2>&1 + done + + rm -rf $FSTEST_DIR/* + rmdir $FSTEST_DIR +} & + i=0 let ITERATIONS=$ITERATIONS-1 From david@fromorbit.com Thu Sep 27 23:34:46 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8S4YkVP174269 for ; Thu, 27 Sep 2012 23:34:46 -0500 X-ASG-Debug-ID: 1348806964-04cbb069c45df30001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id XxnqLwKmCNRRqw1L for ; Thu, 27 Sep 2012 21:36:05 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqMMAGQoZVB5LPfb/2dsb2JhbABEvHUBAoESgQmCIAEBBTocIxAIAxguFCUDIROIBLg0FIsEb02EC2ADlWiQLIJ5 Received: from ppp121-44-247-219.lns20.syd7.internode.on.net (HELO dastard) ([121.44.247.219]) by ipmail04.adl6.internode.on.net with ESMTP; 28 Sep 2012 14:06:03 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1THSJ0-0007IP-7C; Fri, 28 Sep 2012 14:36:02 +1000 Date: Fri, 28 Sep 2012 14:36:02 +1000 From: Dave Chinner To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH] xfstests 068: Add mmap load Message-ID: <20120928043602.GD25626@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfstests 068: Add mmap load References: <50651A99.1070307@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50651A99.1070307@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1348806964 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109794 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Sep 27, 2012 at 10:33:45PM -0500, Eric Sandeen wrote: > Test 068 is the go-to test for freeze deadlock coverage; > unfortunately it only uses fsstress, which doesn't do any mmap > IO. > > Using the existing fstest binary gets us a cheap mmap exerciser > as well. > > Signed-off-by: Eric Sandeen > --- > > I think it's fair to modify this test vs. making a new one - > it's never passed yet, and will only start passing in kernel 3.6, > so it shouldn't cause new test regressions to add mmap ops. > > And I can verify that this finds mmap bugs; I had a backport > which messed up ext4's freeze vs. mmap handling, and this exposes > it. :) > > > diff --git a/068 b/068 > index 617420c..a0bf425 100755 > --- a/068 > +++ b/068 > @@ -90,6 +90,21 @@ touch $tmp.running > rmdir $STRESS_DIR > } & > > +# start fstest -m loop in a background block; this gets us mmap coverage > +{ > + FSTEST_DIR="$SCRATCH_MNT/fstest_test_dir" > + mkdir "$FSTEST_DIR" > + > + procs=2 > + while [ -f "$tmp.running" ] > + do > + src/fstest -m -p $FSTEST_DIR -n $procs -f 4 > /dev/null 2>&1 > + done > + > + rm -rf $FSTEST_DIR/* > + rmdir $FSTEST_DIR > +} & Looks good. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From dave@fromorbit.com Thu Sep 27 23:36:08 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8S4a822174405 for ; Thu, 27 Sep 2012 23:36:08 -0500 X-ASG-Debug-ID: 1348807047-04cb6c79415bf50001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id BQnAFpKVsfmrGTfI for ; Thu, 27 Sep 2012 21:37:27 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AowIAGQoZVB5LPfb/2dsb2JhbABEi1+yK4EJgiABLS87GGoDNIgElnKhQpE/A58lhm+CeQ Received: from ppp121-44-247-219.lns20.syd7.internode.on.net (HELO dastard) ([121.44.247.219]) by ipmail04.adl6.internode.on.net with ESMTP; 28 Sep 2012 14:07:26 +0930 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1THSKH-0007JE-2e for xfs@oss.sgi.com; Fri, 28 Sep 2012 14:37:21 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1THSKB-0005EZ-JG for xfs@oss.sgi.com; Fri, 28 Sep 2012 14:37:15 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH] xfs: only update the last_sync_lsn when a transaction completes Date: Fri, 28 Sep 2012 14:37:15 +1000 X-ASG-Orig-Subj: [PATCH] xfs: only update the last_sync_lsn when a transaction completes Message-Id: <1348807035-20087-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10 X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1348807047 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109794 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner The log write code stamps each iclog with the current tail LSN in the iclog header so that recovery knows where to find the tail of thelog once it has found the head. Normally this is taken from the first item on the AIL - the log item that corresponds to the oldest active item in the log. The problem is that when the AIL is empty, the tail lsn is dervied from the the l_last_sync_lsn, which is the LSN of the last iclog to be written to the log. In most cases this doesn't happen, because the AIL is rarely empty on an active filesystem. However, when it does, it opens up an interesting case when the transaction being committed to the iclog spans multiple iclogs. That is, the first iclog is stamped with the l_last_sync_lsn, and IO is issued. Then the next iclog is setup, the changes copied into the iclog (takes some time), and then the l_last_sync_lsn is stamped into the header and IO is issued. This is still the same transaction, so the tail lsn of both iclogs must be the same for log recovery to find the entire transaction to be able to replay it. The problem arises in that the iclog buffer IO completion updates the l_last_sync_lsn with it's own LSN. Therefore, If the first iclog completes it's IO before the second iclog is filled and has the tail lsn stamped in it, it will stamp the LSN of the first iclog into it's tail lsn field. If the system fails at this point, log recovery will not see a complete transaction, so the transaction will no be replayed. The fix is simple - the l_last_sync_lsn is updated when a iclog buffer IO completes, and this is incorrect. The l_last_sync_lsn shoul dbe updated when a transaction is completed by a iclog buffer IO. That is, only iclog buffers that have transaction commit callbacks attached to them should update the l_last_sync_lsn. This means that the last_sync_lsn will only move forward when a commit record it written, not in the middle of a large transaction that is rolling through multiple iclog buffers. Signed-off-by: Dave Chinner --- fs/xfs/xfs_log.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 67d63f6..2ec2e0b 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -2459,14 +2459,27 @@ xlog_state_do_callback( /* - * update the last_sync_lsn before we drop the + * Completion of a iclog IO does not imply that + * a transaction has completed, as transactions + * can be large enough to span many iclogs. We + * cannot change the tail of the log half way + * through a transaction as this may be the only + * transaction in the log and moving th etail to + * point to the middle of it will prevent + * recovery from finding the start of the + * transaction. Hence we should only update the + * last_sync_lsn if this iclog contains + * transaction completion callbacks on it. + * + * We have to do this before we drop the * icloglock to ensure we are the only one that * can update it. */ ASSERT(XFS_LSN_CMP(atomic64_read(&log->l_last_sync_lsn), be64_to_cpu(iclog->ic_header.h_lsn)) <= 0); - atomic64_set(&log->l_last_sync_lsn, - be64_to_cpu(iclog->ic_header.h_lsn)); + if (iclog->ic_callback) + atomic64_set(&log->l_last_sync_lsn, + be64_to_cpu(iclog->ic_header.h_lsn)); } else ioerrors++; -- 1.7.10 From dave@fromorbit.com Thu Sep 27 23:44:01 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_72 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8S4i1If174837 for ; Thu, 27 Sep 2012 23:44:01 -0500 X-ASG-Debug-ID: 1348807519-04cbb069c25e620001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 5EdSnJYGZCC7dq0D for ; Thu, 27 Sep 2012 21:45:20 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AowIAOsqZVB5LPfb/2dsb2JhbAA8CItfsiuBCYIgAQEFJy8zCBgxOQMbGYgEuDuLLoYRA58lhm+CeYFIBA Received: from ppp121-44-247-219.lns20.syd7.internode.on.net (HELO dastard) ([121.44.247.219]) by ipmail04.adl6.internode.on.net with ESMTP; 28 Sep 2012 14:14:49 +0930 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1THSRV-0007LV-FL for xfs@oss.sgi.com; Fri, 28 Sep 2012 14:44:49 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1THSRV-0005GF-1B for xfs@oss.sgi.com; Fri, 28 Sep 2012 14:44:49 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 02/13] xfs: rationalise xfs_mount_wq users Date: Fri, 28 Sep 2012 14:44:34 +1000 X-ASG-Orig-Subj: [PATCH 02/13] xfs: rationalise xfs_mount_wq users Message-Id: <1348807485-20165-3-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10 In-Reply-To: <1348807485-20165-1-git-send-email-david@fromorbit.com> References: <1348807485-20165-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1348807519 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109794 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Instead of starting and stopping background work on the xfs_mount_wq all at the same time, separate them to where they really are needed to start and stop. The xfs_sync_worker, only needs to be started after all the mount processing has completed successfully, while it needs to be stopped before the log is unmounted. The xfs_reclaim_worker is started on demand, and can be stopped before the unmount process does it's own inode reclaim pass. The xfs_flush_inodes work is run on demand, and so we really only need to ensure that it has stopped running before we start processing an unmount, freeze or remount,ro. Signed-off-by: Dave Chinner Reviewed-by: Mark Tinguely --- fs/xfs/xfs_mount.c | 6 ++++-- fs/xfs/xfs_super.c | 34 ++++++++++++++-------------------- fs/xfs/xfs_sync.c | 21 +++++---------------- 3 files changed, 23 insertions(+), 38 deletions(-) diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 29c2f83..3152924 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -1483,9 +1483,11 @@ xfs_unmountfs( /* * And reclaim all inodes. At this point there should be no dirty - * inode, and none should be pinned or locked, but use synchronous - * reclaim just to be sure. + * inodes and none should be pinned or locked, but use synchronous + * reclaim just to be sure. We can stop background inode reclaim + * here as well if it is still running. */ + cancel_delayed_work_sync(&mp->m_reclaim_work); xfs_reclaim_inodes(mp, SYNC_WAIT); xfs_qm_unmount(mp); diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 59d76bd..935b2c7 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -918,14 +918,12 @@ xfs_fs_put_super( { struct xfs_mount *mp = XFS_M(sb); - xfs_filestream_unmount(mp); - cancel_delayed_work_sync(&mp->m_sync_work); - xfs_unmountfs(mp); - cancel_delayed_work_sync(&mp->m_sync_work); - cancel_delayed_work_sync(&mp->m_reclaim_work); cancel_work_sync(&mp->m_flush_work); + xfs_filestream_unmount(mp); + xfs_unmountfs(mp); + xfs_freesb(mp); xfs_icsb_destroy_counters(mp); xfs_destroy_mount_workqueues(mp); @@ -1232,6 +1230,9 @@ xfs_fs_fill_super( spin_lock_init(&mp->m_sb_lock); mutex_init(&mp->m_growlock); atomic_set(&mp->m_active_trans, 0); + INIT_WORK(&mp->m_flush_work, xfs_flush_worker); + INIT_DELAYED_WORK(&mp->m_sync_work, xfs_sync_worker); + INIT_DELAYED_WORK(&mp->m_reclaim_work, xfs_reclaim_worker); mp->m_super = sb; sb->s_fs_info = mp; @@ -1295,15 +1296,9 @@ xfs_fs_fill_super( sb->s_time_gran = 1; set_posix_acl_flag(sb); - INIT_WORK(&mp->m_flush_work, xfs_flush_worker); - INIT_DELAYED_WORK(&mp->m_sync_work, xfs_sync_worker); - INIT_DELAYED_WORK(&mp->m_reclaim_work, xfs_reclaim_worker); - - xfs_syncd_queue_sync(mp); - error = xfs_mountfs(mp); if (error) - goto out_syncd_stop; + goto out_filestream_unmount; root = igrab(VFS_I(mp->m_rootip)); if (!root) { @@ -1320,12 +1315,15 @@ xfs_fs_fill_super( goto out_unmount; } + /* + * The filesystem is successfully mounted, so we can start background + * sync work now. + */ + xfs_syncd_queue_sync(mp); + return 0; - out_syncd_stop: - cancel_delayed_work_sync(&mp->m_sync_work); - cancel_delayed_work_sync(&mp->m_reclaim_work); - cancel_work_sync(&mp->m_flush_work); + out_filestream_unmount: xfs_filestream_unmount(mp); out_free_sb: xfs_freesb(mp); @@ -1344,10 +1342,6 @@ out_destroy_workqueues: out_unmount: xfs_filestream_unmount(mp); xfs_unmountfs(mp); - - cancel_delayed_work_sync(&mp->m_sync_work); - cancel_delayed_work_sync(&mp->m_reclaim_work); - cancel_work_sync(&mp->m_flush_work); goto out_free_sb; } diff --git a/fs/xfs/xfs_sync.c b/fs/xfs/xfs_sync.c index 13830e4..509190f 100644 --- a/fs/xfs/xfs_sync.c +++ b/fs/xfs/xfs_sync.c @@ -379,9 +379,9 @@ xfs_syncd_queue_sync( } /* - * Every sync period we need to unpin all items, reclaim inodes and sync - * disk quotas. We might need to cover the log to indicate that the - * filesystem is idle and not frozen. + * Every sync period we need to unpin all items in the AIL and push them to + * disk. If there is nothing dirty, then we might need to cover the log to + * indicate that the filesystem is idle and not frozen. */ void xfs_sync_worker( @@ -391,17 +391,7 @@ xfs_sync_worker( struct xfs_mount, m_sync_work); int error; - /* - * We shouldn't write/force the log if we are in the mount/unmount - * process or on a read only filesystem. The workqueue still needs to be - * active in both cases, however, because it is used for inode reclaim - * during these times. Use the MS_ACTIVE flag to avoid doing anything - * during mount. Doing work during unmount is avoided by calling - * cancel_delayed_work_sync on this work queue before tearing down - * the ail and the log in xfs_log_unmount. - */ - if (!(mp->m_super->s_flags & MS_ACTIVE) && - !(mp->m_flags & XFS_MOUNT_RDONLY)) { + if (!(mp->m_flags & XFS_MOUNT_RDONLY)) { /* dgc: errors ignored here */ if (mp->m_super->s_writers.frozen == SB_UNFROZEN && xfs_log_need_covered(mp)) @@ -409,8 +399,7 @@ xfs_sync_worker( else xfs_log_force(mp, 0); - /* start pushing all the metadata that is currently - * dirty */ + /* start pushing all the metadata that is currently dirty */ xfs_ail_push_all(mp->m_ail); } -- 1.7.10 From dave@fromorbit.com Thu Sep 27 23:44:02 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8S4i2T2174844 for ; Thu, 27 Sep 2012 23:44:02 -0500 X-ASG-Debug-ID: 1348807519-04cbb069c25e620002-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id wZlbdV7KHXMlpFKx for ; Thu, 27 Sep 2012 21:45:21 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AosIAOsqZVB5LPfb/2dsb2JhbABEi1+yK4EJgk4vO4ECA4g4DJZtoUKOH4MgA6YUgnk Received: from ppp121-44-247-219.lns20.syd7.internode.on.net (HELO dastard) ([121.44.247.219]) by ipmail04.adl6.internode.on.net with ESMTP; 28 Sep 2012 14:14:59 +0930 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1THSRV-0007LU-Dh for xfs@oss.sgi.com; Fri, 28 Sep 2012 14:44:49 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1THSRU-0005G8-Ub for xfs@oss.sgi.com; Fri, 28 Sep 2012 14:44:48 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH V3 00/13] xfs: remove the xfssyncd mess Date: Fri, 28 Sep 2012 14:44:32 +1000 X-ASG-Orig-Subj: [PATCH V3 00/13] xfs: remove the xfssyncd mess Message-Id: <1348807485-20165-1-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10 X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1348807521 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109794 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- Version 3 of the patchset I described here: http://oss.sgi.com/archives/xfs/2012-06/msg00064.html This patchset reliably exposed the log->l_last_sync_lsn problem I just posted a fix for. Version 3: - per-mount log and reclaim workqueues instead of a generic mount workqueue. - reordering of some of the patches as Christoph requested. - fixed the writeback_inodes_sb_if_idle deadlock by moving it all the way back up the write stack to xfs_file_aio_buffered_write where we were just flushing the current file to avoid deadlocking on it anyway. - reintroduced xfs_flush_inodes() as a wrapper for writeback_inodes_sb_if_idle(). - rebased on a current TOT. Version 2: - fix writeback_inodes_sb_if_idle call in xfs_create() - refreshed patch 13 before sending. From dave@fromorbit.com Thu Sep 27 23:44:04 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_72, LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8S4i4ws174869 for ; Thu, 27 Sep 2012 23:44:04 -0500 X-ASG-Debug-ID: 1348807519-04cbb069c25e620003-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id Le2PVH5ZcPm3s0LL for ; Thu, 27 Sep 2012 21:45:22 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AowIAOsqZVB5LPfb/2dsb2JhbABEi1+yK4EJgiABAQUnLx4VCBgxOQMbGYgEuDuRPwObS4pJgnmBSAQ Received: from ppp121-44-247-219.lns20.syd7.internode.on.net (HELO dastard) ([121.44.247.219]) by ipmail04.adl6.internode.on.net with ESMTP; 28 Sep 2012 14:15:00 +0930 Received: from [192.168.1.1] (helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1THSRf-0007LW-FU for xfs@oss.sgi.com; Fri, 28 Sep 2012 14:44:59 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1THSRV-0005GK-27 for xfs@oss.sgi.com; Fri, 28 Sep 2012 14:44:49 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 03/13] xfs: don't run the sync work if the filesystem is read-only Date: Fri, 28 Sep 2012 14:44:35 +1000 X-ASG-Orig-Subj: [PATCH 03/13] xfs: don't run the sync work if the filesystem is read-only Message-Id: <1348807485-20165-4-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10 In-Reply-To: <1348807485-20165-1-git-send-email-david@fromorbit.com> References: <1348807485-20165-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1348807522 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109794 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner If the filesystem is mounted or remounted read-only, stop the sync worker that tries to flush or cover the log if the filesystem is dirty. It's read-only, so it isn't dirty. Restart it on a remount,rw as necessary. This avoids the need for RO checks in the work. Similarly, stop the sync work when the filesystem is frozen, and start it again when the filesysetm is thawed. This avoids the need for special freeze checks in the work. Signed-off-by: Dave Chinner Reviewed-by: Mark Tinguely --- fs/xfs/xfs_super.c | 2 ++ fs/xfs/xfs_sync.c | 29 ++++++++++++++++------------- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 935b2c7..f6147ae 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -1107,6 +1107,7 @@ xfs_fs_remount( * value if it is non-zero, otherwise go with the default. */ xfs_restore_resvblks(mp); + xfs_syncd_queue_sync(mp); } /* rw -> ro */ @@ -1152,6 +1153,7 @@ xfs_fs_unfreeze( struct xfs_mount *mp = XFS_M(sb); xfs_restore_resvblks(mp); + xfs_syncd_queue_sync(mp); return 0; } diff --git a/fs/xfs/xfs_sync.c b/fs/xfs/xfs_sync.c index 509190f..5d69f23 100644 --- a/fs/xfs/xfs_sync.c +++ b/fs/xfs/xfs_sync.c @@ -323,6 +323,9 @@ xfs_quiesce_data( * Second stage of a quiesce. The data is already synced, now we have to take * care of the metadata. New transactions are already blocked, so we need to * wait for any remaining transactions to drain out before proceeding. + * + * Note: this stops background sync work - the callers must ensure it is started + * again when appropriate. */ void xfs_quiesce_attr( @@ -341,6 +344,9 @@ xfs_quiesce_attr( /* flush all pending changes from the AIL */ xfs_ail_push_all_sync(mp->m_ail); + /* stop background sync work */ + cancel_delayed_work_sync(&mp->m_sync_work); + /* * Just warn here till VFS can correctly support * read-only remount without racing. @@ -379,9 +385,8 @@ xfs_syncd_queue_sync( } /* - * Every sync period we need to unpin all items in the AIL and push them to - * disk. If there is nothing dirty, then we might need to cover the log to - * indicate that the filesystem is idle and not frozen. + * Every sync period we need to push dirty metadata and try to cover the log + * to indicate the filesystem is idle and not frozen. */ void xfs_sync_worker( @@ -391,17 +396,15 @@ xfs_sync_worker( struct xfs_mount, m_sync_work); int error; - if (!(mp->m_flags & XFS_MOUNT_RDONLY)) { - /* dgc: errors ignored here */ - if (mp->m_super->s_writers.frozen == SB_UNFROZEN && - xfs_log_need_covered(mp)) - error = xfs_fs_log_dummy(mp); - else - xfs_log_force(mp, 0); + /* dgc: errors ignored here */ + if (mp->m_super->s_writers.frozen == SB_UNFROZEN && + xfs_log_need_covered(mp)) + error = xfs_fs_log_dummy(mp); + else + xfs_log_force(mp, 0); - /* start pushing all the metadata that is currently dirty */ - xfs_ail_push_all(mp->m_ail); - } + /* start pushing all the metadata that is currently dirty */ + xfs_ail_push_all(mp->m_ail); /* queue us up again */ xfs_syncd_queue_sync(mp); -- 1.7.10 From dave@fromorbit.com Thu Sep 27 23:44:04 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8S4i44G174881 for ; Thu, 27 Sep 2012 23:44:04 -0500 X-ASG-Debug-ID: 1348807521-04cb6c79425c3e0002-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id HpXCmJdd2nIU8ByG for ; Thu, 27 Sep 2012 21:45:23 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AowIAOsqZVB5LPfb/2dsb2JhbABEi1+yK4EJgiABAQUnLw8kCBgxOQMbGYgEuDuRPwObS4pJgnmBSAQ Received: from ppp121-44-247-219.lns20.syd7.internode.on.net (HELO dastard) ([121.44.247.219]) by ipmail04.adl6.internode.on.net with ESMTP; 28 Sep 2012 14:15:00 +0930 Received: from [192.168.1.1] (helo=disappointment) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1THSRf-0007LY-GP for xfs@oss.sgi.com; Fri, 28 Sep 2012 14:44:59 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1THSRV-0005GP-3K for xfs@oss.sgi.com; Fri, 28 Sep 2012 14:44:49 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 04/13] xfs: sync work is now only periodic log work Date: Fri, 28 Sep 2012 14:44:36 +1000 X-ASG-Orig-Subj: [PATCH 04/13] xfs: sync work is now only periodic log work Message-Id: <1348807485-20165-5-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10 In-Reply-To: <1348807485-20165-1-git-send-email-david@fromorbit.com> References: <1348807485-20165-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1348807522 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109794 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner The only thing the periodic sync work does now is flush the AIL and idle the log. These are really functions of the log code, so move the work to xfs_log.c and rename it appropriately. The only wart that this leaves behind is the xfssyncd_centisecs sysctl, otherwise the xfssyncd is dead. Clean up any comments that related to xfssyncd to reflect it's passing. Signed-off-by: Dave Chinner Reviewed-by: Mark Tinguely --- fs/xfs/xfs_log.c | 41 ++++++++++++++++++++++++++++++++++++++++- fs/xfs/xfs_log.h | 3 +++ fs/xfs/xfs_log_priv.h | 1 + fs/xfs/xfs_mount.h | 1 - fs/xfs/xfs_super.c | 16 ++++------------ fs/xfs/xfs_sync.c | 39 +++------------------------------------ fs/xfs/xfs_sync.h | 2 -- 7 files changed, 51 insertions(+), 52 deletions(-) diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 7f4f937..a1fe7a7 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -34,6 +34,7 @@ #include "xfs_dinode.h" #include "xfs_inode.h" #include "xfs_trace.h" +#include "xfs_fsops.h" kmem_zone_t *xfs_log_ticket_zone; @@ -698,6 +699,8 @@ xfs_log_mount_finish(xfs_mount_t *mp) ASSERT(mp->m_flags & XFS_MOUNT_RDONLY); } + xfs_log_work_queue(mp); + return error; } @@ -858,7 +861,7 @@ xfs_log_unmount_write(xfs_mount_t *mp) void xfs_log_unmount(xfs_mount_t *mp) { - cancel_delayed_work_sync(&mp->m_sync_work); + cancel_delayed_work_sync(&mp->m_log->l_work); xfs_trans_ail_destroy(mp); xlog_dealloc_log(mp->m_log); } @@ -1161,6 +1164,40 @@ done: } /* xlog_get_iclog_buffer_size */ +void +xfs_log_work_queue( + struct xfs_mount *mp) +{ + queue_delayed_work(xfs_syncd_wq, &mp->m_log->l_work, + msecs_to_jiffies(xfs_syncd_centisecs * 10)); +} + +/* + * Every sync period we need to unpin all items in the AIL and push them to + * disk. If there is nothing dirty, then we might need to cover the log to + * indicate that the filesystem is idle. + */ +void +xfs_log_worker( + struct work_struct *work) +{ + struct xlog *log = container_of(to_delayed_work(work), + struct xlog, l_work); + struct xfs_mount *mp = log->l_mp; + + /* dgc: errors ignored - not fatal and nowhere to report them */ + if (xfs_log_need_covered(mp)) + xfs_fs_log_dummy(mp); + else + xfs_log_force(mp, 0); + + /* start pushing all the metadata that is currently dirty */ + xfs_ail_push_all(mp->m_ail); + + /* queue us up again */ + xfs_log_work_queue(mp); +} + /* * This routine initializes some of the log structure for a given mount point. * Its primary purpose is to fill in enough, so recovery can occur. However, @@ -1195,6 +1232,7 @@ xlog_alloc_log( log->l_logBBsize = num_bblks; log->l_covered_state = XLOG_STATE_COVER_IDLE; log->l_flags |= XLOG_ACTIVE_RECOVERY; + INIT_DELAYED_WORK(&log->l_work, xfs_log_worker); log->l_prev_block = -1; /* log->l_tail_lsn = 0x100000000LL; cycle = 1; current block = 0 */ @@ -3700,3 +3738,4 @@ xlog_iclogs_empty( } while (iclog != log->l_iclog); return 1; } + diff --git a/fs/xfs/xfs_log.h b/fs/xfs/xfs_log.h index 748d312..26ed7de 100644 --- a/fs/xfs/xfs_log.h +++ b/fs/xfs/xfs_log.h @@ -181,5 +181,8 @@ int xfs_log_commit_cil(struct xfs_mount *mp, struct xfs_trans *tp, xfs_lsn_t *commit_lsn, int flags); bool xfs_log_item_in_current_chkpt(struct xfs_log_item *lip); +void xfs_log_work_queue(struct xfs_mount *mp); +void xfs_log_worker(struct work_struct *work); + #endif #endif /* __XFS_LOG_H__ */ diff --git a/fs/xfs/xfs_log_priv.h b/fs/xfs/xfs_log_priv.h index 18a801d..9a4e0e5 100644 --- a/fs/xfs/xfs_log_priv.h +++ b/fs/xfs/xfs_log_priv.h @@ -495,6 +495,7 @@ struct xlog { struct xfs_buf *l_xbuf; /* extra buffer for log * wrapping */ struct xfs_buftarg *l_targ; /* buftarg of log */ + struct delayed_work l_work; /* background flush work */ uint l_flags; uint l_quotaoffs_flag; /* XFS_DQ_*, for QUOTAOFFs */ struct list_head *l_buf_cancel_table; diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index deee09e..26e46ae 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -197,7 +197,6 @@ typedef struct xfs_mount { struct mutex m_icsb_mutex; /* balancer sync lock */ #endif struct xfs_mru_cache *m_filestream; /* per-mount filestream data */ - struct delayed_work m_sync_work; /* background sync work */ struct delayed_work m_reclaim_work; /* background inode reclaim */ struct work_struct m_flush_work; /* background inode flush */ __int64_t m_update_flags; /* sb flags we need to update diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index f6147ae..b85ca2d 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -918,7 +918,6 @@ xfs_fs_put_super( { struct xfs_mount *mp = XFS_M(sb); - cancel_delayed_work_sync(&mp->m_sync_work); cancel_work_sync(&mp->m_flush_work); xfs_filestream_unmount(mp); @@ -953,10 +952,10 @@ xfs_fs_sync_fs( if (laptop_mode) { /* * The disk must be active because we're syncing. - * We schedule xfssyncd now (now that the disk is + * We schedule log work now (now that the disk is * active) instead of later (when it might not be). */ - flush_delayed_work_sync(&mp->m_sync_work); + flush_delayed_work_sync(&mp->m_log->l_work); } return 0; @@ -1107,7 +1106,7 @@ xfs_fs_remount( * value if it is non-zero, otherwise go with the default. */ xfs_restore_resvblks(mp); - xfs_syncd_queue_sync(mp); + xfs_log_work_queue(mp); } /* rw -> ro */ @@ -1153,7 +1152,7 @@ xfs_fs_unfreeze( struct xfs_mount *mp = XFS_M(sb); xfs_restore_resvblks(mp); - xfs_syncd_queue_sync(mp); + xfs_log_work_queue(mp); return 0; } @@ -1233,7 +1232,6 @@ xfs_fs_fill_super( mutex_init(&mp->m_growlock); atomic_set(&mp->m_active_trans, 0); INIT_WORK(&mp->m_flush_work, xfs_flush_worker); - INIT_DELAYED_WORK(&mp->m_sync_work, xfs_sync_worker); INIT_DELAYED_WORK(&mp->m_reclaim_work, xfs_reclaim_worker); mp->m_super = sb; @@ -1317,12 +1315,6 @@ xfs_fs_fill_super( goto out_unmount; } - /* - * The filesystem is successfully mounted, so we can start background - * sync work now. - */ - xfs_syncd_queue_sync(mp); - return 0; out_filestream_unmount: diff --git a/fs/xfs/xfs_sync.c b/fs/xfs/xfs_sync.c index 5d69f23..7527610 100644 --- a/fs/xfs/xfs_sync.c +++ b/fs/xfs/xfs_sync.c @@ -19,6 +19,7 @@ #include "xfs_fs.h" #include "xfs_types.h" #include "xfs_log.h" +#include "xfs_log_priv.h" #include "xfs_inum.h" #include "xfs_trans.h" #include "xfs_trans_priv.h" @@ -344,8 +345,8 @@ xfs_quiesce_attr( /* flush all pending changes from the AIL */ xfs_ail_push_all_sync(mp->m_ail); - /* stop background sync work */ - cancel_delayed_work_sync(&mp->m_sync_work); + /* stop background log work */ + cancel_delayed_work_sync(&mp->m_log->l_work); /* * Just warn here till VFS can correctly support @@ -376,40 +377,6 @@ xfs_quiesce_attr( xfs_buf_unlock(mp->m_sb_bp); } -void -xfs_syncd_queue_sync( - struct xfs_mount *mp) -{ - queue_delayed_work(xfs_syncd_wq, &mp->m_sync_work, - msecs_to_jiffies(xfs_syncd_centisecs * 10)); -} - -/* - * Every sync period we need to push dirty metadata and try to cover the log - * to indicate the filesystem is idle and not frozen. - */ -void -xfs_sync_worker( - struct work_struct *work) -{ - struct xfs_mount *mp = container_of(to_delayed_work(work), - struct xfs_mount, m_sync_work); - int error; - - /* dgc: errors ignored here */ - if (mp->m_super->s_writers.frozen == SB_UNFROZEN && - xfs_log_need_covered(mp)) - error = xfs_fs_log_dummy(mp); - else - xfs_log_force(mp, 0); - - /* start pushing all the metadata that is currently dirty */ - xfs_ail_push_all(mp->m_ail); - - /* queue us up again */ - xfs_syncd_queue_sync(mp); -} - /* * Queue a new inode reclaim pass if there are reclaimable inodes and there * isn't a reclaim pass already in progress. By default it runs every 5s based diff --git a/fs/xfs/xfs_sync.h b/fs/xfs/xfs_sync.h index 3f59e5b..8d58fab 100644 --- a/fs/xfs/xfs_sync.h +++ b/fs/xfs/xfs_sync.h @@ -26,8 +26,6 @@ struct xfs_perag; extern struct workqueue_struct *xfs_syncd_wq; /* sync workqueue */ -void xfs_syncd_queue_sync(struct xfs_mount *mp); -void xfs_sync_worker(struct work_struct *work); void xfs_flush_worker(struct work_struct *work); void xfs_reclaim_worker(struct work_struct *work); -- 1.7.10 From dave@fromorbit.com Thu Sep 27 23:44:06 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_72 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8S4i6UP174902 for ; Thu, 27 Sep 2012 23:44:06 -0500 X-ASG-Debug-ID: 1348807523-04cb6c79445c3f0002-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id oFNRRX73ykJIxzzg for ; Thu, 27 Sep 2012 21:45:24 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AowIAOsqZVB5LPfb/2dsb2JhbABEi1+yK4EJgiABAQUnLzMIGDE5AxsZiAS4O5E/A58lhm+CeYFIBA Received: from ppp121-44-247-219.lns20.syd7.internode.on.net (HELO dastard) ([121.44.247.219]) by ipmail04.adl6.internode.on.net with ESMTP; 28 Sep 2012 14:15:00 +0930 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1THSRf-0007Ld-JU for xfs@oss.sgi.com; Fri, 28 Sep 2012 14:44:59 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1THSRV-0005GY-59 for xfs@oss.sgi.com; Fri, 28 Sep 2012 14:44:49 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 06/13] xfs: xfs_sync_data is redundant. Date: Fri, 28 Sep 2012 14:44:38 +1000 X-ASG-Orig-Subj: [PATCH 06/13] xfs: xfs_sync_data is redundant. Message-Id: <1348807485-20165-7-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10 In-Reply-To: <1348807485-20165-1-git-send-email-david@fromorbit.com> References: <1348807485-20165-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1348807524 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109794 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner We don't do any data writeback from XFS any more - the VFS is completely responsible for that, including for freeze. We can replace the remaining caller with the VFS level function that achieves the same thing, but without conflicting with current writeback work - writeback_inodes_sb_if_idle(). This means we can remove the flush_work and xfs_flush_inodes() - the VFS functionality completely replaces the internal flush queue for doing this writeback work in a separate context to avoid stack overruns. This does have one complication - it cannot be called with page locks held. Hence move the flushing of delalloc space when ENOSPC occurs back up into xfs_file_aio_buffered_write when we don't hold any locks that will stall writeback. Note that we always need to pass a count of zero to generic_file_buffered_write() as the previously written byte count. We only do this by accident before this patch by the virtue of ret always being zero when there are no errors. Make this explicit rather than needing to specifically zero ret in the ENOSPC retry case. Signed-off-by: Dave Chinner --- fs/xfs/xfs_file.c | 13 +++++---- fs/xfs/xfs_inode.h | 10 +++++++ fs/xfs/xfs_iomap.c | 23 +++++----------- fs/xfs/xfs_mount.h | 1 - fs/xfs/xfs_super.c | 3 -- fs/xfs/xfs_sync.c | 78 ---------------------------------------------------- fs/xfs/xfs_sync.h | 3 -- 7 files changed, 24 insertions(+), 107 deletions(-) diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 1eaeb8b..2cadcf7 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -728,16 +728,17 @@ xfs_file_buffered_aio_write( write_retry: trace_xfs_file_buffered_write(ip, count, iocb->ki_pos, 0); ret = generic_file_buffered_write(iocb, iovp, nr_segs, - pos, &iocb->ki_pos, count, ret); + pos, &iocb->ki_pos, count, 0); + /* - * if we just got an ENOSPC, flush the inode now we aren't holding any - * page locks and retry *once* + * If we just got an ENOSPC, try to write back all dirty inodes to + * convert delalloc space to free up some of the excess reserved + * metadata space. */ if (ret == -ENOSPC && !enospc) { enospc = 1; - ret = -xfs_flush_pages(ip, 0, -1, 0, FI_NONE); - if (!ret) - goto write_retry; + xfs_flush_inodes(ip); + goto write_retry; } current->backing_dev_info = NULL; diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index 94b32f9..a12fe18 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -288,6 +288,16 @@ xfs_new_eof(struct xfs_inode *ip, xfs_fsize_t new_size) } /* + * Flush all dirty data to disk. Must not be called while holding an XFS_ILOCK + * or a page lock. + */ +static inline void +xfs_flush_inodes(struct xfs_inode *ip) +{ + writeback_inodes_sb_if_idle(VFS_I(ip)->i_sb, WB_REASON_FS_FREE_SPACE); +} + +/* * i_flags helper functions */ static inline void diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index 973dff6..f858b90 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -373,7 +373,7 @@ xfs_iomap_write_delay( xfs_extlen_t extsz; int nimaps; xfs_bmbt_irec_t imap[XFS_WRITE_IMAPS]; - int prealloc, flushed = 0; + int prealloc; int error; ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); @@ -434,26 +434,17 @@ retry: } /* - * If bmapi returned us nothing, we got either ENOSPC or EDQUOT. For - * ENOSPC, * flush all other inodes with delalloc blocks to free up - * some of the excess reserved metadata space. For both cases, retry + * If bmapi returned us nothing, we got either ENOSPC or EDQUOT. Retry * without EOF preallocation. */ if (nimaps == 0) { trace_xfs_delalloc_enospc(ip, offset, count); - if (flushed) - return XFS_ERROR(error ? error : ENOSPC); - - if (error == ENOSPC) { - xfs_iunlock(ip, XFS_ILOCK_EXCL); - xfs_flush_inodes(ip); - xfs_ilock(ip, XFS_ILOCK_EXCL); + if (prealloc) { + prealloc = 0; + error = 0; + goto retry; } - - flushed = 1; - error = 0; - prealloc = 0; - goto retry; + return XFS_ERROR(error ? error : ENOSPC); } if (!(imap[0].br_startblock || XFS_IS_REALTIME_INODE(ip))) diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 26e46ae..a54b5aa 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -198,7 +198,6 @@ typedef struct xfs_mount { #endif struct xfs_mru_cache *m_filestream; /* per-mount filestream data */ struct delayed_work m_reclaim_work; /* background inode reclaim */ - struct work_struct m_flush_work; /* background inode flush */ __int64_t m_update_flags; /* sb flags we need to update on the next remount,rw */ struct shrinker m_inode_shrink; /* inode reclaim shrinker */ diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index b85ca2d..fed1eb2 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -918,8 +918,6 @@ xfs_fs_put_super( { struct xfs_mount *mp = XFS_M(sb); - cancel_work_sync(&mp->m_flush_work); - xfs_filestream_unmount(mp); xfs_unmountfs(mp); @@ -1231,7 +1229,6 @@ xfs_fs_fill_super( spin_lock_init(&mp->m_sb_lock); mutex_init(&mp->m_growlock); atomic_set(&mp->m_active_trans, 0); - INIT_WORK(&mp->m_flush_work, xfs_flush_worker); INIT_DELAYED_WORK(&mp->m_reclaim_work, xfs_reclaim_worker); mp->m_super = sb; diff --git a/fs/xfs/xfs_sync.c b/fs/xfs/xfs_sync.c index 7527610..6a2ada3 100644 --- a/fs/xfs/xfs_sync.c +++ b/fs/xfs/xfs_sync.c @@ -217,51 +217,6 @@ xfs_inode_ag_iterator( } STATIC int -xfs_sync_inode_data( - struct xfs_inode *ip, - struct xfs_perag *pag, - int flags) -{ - struct inode *inode = VFS_I(ip); - struct address_space *mapping = inode->i_mapping; - int error = 0; - - if (!mapping_tagged(mapping, PAGECACHE_TAG_DIRTY)) - return 0; - - if (!xfs_ilock_nowait(ip, XFS_IOLOCK_SHARED)) { - if (flags & SYNC_TRYLOCK) - return 0; - xfs_ilock(ip, XFS_IOLOCK_SHARED); - } - - error = xfs_flush_pages(ip, 0, -1, (flags & SYNC_WAIT) ? - 0 : XBF_ASYNC, FI_NONE); - xfs_iunlock(ip, XFS_IOLOCK_SHARED); - return error; -} - -/* - * Write out pagecache data for the whole filesystem. - */ -STATIC int -xfs_sync_data( - struct xfs_mount *mp, - int flags) -{ - int error; - - ASSERT((flags & ~(SYNC_TRYLOCK|SYNC_WAIT)) == 0); - - error = xfs_inode_ag_iterator(mp, xfs_sync_inode_data, flags); - if (error) - return XFS_ERROR(error); - - xfs_log_force(mp, (flags & SYNC_WAIT) ? XFS_LOG_SYNC : 0); - return 0; -} - -STATIC int xfs_sync_fsdata( struct xfs_mount *mp) { @@ -415,39 +370,6 @@ xfs_reclaim_worker( xfs_syncd_queue_reclaim(mp); } -/* - * Flush delayed allocate data, attempting to free up reserved space - * from existing allocations. At this point a new allocation attempt - * has failed with ENOSPC and we are in the process of scratching our - * heads, looking about for more room. - * - * Queue a new data flush if there isn't one already in progress and - * wait for completion of the flush. This means that we only ever have one - * inode flush in progress no matter how many ENOSPC events are occurring and - * so will prevent the system from bogging down due to every concurrent - * ENOSPC event scanning all the active inodes in the system for writeback. - */ -void -xfs_flush_inodes( - struct xfs_inode *ip) -{ - struct xfs_mount *mp = ip->i_mount; - - queue_work(xfs_syncd_wq, &mp->m_flush_work); - flush_work_sync(&mp->m_flush_work); -} - -void -xfs_flush_worker( - struct work_struct *work) -{ - struct xfs_mount *mp = container_of(work, - struct xfs_mount, m_flush_work); - - xfs_sync_data(mp, SYNC_TRYLOCK); - xfs_sync_data(mp, SYNC_TRYLOCK | SYNC_WAIT); -} - void __xfs_inode_set_reclaim_tag( struct xfs_perag *pag, diff --git a/fs/xfs/xfs_sync.h b/fs/xfs/xfs_sync.h index 8d58fab..0018e84 100644 --- a/fs/xfs/xfs_sync.h +++ b/fs/xfs/xfs_sync.h @@ -26,14 +26,11 @@ struct xfs_perag; extern struct workqueue_struct *xfs_syncd_wq; /* sync workqueue */ -void xfs_flush_worker(struct work_struct *work); void xfs_reclaim_worker(struct work_struct *work); int xfs_quiesce_data(struct xfs_mount *mp); void xfs_quiesce_attr(struct xfs_mount *mp); -void xfs_flush_inodes(struct xfs_inode *ip); - int xfs_reclaim_inodes(struct xfs_mount *mp, int mode); int xfs_reclaim_inodes_count(struct xfs_mount *mp); void xfs_reclaim_inodes_nr(struct xfs_mount *mp, int nr_to_scan); -- 1.7.10 From dave@fromorbit.com Thu Sep 27 23:44:04 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8S4i4wH174880 for ; Thu, 27 Sep 2012 23:44:04 -0500 X-ASG-Debug-ID: 1348807523-04cb6c79445c3f0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id 49BdAec9UXXrOHOn for ; Thu, 27 Sep 2012 21:45:23 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AowIAOsqZVB5LPfb/2dsb2JhbABEi1+yK4EJgiABAQUnLzMIGBgZOQMbGYgEuDuOE4MsA5I4k1yCeYFIBA Received: from ppp121-44-247-219.lns20.syd7.internode.on.net (HELO dastard) ([121.44.247.219]) by ipmail04.adl6.internode.on.net with ESMTP; 28 Sep 2012 14:15:00 +0930 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1THSRf-0007Lv-IF for xfs@oss.sgi.com; Fri, 28 Sep 2012 14:44:59 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1THSRV-0005GT-4D for xfs@oss.sgi.com; Fri, 28 Sep 2012 14:44:49 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 05/13] xfs: Bring some sanity to log unmounting Date: Fri, 28 Sep 2012 14:44:37 +1000 X-ASG-Orig-Subj: [PATCH 05/13] xfs: Bring some sanity to log unmounting Message-Id: <1348807485-20165-6-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10 In-Reply-To: <1348807485-20165-1-git-send-email-david@fromorbit.com> References: <1348807485-20165-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1348807523 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109794 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner When unmounting the filesystem, there are lots of operations that need to be done in a specific order, and they are spread across across a couple of functions. We have to drain the AIL before we write the unmount record, and we have to shut down the background log work before we do either of them. But this is all split haphazardly across xfs_unmountfs() and xfs_log_unmount(). Move all the AIL flushing and log manipulations to xfs_log_unmount() so that the responisbilities of each function is clear and the operations they perform obvious. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Reviewed-by: Mark Tinguely --- fs/xfs/xfs_log.c | 29 ++++++++++++++++++++++++++--- fs/xfs/xfs_mount.c | 24 ------------------------ 2 files changed, 26 insertions(+), 27 deletions(-) diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index a1fe7a7..a400e71 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -853,15 +853,38 @@ xfs_log_unmount_write(xfs_mount_t *mp) } /* xfs_log_unmount_write */ /* - * Deallocate log structures for unmount/relocation. + * Shut down and release the AIL and Log. * - * We need to stop the aild from running before we destroy - * and deallocate the log as the aild references the log. + * During unmount, we need to ensure we flush all the dirty metadata objects + * from the AIL so that the log is empty before we write the unmount record to + * the log. + * + * To do this, we first need to shut down the background log work so it is not + * trying to cover the log as we clean up. We then need to unpin all objects in + * the log so we can then flush them out. Once they have completed their IO and + * run the callbacks removing themselves from the AIL, we can write the unmount + * record, tear down the AIL and finally free the log. */ void xfs_log_unmount(xfs_mount_t *mp) { cancel_delayed_work_sync(&mp->m_log->l_work); + xfs_log_force(mp, XFS_LOG_SYNC); + + /* + * The superblock buffer is uncached and while xfs_ail_push_all_sync() + * will push it, xfs_wait_buftarg() will not wait for it. Further, + * xfs_buf_iowait() cannot be used because it was pushed with the + * XBF_ASYNC flag set, so we need to use a lock/unlock pair to wait for + * the IO to complete. + */ + xfs_ail_push_all_sync(mp->m_ail); + xfs_wait_buftarg(mp->m_ddev_targp); + xfs_buf_lock(mp->m_sb_bp); + xfs_buf_unlock(mp->m_sb_bp); + + xfs_log_unmount_write(mp); + xfs_trans_ail_destroy(mp); xlog_dealloc_log(mp->m_log); } diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 3152924..149b601 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -1493,13 +1493,6 @@ xfs_unmountfs( xfs_qm_unmount(mp); /* - * Flush out the log synchronously so that we know for sure - * that nothing is pinned. This is important because bflush() - * will skip pinned buffers. - */ - xfs_log_force(mp, XFS_LOG_SYNC); - - /* * Unreserve any blocks we have so that when we unmount we don't account * the reserved free space as used. This is really only necessary for * lazy superblock counting because it trusts the incore superblock @@ -1524,23 +1517,6 @@ xfs_unmountfs( xfs_warn(mp, "Unable to update superblock counters. " "Freespace may not be correct on next mount."); - /* - * At this point we might have modified the superblock again and thus - * added an item to the AIL, thus flush it again. - */ - xfs_ail_push_all_sync(mp->m_ail); - xfs_wait_buftarg(mp->m_ddev_targp); - - /* - * The superblock buffer is uncached and xfsaild_push() will lock and - * set the XBF_ASYNC flag on the buffer. We cannot do xfs_buf_iowait() - * here but a lock on the superblock buffer will block until iodone() - * has completed. - */ - xfs_buf_lock(mp->m_sb_bp); - xfs_buf_unlock(mp->m_sb_bp); - - xfs_log_unmount_write(mp); xfs_log_unmount(mp); xfs_uuid_unmount(mp); -- 1.7.10 From dave@fromorbit.com Thu Sep 27 23:44:06 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8S4i6DI174899 for ; Thu, 27 Sep 2012 23:44:06 -0500 X-ASG-Debug-ID: 1348807519-04cbb069c25e620004-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id B0vCF6eCwnnoIl1W for ; Thu, 27 Sep 2012 21:45:24 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ao0IAOsqZVB5LPfb/2dsb2JhbAA8CItfsiuBCYIgAQEFJy8eFQgYMTkDGxmIBLg7iy6GEQOfJYZvgnk Received: from ppp121-44-247-219.lns20.syd7.internode.on.net (HELO dastard) ([121.44.247.219]) by ipmail04.adl6.internode.on.net with ESMTP; 28 Sep 2012 14:15:00 +0930 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1THSRV-0007Lg-Lc for xfs@oss.sgi.com; Fri, 28 Sep 2012 14:44:49 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1THSRV-0005Gg-7K for xfs@oss.sgi.com; Fri, 28 Sep 2012 14:44:49 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 08/13] xfs: xfs_sync_fsdata is redundant Date: Fri, 28 Sep 2012 14:44:40 +1000 X-ASG-Orig-Subj: [PATCH 08/13] xfs: xfs_sync_fsdata is redundant Message-Id: <1348807485-20165-9-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10 In-Reply-To: <1348807485-20165-1-git-send-email-david@fromorbit.com> References: <1348807485-20165-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1348807524 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109794 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Why do we need to write the superblock to disk once we've written all the data? We don't actually - the reasons for doing this are lost in the mists of time, and go back to the way Irix used to drive VFS flushing. On linux, this code is only called from two contexts: remount and .sync_fs. In the remount case, the call is followed by a metadata sync, which unpins and writes the superblock. In the sync_fs case, we only need to force the log to disk to ensure that the superblock is correctly on disk, so we don't actually need to write it. Hence the functionality is either redundant or superfluous and thus can be removed. Seeing as xfs_quiesce_data is essentially now just a log force, remove it as well and fold the code back into the two callers. Neither of them need the log covering check, either, as that is redundant for the remount case, and unnecessary for the .sync_fs case. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Reviewed-by: Mark Tinguely --- fs/xfs/xfs_super.c | 19 +++++---------- fs/xfs/xfs_sync.c | 67 +++++++--------------------------------------------- 2 files changed, 14 insertions(+), 72 deletions(-) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 65cf42c..1ee7b09 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -952,7 +952,6 @@ xfs_fs_sync_fs( int wait) { struct xfs_mount *mp = XFS_M(sb); - int error; /* * Doing anything during the async pass would be counterproductive. @@ -960,10 +959,7 @@ xfs_fs_sync_fs( if (!wait) return 0; - error = xfs_quiesce_data(mp); - if (error) - return -error; - + xfs_log_force(mp, XFS_LOG_SYNC); if (laptop_mode) { /* * The disk must be active because we're syncing. @@ -1127,15 +1123,12 @@ xfs_fs_remount( /* rw -> ro */ if (!(mp->m_flags & XFS_MOUNT_RDONLY) && (*flags & MS_RDONLY)) { /* - * After we have synced the data but before we sync the - * metadata, we need to free up the reserve block pool so that - * the used block count in the superblock on disk is correct at - * the end of the remount. Stash the current reserve pool size - * so that if we get remounted rw, we can return it to the same - * size. + * Before we sync the metadata, we need to free up the reserve + * block pool so that the used block count in the superblock on + * disk is correct at the end of the remount. Stash the current + * reserve pool size so that if we get remounted rw, we can + * return it to the same size. */ - - xfs_quiesce_data(mp); xfs_save_resvblks(mp); xfs_quiesce_attr(mp); mp->m_flags |= XFS_MOUNT_RDONLY; diff --git a/fs/xfs/xfs_sync.c b/fs/xfs/xfs_sync.c index 15be21f..581eb59 100644 --- a/fs/xfs/xfs_sync.c +++ b/fs/xfs/xfs_sync.c @@ -214,70 +214,16 @@ xfs_inode_ag_iterator( return XFS_ERROR(last_error); } -STATIC int -xfs_sync_fsdata( - struct xfs_mount *mp) -{ - struct xfs_buf *bp; - int error; - - /* - * If the buffer is pinned then push on the log so we won't get stuck - * waiting in the write for someone, maybe ourselves, to flush the log. - * - * Even though we just pushed the log above, we did not have the - * superblock buffer locked at that point so it can become pinned in - * between there and here. - */ - bp = xfs_getsb(mp, 0); - if (xfs_buf_ispinned(bp)) - xfs_log_force(mp, 0); - error = xfs_bwrite(bp); - xfs_buf_relse(bp); - return error; -} - -/* - * When remounting a filesystem read-only or freezing the filesystem, we have - * two phases to execute. This first phase is syncing the data before we - * quiesce the filesystem, and the second is flushing all the inodes out after - * we've waited for all the transactions created by the first phase to - * complete. The second phase ensures that the inodes are written to their - * location on disk rather than just existing in transactions in the log. This - * means after a quiesce there is no log replay required to write the inodes to - * disk (this is the main difference between a sync and a quiesce). - */ -/* - * First stage of freeze - no writers will make progress now we are here, - * so we flush delwri and delalloc buffers here, then wait for all I/O to - * complete. Data is frozen at that point. Metadata is not frozen, - * transactions can still occur here so don't bother emptying the AIL - * because it'll just get dirty again. - */ -int -xfs_quiesce_data( - struct xfs_mount *mp) -{ - int error, error2 = 0; - - /* force out the log */ - xfs_log_force(mp, XFS_LOG_SYNC); - - /* write superblock and hoover up shutdown errors */ - error = xfs_sync_fsdata(mp); - - /* mark the log as covered if needed */ - if (xfs_log_need_covered(mp)) - error2 = xfs_fs_log_dummy(mp); - - return error ? error : error2; -} - /* * Second stage of a quiesce. The data is already synced, now we have to take * care of the metadata. New transactions are already blocked, so we need to * wait for any remaining transactions to drain out before proceeding. * + * The second phase ensures that the inodes are written to their + * location on disk rather than just existing in transactions in the log. This + * means after a quiesce there is no log replay required to write the inodes to + * disk (this is the main difference between a sync and a quiesce). + * * Note: this stops background sync work - the callers must ensure it is started * again when appropriate. */ @@ -291,6 +237,9 @@ xfs_quiesce_attr( while (atomic_read(&mp->m_active_trans) > 0) delay(100); + /* force the log to unpin objects from the now complete transactions */ + xfs_log_force(mp, XFS_LOG_SYNC); + /* reclaim inodes to do any IO before the freeze completes */ xfs_reclaim_inodes(mp, 0); xfs_reclaim_inodes(mp, SYNC_WAIT); -- 1.7.10 From dave@fromorbit.com Thu Sep 27 23:44:08 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8S4i7TM174925 for ; Thu, 27 Sep 2012 23:44:07 -0500 X-ASG-Debug-ID: 1348807523-04cb6c79445c3f0003-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id ORPtTwbEIF7LSEHA for ; Thu, 27 Sep 2012 21:45:26 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AowIAOsqZVB5LPfb/2dsb2JhbABEi1+yK4EJgiABAQUnLzMIGDE5AxsZiAS4O5E/A58lhm+CeYFIBA Received: from ppp121-44-247-219.lns20.syd7.internode.on.net (HELO dastard) ([121.44.247.219]) by ipmail04.adl6.internode.on.net with ESMTP; 28 Sep 2012 14:15:10 +0930 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1THSRp-0007M5-NX for xfs@oss.sgi.com; Fri, 28 Sep 2012 14:45:09 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1THSRV-0005Gq-9H for xfs@oss.sgi.com; Fri, 28 Sep 2012 14:44:49 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 10/13] xfs: xfs_quiesce_attr() should quiesce the log like unmount Date: Fri, 28 Sep 2012 14:44:42 +1000 X-ASG-Orig-Subj: [PATCH 10/13] xfs: xfs_quiesce_attr() should quiesce the log like unmount Message-Id: <1348807485-20165-11-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10 In-Reply-To: <1348807485-20165-1-git-send-email-david@fromorbit.com> References: <1348807485-20165-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1348807526 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109794 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner xfs_quiesce_attr() is supposed to leave the log empty with an unmount record written. Right now it does not wait for the AIL to be emptied before writing the unmount record, not does it wait for metadata IO completion, either. Fix it to use the same method and code as xfs_log_unmount(). Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Reviewed-by: Mark Tinguely --- fs/xfs/xfs_log.c | 25 ++++++++++++++++++------- fs/xfs/xfs_log.h | 1 + fs/xfs/xfs_super.c | 41 ++++++++--------------------------------- 3 files changed, 27 insertions(+), 40 deletions(-) diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 96ea9ed..67d63f6 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -853,20 +853,17 @@ xfs_log_unmount_write(xfs_mount_t *mp) } /* xfs_log_unmount_write */ /* - * Shut down and release the AIL and Log. - * - * During unmount, we need to ensure we flush all the dirty metadata objects - * from the AIL so that the log is empty before we write the unmount record to - * the log. + * Empty the log for unmount/freeze. * * To do this, we first need to shut down the background log work so it is not * trying to cover the log as we clean up. We then need to unpin all objects in * the log so we can then flush them out. Once they have completed their IO and * run the callbacks removing themselves from the AIL, we can write the unmount - * record, tear down the AIL and finally free the log. + * record. */ void -xfs_log_unmount(xfs_mount_t *mp) +xfs_log_quiesce( + struct xfs_mount *mp) { cancel_delayed_work_sync(&mp->m_log->l_work); xfs_log_force(mp, XFS_LOG_SYNC); @@ -884,6 +881,20 @@ xfs_log_unmount(xfs_mount_t *mp) xfs_buf_unlock(mp->m_sb_bp); xfs_log_unmount_write(mp); +} + +/* + * Shut down and release the AIL and Log. + * + * During unmount, we need to ensure we flush all the dirty metadata objects + * from the AIL so that the log is empty before we write the unmount record to + * the log. Once this is done, we can tear down the AIL and the log. + */ +void +xfs_log_unmount( + struct xfs_mount *mp) +{ + xfs_log_quiesce(mp); xfs_trans_ail_destroy(mp); xlog_dealloc_log(mp->m_log); diff --git a/fs/xfs/xfs_log.h b/fs/xfs/xfs_log.h index 26ed7de..5caee96 100644 --- a/fs/xfs/xfs_log.h +++ b/fs/xfs/xfs_log.h @@ -183,6 +183,7 @@ bool xfs_log_item_in_current_chkpt(struct xfs_log_item *lip); void xfs_log_work_queue(struct xfs_mount *mp); void xfs_log_worker(struct work_struct *work); +void xfs_log_quiesce(struct xfs_mount *mp); #endif #endif /* __XFS_LOG_H__ */ diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 4806e46..81de924 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -1048,15 +1048,11 @@ xfs_restore_resvblks(struct xfs_mount *mp) * * This ensures that the metadata is written to their location on disk rather * than just existing in transactions in the log. This means after a quiesce - * there is no log replay required to write the inodes to disk (this is the main - * difference between a sync and a quiesce). + * there is no log replay required to write the inodes to disk - this is the + * primary difference between a sync and a quiesce. * - * This shoul deffectively mimic the code in xfs_unmountfs() and - * xfs_log_umount() but without tearing down any structures. - * XXX: bug fixes needed! - * - * Note: this stops background log work - the callers must ensure it is started - * again when appropriate. + * Note: xfs_log_quiesce() stops background log work - the callers must ensure + * it is started again when appropriate. */ void xfs_quiesce_attr( @@ -1075,39 +1071,18 @@ xfs_quiesce_attr( xfs_reclaim_inodes(mp, 0); xfs_reclaim_inodes(mp, SYNC_WAIT); - /* flush all pending changes from the AIL */ - xfs_ail_push_all_sync(mp->m_ail); - - /* stop background log work */ - cancel_delayed_work_sync(&mp->m_log->l_work); - - /* - * Just warn here till VFS can correctly support - * read-only remount without racing. - */ - WARN_ON(atomic_read(&mp->m_active_trans) != 0); - /* Push the superblock and write an unmount record */ error = xfs_log_sbcount(mp); if (error) xfs_warn(mp, "xfs_attr_quiesce: failed to log sb changes. " "Frozen image may not be consistent."); - xfs_log_unmount_write(mp); - /* - * At this point we might have modified the superblock again and thus - * added an item to the AIL, thus flush it again. + * Just warn here till VFS can correctly support + * read-only remount without racing. */ - xfs_ail_push_all_sync(mp->m_ail); + WARN_ON(atomic_read(&mp->m_active_trans) != 0); - /* - * The superblock buffer is uncached and xfsaild_push() will lock and - * set the XBF_ASYNC flag on the buffer. We cannot do xfs_buf_iowait() - * here but a lock on the superblock buffer will block until iodone() - * has completed. - */ - xfs_buf_lock(mp->m_sb_bp); - xfs_buf_unlock(mp->m_sb_bp); + xfs_log_quiesce(mp); } STATIC int -- 1.7.10 From dave@fromorbit.com Thu Sep 27 23:44:08 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8S4i78V174929 for ; Thu, 27 Sep 2012 23:44:08 -0500 X-ASG-Debug-ID: 1348807519-04cbb069c25e620005-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id EVBPPibfgRnR6Iao for ; Thu, 27 Sep 2012 21:45:26 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AowIAOsqZVB5LPfb/2dsb2JhbABEi1+yK4EJgiABAQUnLx4VCBgxOQMbGYgEuDuRPwOfJYZvgnmBSAQ Received: from ppp121-44-247-219.lns20.syd7.internode.on.net (HELO dastard) ([121.44.247.219]) by ipmail04.adl6.internode.on.net with ESMTP; 28 Sep 2012 14:15:00 +0930 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1THSRV-0007Lh-Me for xfs@oss.sgi.com; Fri, 28 Sep 2012 14:44:49 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1THSRV-0005Gl-8E for xfs@oss.sgi.com; Fri, 28 Sep 2012 14:44:49 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 09/13] xfs: move xfs_quiesce_attr() into xfs_super.c Date: Fri, 28 Sep 2012 14:44:41 +1000 X-ASG-Orig-Subj: [PATCH 09/13] xfs: move xfs_quiesce_attr() into xfs_super.c Message-Id: <1348807485-20165-10-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10 In-Reply-To: <1348807485-20165-1-git-send-email-david@fromorbit.com> References: <1348807485-20165-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1348807525 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109794 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner Both callers of xfs_quiesce_attr() are in xfs_super.c, and there's nothing really sync-specific about this functionality so it doesn't really matter where it lives. Move it to benext to it's callers, so all the remount/sync_fs code is in the one place. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Reviewed-by: Mark Tinguely --- fs/xfs/xfs_super.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_sync.c | 65 -------------------------------------------------- fs/xfs/xfs_sync.h | 3 --- 3 files changed, 67 insertions(+), 68 deletions(-) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 1ee7b09..4806e46 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -1043,6 +1043,73 @@ xfs_restore_resvblks(struct xfs_mount *mp) xfs_reserve_blocks(mp, &resblks, NULL); } +/* + * Trigger writeback of all the dirty metadata in the file system. + * + * This ensures that the metadata is written to their location on disk rather + * than just existing in transactions in the log. This means after a quiesce + * there is no log replay required to write the inodes to disk (this is the main + * difference between a sync and a quiesce). + * + * This shoul deffectively mimic the code in xfs_unmountfs() and + * xfs_log_umount() but without tearing down any structures. + * XXX: bug fixes needed! + * + * Note: this stops background log work - the callers must ensure it is started + * again when appropriate. + */ +void +xfs_quiesce_attr( + struct xfs_mount *mp) +{ + int error = 0; + + /* wait for all modifications to complete */ + while (atomic_read(&mp->m_active_trans) > 0) + delay(100); + + /* force the log to unpin objects from the now complete transactions */ + xfs_log_force(mp, XFS_LOG_SYNC); + + /* reclaim inodes to do any IO before the freeze completes */ + xfs_reclaim_inodes(mp, 0); + xfs_reclaim_inodes(mp, SYNC_WAIT); + + /* flush all pending changes from the AIL */ + xfs_ail_push_all_sync(mp->m_ail); + + /* stop background log work */ + cancel_delayed_work_sync(&mp->m_log->l_work); + + /* + * Just warn here till VFS can correctly support + * read-only remount without racing. + */ + WARN_ON(atomic_read(&mp->m_active_trans) != 0); + + /* Push the superblock and write an unmount record */ + error = xfs_log_sbcount(mp); + if (error) + xfs_warn(mp, "xfs_attr_quiesce: failed to log sb changes. " + "Frozen image may not be consistent."); + xfs_log_unmount_write(mp); + + /* + * At this point we might have modified the superblock again and thus + * added an item to the AIL, thus flush it again. + */ + xfs_ail_push_all_sync(mp->m_ail); + + /* + * The superblock buffer is uncached and xfsaild_push() will lock and + * set the XBF_ASYNC flag on the buffer. We cannot do xfs_buf_iowait() + * here but a lock on the superblock buffer will block until iodone() + * has completed. + */ + xfs_buf_lock(mp->m_sb_bp); + xfs_buf_unlock(mp->m_sb_bp); +} + STATIC int xfs_fs_remount( struct super_block *sb, diff --git a/fs/xfs/xfs_sync.c b/fs/xfs/xfs_sync.c index 581eb59..7b63028 100644 --- a/fs/xfs/xfs_sync.c +++ b/fs/xfs/xfs_sync.c @@ -215,71 +215,6 @@ xfs_inode_ag_iterator( } /* - * Second stage of a quiesce. The data is already synced, now we have to take - * care of the metadata. New transactions are already blocked, so we need to - * wait for any remaining transactions to drain out before proceeding. - * - * The second phase ensures that the inodes are written to their - * location on disk rather than just existing in transactions in the log. This - * means after a quiesce there is no log replay required to write the inodes to - * disk (this is the main difference between a sync and a quiesce). - * - * Note: this stops background sync work - the callers must ensure it is started - * again when appropriate. - */ -void -xfs_quiesce_attr( - struct xfs_mount *mp) -{ - int error = 0; - - /* wait for all modifications to complete */ - while (atomic_read(&mp->m_active_trans) > 0) - delay(100); - - /* force the log to unpin objects from the now complete transactions */ - xfs_log_force(mp, XFS_LOG_SYNC); - - /* reclaim inodes to do any IO before the freeze completes */ - xfs_reclaim_inodes(mp, 0); - xfs_reclaim_inodes(mp, SYNC_WAIT); - - /* flush all pending changes from the AIL */ - xfs_ail_push_all_sync(mp->m_ail); - - /* stop background log work */ - cancel_delayed_work_sync(&mp->m_log->l_work); - - /* - * Just warn here till VFS can correctly support - * read-only remount without racing. - */ - WARN_ON(atomic_read(&mp->m_active_trans) != 0); - - /* Push the superblock and write an unmount record */ - error = xfs_log_sbcount(mp); - if (error) - xfs_warn(mp, "xfs_attr_quiesce: failed to log sb changes. " - "Frozen image may not be consistent."); - xfs_log_unmount_write(mp); - - /* - * At this point we might have modified the superblock again and thus - * added an item to the AIL, thus flush it again. - */ - xfs_ail_push_all_sync(mp->m_ail); - - /* - * The superblock buffer is uncached and xfsaild_push() will lock and - * set the XBF_ASYNC flag on the buffer. We cannot do xfs_buf_iowait() - * here but a lock on the superblock buffer will block until iodone() - * has completed. - */ - xfs_buf_lock(mp->m_sb_bp); - xfs_buf_unlock(mp->m_sb_bp); -} - -/* * Queue a new inode reclaim pass if there are reclaimable inodes and there * isn't a reclaim pass already in progress. By default it runs every 5s based * on the xfs periodic sync default of 30s. Perhaps this should have it's own diff --git a/fs/xfs/xfs_sync.h b/fs/xfs/xfs_sync.h index 0beabea..0ba9c89 100644 --- a/fs/xfs/xfs_sync.h +++ b/fs/xfs/xfs_sync.h @@ -26,9 +26,6 @@ struct xfs_perag; void xfs_reclaim_worker(struct work_struct *work); -int xfs_quiesce_data(struct xfs_mount *mp); -void xfs_quiesce_attr(struct xfs_mount *mp); - int xfs_reclaim_inodes(struct xfs_mount *mp, int mode); int xfs_reclaim_inodes_count(struct xfs_mount *mp); void xfs_reclaim_inodes_nr(struct xfs_mount *mp, int nr_to_scan); -- 1.7.10 From dave@fromorbit.com Thu Sep 27 23:44:02 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8S4i2Qe174851 for ; Thu, 27 Sep 2012 23:44:02 -0500 X-ASG-Debug-ID: 1348807521-04cb6c79425c3e0001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id NUiE1yebVWjQK4Kq for ; Thu, 27 Sep 2012 21:45:21 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AowIAOsqZVB5LPfb/2dsb2JhbAA8CItfsiuBCYIgAQEFJy8zCBgxOQMbGYgEuDuLLoYRA58lhm+CeYFIBA Received: from ppp121-44-247-219.lns20.syd7.internode.on.net (HELO dastard) ([121.44.247.219]) by ipmail04.adl6.internode.on.net with ESMTP; 28 Sep 2012 14:15:00 +0930 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1THSRf-0007Lu-FB for xfs@oss.sgi.com; Fri, 28 Sep 2012 14:44:59 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1THSRU-0005GB-Vn for xfs@oss.sgi.com; Fri, 28 Sep 2012 14:44:48 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 01/13] xfs: xfs_syncd_stop must die Date: Fri, 28 Sep 2012 14:44:33 +1000 X-ASG-Orig-Subj: [PATCH 01/13] xfs: xfs_syncd_stop must die Message-Id: <1348807485-20165-2-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10 In-Reply-To: <1348807485-20165-1-git-send-email-david@fromorbit.com> References: <1348807485-20165-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1348807521 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109794 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner xfs_syncd_start and xfs_syncd_stop tie a bunch of unrelated functionailty together that actually have different start and stop requirements. Kill these functions and open code the start/stop methods for each of the background functions. Subsequent patches will move the start/stop functions around to the correct places to avoid races and shutdown issues. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Reviewed-by: Mark Tinguely --- fs/xfs/xfs_super.c | 25 ++++++++++++++++++------- fs/xfs/xfs_sync.c | 30 ++++-------------------------- fs/xfs/xfs_sync.h | 6 ++++-- 3 files changed, 26 insertions(+), 35 deletions(-) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 19e2380..59d76bd 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -921,7 +921,11 @@ xfs_fs_put_super( xfs_filestream_unmount(mp); cancel_delayed_work_sync(&mp->m_sync_work); xfs_unmountfs(mp); - xfs_syncd_stop(mp); + + cancel_delayed_work_sync(&mp->m_sync_work); + cancel_delayed_work_sync(&mp->m_reclaim_work); + cancel_work_sync(&mp->m_flush_work); + xfs_freesb(mp); xfs_icsb_destroy_counters(mp); xfs_destroy_mount_workqueues(mp); @@ -1291,9 +1295,11 @@ xfs_fs_fill_super( sb->s_time_gran = 1; set_posix_acl_flag(sb); - error = xfs_syncd_init(mp); - if (error) - goto out_filestream_unmount; + INIT_WORK(&mp->m_flush_work, xfs_flush_worker); + INIT_DELAYED_WORK(&mp->m_sync_work, xfs_sync_worker); + INIT_DELAYED_WORK(&mp->m_reclaim_work, xfs_reclaim_worker); + + xfs_syncd_queue_sync(mp); error = xfs_mountfs(mp); if (error) @@ -1316,8 +1322,10 @@ xfs_fs_fill_super( return 0; out_syncd_stop: - xfs_syncd_stop(mp); - out_filestream_unmount: + cancel_delayed_work_sync(&mp->m_sync_work); + cancel_delayed_work_sync(&mp->m_reclaim_work); + cancel_work_sync(&mp->m_flush_work); + xfs_filestream_unmount(mp); out_free_sb: xfs_freesb(mp); @@ -1336,7 +1344,10 @@ out_destroy_workqueues: out_unmount: xfs_filestream_unmount(mp); xfs_unmountfs(mp); - xfs_syncd_stop(mp); + + cancel_delayed_work_sync(&mp->m_sync_work); + cancel_delayed_work_sync(&mp->m_reclaim_work); + cancel_work_sync(&mp->m_flush_work); goto out_free_sb; } diff --git a/fs/xfs/xfs_sync.c b/fs/xfs/xfs_sync.c index 9654817..13830e4 100644 --- a/fs/xfs/xfs_sync.c +++ b/fs/xfs/xfs_sync.c @@ -370,7 +370,7 @@ xfs_quiesce_attr( xfs_buf_unlock(mp->m_sb_bp); } -static void +void xfs_syncd_queue_sync( struct xfs_mount *mp) { @@ -383,7 +383,7 @@ xfs_syncd_queue_sync( * disk quotas. We might need to cover the log to indicate that the * filesystem is idle and not frozen. */ -STATIC void +void xfs_sync_worker( struct work_struct *work) { @@ -445,7 +445,7 @@ xfs_syncd_queue_reclaim( * goes low. It scans as quickly as possible avoiding locked inodes or those * already being flushed, and once done schedules a future pass. */ -STATIC void +void xfs_reclaim_worker( struct work_struct *work) { @@ -478,7 +478,7 @@ xfs_flush_inodes( flush_work_sync(&mp->m_flush_work); } -STATIC void +void xfs_flush_worker( struct work_struct *work) { @@ -489,28 +489,6 @@ xfs_flush_worker( xfs_sync_data(mp, SYNC_TRYLOCK | SYNC_WAIT); } -int -xfs_syncd_init( - struct xfs_mount *mp) -{ - INIT_WORK(&mp->m_flush_work, xfs_flush_worker); - INIT_DELAYED_WORK(&mp->m_sync_work, xfs_sync_worker); - INIT_DELAYED_WORK(&mp->m_reclaim_work, xfs_reclaim_worker); - - xfs_syncd_queue_sync(mp); - - return 0; -} - -void -xfs_syncd_stop( - struct xfs_mount *mp) -{ - cancel_delayed_work_sync(&mp->m_sync_work); - cancel_delayed_work_sync(&mp->m_reclaim_work); - cancel_work_sync(&mp->m_flush_work); -} - void __xfs_inode_set_reclaim_tag( struct xfs_perag *pag, diff --git a/fs/xfs/xfs_sync.h b/fs/xfs/xfs_sync.h index 941202e..3f59e5b 100644 --- a/fs/xfs/xfs_sync.h +++ b/fs/xfs/xfs_sync.h @@ -26,8 +26,10 @@ struct xfs_perag; extern struct workqueue_struct *xfs_syncd_wq; /* sync workqueue */ -int xfs_syncd_init(struct xfs_mount *mp); -void xfs_syncd_stop(struct xfs_mount *mp); +void xfs_syncd_queue_sync(struct xfs_mount *mp); +void xfs_sync_worker(struct work_struct *work); +void xfs_flush_worker(struct work_struct *work); +void xfs_reclaim_worker(struct work_struct *work); int xfs_quiesce_data(struct xfs_mount *mp); void xfs_quiesce_attr(struct xfs_mount *mp); -- 1.7.10 From dave@fromorbit.com Thu Sep 27 23:44:06 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-4.9 required=5.0 tests=BAYES_00,LOCAL_GNU_PATCH autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8S4i6Sc174901 for ; Thu, 27 Sep 2012 23:44:06 -0500 X-ASG-Debug-ID: 1348807521-04cb6c79425c3e0003-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id DFVqb5c5TtvGjcRO for ; Thu, 27 Sep 2012 21:45:24 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AowIAOsqZVB5LPfb/2dsb2JhbABEi1+yK4EJgiABAQUnLzMIGDE5AxsZiAS4O4sshhMDphSCeYFI Received: from ppp121-44-247-219.lns20.syd7.internode.on.net (HELO dastard) ([121.44.247.219]) by ipmail04.adl6.internode.on.net with ESMTP; 28 Sep 2012 14:15:00 +0930 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1THSRV-0007Lf-KT for xfs@oss.sgi.com; Fri, 28 Sep 2012 14:44:49 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1THSRV-0005Gc-6M for xfs@oss.sgi.com; Fri, 28 Sep 2012 14:44:49 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 07/13] xfs: syncd workqueue is no more Date: Fri, 28 Sep 2012 14:44:39 +1000 X-ASG-Orig-Subj: [PATCH 07/13] xfs: syncd workqueue is no more Message-Id: <1348807485-20165-8-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10 In-Reply-To: <1348807485-20165-1-git-send-email-david@fromorbit.com> References: <1348807485-20165-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1348807524 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109794 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner With the syncd functions moved to the log and/or removed, the syncd workqueue is the only remaining bit left. It is used by the log covering/ail pushing work, as well as by the inode reclaim work. Given how cheap workqueues are these days, give the log and inode reclaim work their own work queues and kill the syncd work queue. Signed-off-by: Dave Chinner --- fs/xfs/xfs_log.c | 2 +- fs/xfs/xfs_mount.h | 2 ++ fs/xfs/xfs_super.c | 38 ++++++++++++++++++-------------------- fs/xfs/xfs_sync.c | 20 +++++++++----------- fs/xfs/xfs_sync.h | 2 -- 5 files changed, 30 insertions(+), 34 deletions(-) diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index a400e71..96ea9ed 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -1191,7 +1191,7 @@ void xfs_log_work_queue( struct xfs_mount *mp) { - queue_delayed_work(xfs_syncd_wq, &mp->m_log->l_work, + queue_delayed_work(mp->m_log_workqueue, &mp->m_log->l_work, msecs_to_jiffies(xfs_syncd_centisecs * 10)); } diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index a54b5aa..7c417b6 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -207,6 +207,8 @@ typedef struct xfs_mount { struct workqueue_struct *m_data_workqueue; struct workqueue_struct *m_unwritten_workqueue; struct workqueue_struct *m_cil_workqueue; + struct workqueue_struct *m_reclaim_workqueue; + struct workqueue_struct *m_log_workqueue; } xfs_mount_t; /* diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index fed1eb2..65cf42c 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -776,8 +776,23 @@ xfs_init_mount_workqueues( WQ_MEM_RECLAIM, 0, mp->m_fsname); if (!mp->m_cil_workqueue) goto out_destroy_unwritten; + + mp->m_reclaim_workqueue = alloc_workqueue("xfs-reclaim/%s", + WQ_NON_REENTRANT, 0, mp->m_fsname); + if (!mp->m_reclaim_workqueue) + goto out_destroy_cil; + + mp->m_log_workqueue = alloc_workqueue("xfs-reclaim/%s", + WQ_NON_REENTRANT, 0, mp->m_fsname); + if (!mp->m_log_workqueue) + goto out_destroy_reclaim; + return 0; +out_destroy_reclaim: + destroy_workqueue(mp->m_reclaim_workqueue); +out_destroy_cil: + destroy_workqueue(mp->m_cil_workqueue); out_destroy_unwritten: destroy_workqueue(mp->m_unwritten_workqueue); out_destroy_data_iodone_queue: @@ -790,6 +805,8 @@ STATIC void xfs_destroy_mount_workqueues( struct xfs_mount *mp) { + destroy_workqueue(mp->m_log_workqueue); + destroy_workqueue(mp->m_reclaim_workqueue); destroy_workqueue(mp->m_cil_workqueue); destroy_workqueue(mp->m_data_workqueue); destroy_workqueue(mp->m_unwritten_workqueue); @@ -1280,10 +1297,6 @@ xfs_fs_fill_super( /* * we must configure the block size in the superblock before we run the * full mount process as the mount process can lookup and cache inodes. - * For the same reason we must also initialise the syncd and register - * the inode cache shrinker so that inodes can be reclaimed during - * operations like a quotacheck that iterate all inodes in the - * filesystem. */ sb->s_magic = XFS_SB_MAGIC; sb->s_blocksize = mp->m_sb.sb_blocksize; @@ -1523,16 +1536,6 @@ STATIC int __init xfs_init_workqueues(void) { /* - * We never want to the same work item to run twice, reclaiming inodes - * or idling the log is not going to get any faster by multiple CPUs - * competing for ressources. Use the default large max_active value - * so that even lots of filesystems can perform these task in parallel. - */ - xfs_syncd_wq = alloc_workqueue("xfssyncd", WQ_NON_REENTRANT, 0); - if (!xfs_syncd_wq) - return -ENOMEM; - - /* * The allocation workqueue can be used in memory reclaim situations * (writepage path), and parallelism is only limited by the number of * AGs in all the filesystems mounted. Hence use the default large @@ -1540,20 +1543,15 @@ xfs_init_workqueues(void) */ xfs_alloc_wq = alloc_workqueue("xfsalloc", WQ_MEM_RECLAIM, 0); if (!xfs_alloc_wq) - goto out_destroy_syncd; + return -ENOMEM; return 0; - -out_destroy_syncd: - destroy_workqueue(xfs_syncd_wq); - return -ENOMEM; } STATIC void xfs_destroy_workqueues(void) { destroy_workqueue(xfs_alloc_wq); - destroy_workqueue(xfs_syncd_wq); } STATIC int __init diff --git a/fs/xfs/xfs_sync.c b/fs/xfs/xfs_sync.c index 6a2ada3..15be21f 100644 --- a/fs/xfs/xfs_sync.c +++ b/fs/xfs/xfs_sync.c @@ -40,8 +40,6 @@ #include #include -struct workqueue_struct *xfs_syncd_wq; /* sync workqueue */ - /* * The inode lookup is done in batches to keep the amount of lock traffic and * radix tree lookups to a minimum. The batch size is a trade off between @@ -335,18 +333,18 @@ xfs_quiesce_attr( /* * Queue a new inode reclaim pass if there are reclaimable inodes and there * isn't a reclaim pass already in progress. By default it runs every 5s based - * on the xfs syncd work default of 30s. Perhaps this should have it's own + * on the xfs periodic sync default of 30s. Perhaps this should have it's own * tunable, but that can be done if this method proves to be ineffective or too * aggressive. */ static void -xfs_syncd_queue_reclaim( +xfs_reclaim_work_queue( struct xfs_mount *mp) { rcu_read_lock(); if (radix_tree_tagged(&mp->m_perag_tree, XFS_ICI_RECLAIM_TAG)) { - queue_delayed_work(xfs_syncd_wq, &mp->m_reclaim_work, + queue_delayed_work(mp->m_reclaim_workqueue, &mp->m_reclaim_work, msecs_to_jiffies(xfs_syncd_centisecs / 6 * 10)); } rcu_read_unlock(); @@ -367,7 +365,7 @@ xfs_reclaim_worker( struct xfs_mount, m_reclaim_work); xfs_reclaim_inodes(mp, SYNC_TRYLOCK); - xfs_syncd_queue_reclaim(mp); + xfs_reclaim_work_queue(mp); } void @@ -388,7 +386,7 @@ __xfs_inode_set_reclaim_tag( spin_unlock(&ip->i_mount->m_perag_lock); /* schedule periodic background inode reclaim */ - xfs_syncd_queue_reclaim(ip->i_mount); + xfs_reclaim_work_queue(ip->i_mount); trace_xfs_perag_set_reclaim(ip->i_mount, pag->pag_agno, -1, _RET_IP_); @@ -646,9 +644,9 @@ out: /* * We could return EAGAIN here to make reclaim rescan the inode tree in * a short while. However, this just burns CPU time scanning the tree - * waiting for IO to complete and xfssyncd never goes back to the idle - * state. Instead, return 0 to let the next scheduled background reclaim - * attempt to reclaim the inode again. + * waiting for IO to complete and the reclaim work never goes back to + * the idle state. Instead, return 0 to let the next scheduled + * background reclaim attempt to reclaim the inode again. */ return 0; } @@ -804,7 +802,7 @@ xfs_reclaim_inodes_nr( int nr_to_scan) { /* kick background reclaimer and push the AIL */ - xfs_syncd_queue_reclaim(mp); + xfs_reclaim_work_queue(mp); xfs_ail_push_all(mp->m_ail); xfs_reclaim_inodes_ag(mp, SYNC_TRYLOCK | SYNC_WAIT, &nr_to_scan); diff --git a/fs/xfs/xfs_sync.h b/fs/xfs/xfs_sync.h index 0018e84..0beabea 100644 --- a/fs/xfs/xfs_sync.h +++ b/fs/xfs/xfs_sync.h @@ -24,8 +24,6 @@ struct xfs_perag; #define SYNC_WAIT 0x0001 /* wait for i/o to complete */ #define SYNC_TRYLOCK 0x0002 /* only try to lock inodes */ -extern struct workqueue_struct *xfs_syncd_wq; /* sync workqueue */ - void xfs_reclaim_worker(struct work_struct *work); int xfs_quiesce_data(struct xfs_mount *mp); -- 1.7.10 From dave@fromorbit.com Thu Sep 27 23:44:10 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8S4iA96174951 for ; Thu, 27 Sep 2012 23:44:10 -0500 X-ASG-Debug-ID: 1348807523-04cb6c79445c3f0004-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id MbATEq57sBhLZTkE for ; Thu, 27 Sep 2012 21:45:27 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AowIAOsqZVB5LPfb/2dsb2JhbAA8CItfsiuBCYIgAQEFJy8zCBgxOQMbGYgEuDuLLQGGEQOSOIxthm+CeYFJ Received: from ppp121-44-247-219.lns20.syd7.internode.on.net (HELO dastard) ([121.44.247.219]) by ipmail04.adl6.internode.on.net with ESMTP; 28 Sep 2012 14:15:10 +0930 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1THSRV-0007Lm-Pi for xfs@oss.sgi.com; Fri, 28 Sep 2012 14:44:49 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1THSRV-0005H0-BY for xfs@oss.sgi.com; Fri, 28 Sep 2012 14:44:49 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 12/13] xfs: move inode locking functions to xfs_inode.c Date: Fri, 28 Sep 2012 14:44:44 +1000 X-ASG-Orig-Subj: [PATCH 12/13] xfs: move inode locking functions to xfs_inode.c Message-Id: <1348807485-20165-13-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10 In-Reply-To: <1348807485-20165-1-git-send-email-david@fromorbit.com> References: <1348807485-20165-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1348807527 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109794 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner xfs_ilock() and friends really aren't related to the inode cache in any way, so move them to xfs_inode.c with all the other inode related functionality. While doing this move, move the xfs_ilock() tracepoints to *before* the lock is taken so that when a hang on a lock occurs we have events to indicate which process and what inode we were trying to lock when the hang occurred. This is much better than the current silence we get on a hang... Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Reviewed-by: Mark Tinguely --- fs/xfs/xfs_iget.c | 251 ---------------------------------------------------- fs/xfs/xfs_inode.c | 250 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 250 insertions(+), 251 deletions(-) diff --git a/fs/xfs/xfs_iget.c b/fs/xfs/xfs_iget.c index 069c5ce..ea9a5fa 100644 --- a/fs/xfs/xfs_iget.c +++ b/fs/xfs/xfs_iget.c @@ -453,254 +453,3 @@ out_error_or_again: return error; } -/* - * This is a wrapper routine around the xfs_ilock() routine - * used to centralize some grungy code. It is used in places - * that wish to lock the inode solely for reading the extents. - * The reason these places can't just call xfs_ilock(SHARED) - * is that the inode lock also guards to bringing in of the - * extents from disk for a file in b-tree format. If the inode - * is in b-tree format, then we need to lock the inode exclusively - * until the extents are read in. Locking it exclusively all - * the time would limit our parallelism unnecessarily, though. - * What we do instead is check to see if the extents have been - * read in yet, and only lock the inode exclusively if they - * have not. - * - * The function returns a value which should be given to the - * corresponding xfs_iunlock_map_shared(). This value is - * the mode in which the lock was actually taken. - */ -uint -xfs_ilock_map_shared( - xfs_inode_t *ip) -{ - uint lock_mode; - - if ((ip->i_d.di_format == XFS_DINODE_FMT_BTREE) && - ((ip->i_df.if_flags & XFS_IFEXTENTS) == 0)) { - lock_mode = XFS_ILOCK_EXCL; - } else { - lock_mode = XFS_ILOCK_SHARED; - } - - xfs_ilock(ip, lock_mode); - - return lock_mode; -} - -/* - * This is simply the unlock routine to go with xfs_ilock_map_shared(). - * All it does is call xfs_iunlock() with the given lock_mode. - */ -void -xfs_iunlock_map_shared( - xfs_inode_t *ip, - unsigned int lock_mode) -{ - xfs_iunlock(ip, lock_mode); -} - -/* - * The xfs inode contains 2 locks: a multi-reader lock called the - * i_iolock and a multi-reader lock called the i_lock. This routine - * allows either or both of the locks to be obtained. - * - * The 2 locks should always be ordered so that the IO lock is - * obtained first in order to prevent deadlock. - * - * ip -- the inode being locked - * lock_flags -- this parameter indicates the inode's locks - * to be locked. It can be: - * XFS_IOLOCK_SHARED, - * XFS_IOLOCK_EXCL, - * XFS_ILOCK_SHARED, - * XFS_ILOCK_EXCL, - * XFS_IOLOCK_SHARED | XFS_ILOCK_SHARED, - * XFS_IOLOCK_SHARED | XFS_ILOCK_EXCL, - * XFS_IOLOCK_EXCL | XFS_ILOCK_SHARED, - * XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL - */ -void -xfs_ilock( - xfs_inode_t *ip, - uint lock_flags) -{ - /* - * You can't set both SHARED and EXCL for the same lock, - * and only XFS_IOLOCK_SHARED, XFS_IOLOCK_EXCL, XFS_ILOCK_SHARED, - * and XFS_ILOCK_EXCL are valid values to set in lock_flags. - */ - ASSERT((lock_flags & (XFS_IOLOCK_SHARED | XFS_IOLOCK_EXCL)) != - (XFS_IOLOCK_SHARED | XFS_IOLOCK_EXCL)); - ASSERT((lock_flags & (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)) != - (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)); - ASSERT((lock_flags & ~(XFS_LOCK_MASK | XFS_LOCK_DEP_MASK)) == 0); - - if (lock_flags & XFS_IOLOCK_EXCL) - mrupdate_nested(&ip->i_iolock, XFS_IOLOCK_DEP(lock_flags)); - else if (lock_flags & XFS_IOLOCK_SHARED) - mraccess_nested(&ip->i_iolock, XFS_IOLOCK_DEP(lock_flags)); - - if (lock_flags & XFS_ILOCK_EXCL) - mrupdate_nested(&ip->i_lock, XFS_ILOCK_DEP(lock_flags)); - else if (lock_flags & XFS_ILOCK_SHARED) - mraccess_nested(&ip->i_lock, XFS_ILOCK_DEP(lock_flags)); - - trace_xfs_ilock(ip, lock_flags, _RET_IP_); -} - -/* - * This is just like xfs_ilock(), except that the caller - * is guaranteed not to sleep. It returns 1 if it gets - * the requested locks and 0 otherwise. If the IO lock is - * obtained but the inode lock cannot be, then the IO lock - * is dropped before returning. - * - * ip -- the inode being locked - * lock_flags -- this parameter indicates the inode's locks to be - * to be locked. See the comment for xfs_ilock() for a list - * of valid values. - */ -int -xfs_ilock_nowait( - xfs_inode_t *ip, - uint lock_flags) -{ - /* - * You can't set both SHARED and EXCL for the same lock, - * and only XFS_IOLOCK_SHARED, XFS_IOLOCK_EXCL, XFS_ILOCK_SHARED, - * and XFS_ILOCK_EXCL are valid values to set in lock_flags. - */ - ASSERT((lock_flags & (XFS_IOLOCK_SHARED | XFS_IOLOCK_EXCL)) != - (XFS_IOLOCK_SHARED | XFS_IOLOCK_EXCL)); - ASSERT((lock_flags & (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)) != - (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)); - ASSERT((lock_flags & ~(XFS_LOCK_MASK | XFS_LOCK_DEP_MASK)) == 0); - - if (lock_flags & XFS_IOLOCK_EXCL) { - if (!mrtryupdate(&ip->i_iolock)) - goto out; - } else if (lock_flags & XFS_IOLOCK_SHARED) { - if (!mrtryaccess(&ip->i_iolock)) - goto out; - } - if (lock_flags & XFS_ILOCK_EXCL) { - if (!mrtryupdate(&ip->i_lock)) - goto out_undo_iolock; - } else if (lock_flags & XFS_ILOCK_SHARED) { - if (!mrtryaccess(&ip->i_lock)) - goto out_undo_iolock; - } - trace_xfs_ilock_nowait(ip, lock_flags, _RET_IP_); - return 1; - - out_undo_iolock: - if (lock_flags & XFS_IOLOCK_EXCL) - mrunlock_excl(&ip->i_iolock); - else if (lock_flags & XFS_IOLOCK_SHARED) - mrunlock_shared(&ip->i_iolock); - out: - return 0; -} - -/* - * xfs_iunlock() is used to drop the inode locks acquired with - * xfs_ilock() and xfs_ilock_nowait(). The caller must pass - * in the flags given to xfs_ilock() or xfs_ilock_nowait() so - * that we know which locks to drop. - * - * ip -- the inode being unlocked - * lock_flags -- this parameter indicates the inode's locks to be - * to be unlocked. See the comment for xfs_ilock() for a list - * of valid values for this parameter. - * - */ -void -xfs_iunlock( - xfs_inode_t *ip, - uint lock_flags) -{ - /* - * You can't set both SHARED and EXCL for the same lock, - * and only XFS_IOLOCK_SHARED, XFS_IOLOCK_EXCL, XFS_ILOCK_SHARED, - * and XFS_ILOCK_EXCL are valid values to set in lock_flags. - */ - ASSERT((lock_flags & (XFS_IOLOCK_SHARED | XFS_IOLOCK_EXCL)) != - (XFS_IOLOCK_SHARED | XFS_IOLOCK_EXCL)); - ASSERT((lock_flags & (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)) != - (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)); - ASSERT((lock_flags & ~(XFS_LOCK_MASK | XFS_LOCK_DEP_MASK)) == 0); - ASSERT(lock_flags != 0); - - if (lock_flags & XFS_IOLOCK_EXCL) - mrunlock_excl(&ip->i_iolock); - else if (lock_flags & XFS_IOLOCK_SHARED) - mrunlock_shared(&ip->i_iolock); - - if (lock_flags & XFS_ILOCK_EXCL) - mrunlock_excl(&ip->i_lock); - else if (lock_flags & XFS_ILOCK_SHARED) - mrunlock_shared(&ip->i_lock); - - trace_xfs_iunlock(ip, lock_flags, _RET_IP_); -} - -/* - * give up write locks. the i/o lock cannot be held nested - * if it is being demoted. - */ -void -xfs_ilock_demote( - xfs_inode_t *ip, - uint lock_flags) -{ - ASSERT(lock_flags & (XFS_IOLOCK_EXCL|XFS_ILOCK_EXCL)); - ASSERT((lock_flags & ~(XFS_IOLOCK_EXCL|XFS_ILOCK_EXCL)) == 0); - - if (lock_flags & XFS_ILOCK_EXCL) - mrdemote(&ip->i_lock); - if (lock_flags & XFS_IOLOCK_EXCL) - mrdemote(&ip->i_iolock); - - trace_xfs_ilock_demote(ip, lock_flags, _RET_IP_); -} - -#ifdef DEBUG -int -xfs_isilocked( - xfs_inode_t *ip, - uint lock_flags) -{ - if (lock_flags & (XFS_ILOCK_EXCL|XFS_ILOCK_SHARED)) { - if (!(lock_flags & XFS_ILOCK_SHARED)) - return !!ip->i_lock.mr_writer; - return rwsem_is_locked(&ip->i_lock.mr_lock); - } - - if (lock_flags & (XFS_IOLOCK_EXCL|XFS_IOLOCK_SHARED)) { - if (!(lock_flags & XFS_IOLOCK_SHARED)) - return !!ip->i_iolock.mr_writer; - return rwsem_is_locked(&ip->i_iolock.mr_lock); - } - - ASSERT(0); - return 0; -} -#endif - -void -__xfs_iflock( - struct xfs_inode *ip) -{ - wait_queue_head_t *wq = bit_waitqueue(&ip->i_flags, __XFS_IFLOCK_BIT); - DEFINE_WAIT_BIT(wait, &ip->i_flags, __XFS_IFLOCK_BIT); - - do { - prepare_to_wait_exclusive(wq, &wait.wait, TASK_UNINTERRUPTIBLE); - if (xfs_isiflocked(ip)) - io_schedule(); - } while (!xfs_iflock_nowait(ip)); - - finish_wait(wq, &wait.wait); -} diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 2778258..ba404e4 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -74,6 +74,256 @@ xfs_get_extsz_hint( return 0; } +/* + * This is a wrapper routine around the xfs_ilock() routine used to centralize + * some grungy code. It is used in places that wish to lock the inode solely + * for reading the extents. The reason these places can't just call + * xfs_ilock(SHARED) is that the inode lock also guards to bringing in of the + * extents from disk for a file in b-tree format. If the inode is in b-tree + * format, then we need to lock the inode exclusively until the extents are read + * in. Locking it exclusively all the time would limit our parallelism + * unnecessarily, though. What we do instead is check to see if the extents + * have been read in yet, and only lock the inode exclusively if they have not. + * + * The function returns a value which should be given to the corresponding + * xfs_iunlock_map_shared(). This value is the mode in which the lock was + * actually taken. + */ +uint +xfs_ilock_map_shared( + xfs_inode_t *ip) +{ + uint lock_mode; + + if ((ip->i_d.di_format == XFS_DINODE_FMT_BTREE) && + ((ip->i_df.if_flags & XFS_IFEXTENTS) == 0)) { + lock_mode = XFS_ILOCK_EXCL; + } else { + lock_mode = XFS_ILOCK_SHARED; + } + + xfs_ilock(ip, lock_mode); + + return lock_mode; +} + +/* + * This is simply the unlock routine to go with xfs_ilock_map_shared(). + * All it does is call xfs_iunlock() with the given lock_mode. + */ +void +xfs_iunlock_map_shared( + xfs_inode_t *ip, + unsigned int lock_mode) +{ + xfs_iunlock(ip, lock_mode); +} + +/* + * The xfs inode contains 2 locks: a multi-reader lock called the + * i_iolock and a multi-reader lock called the i_lock. This routine + * allows either or both of the locks to be obtained. + * + * The 2 locks should always be ordered so that the IO lock is + * obtained first in order to prevent deadlock. + * + * ip -- the inode being locked + * lock_flags -- this parameter indicates the inode's locks + * to be locked. It can be: + * XFS_IOLOCK_SHARED, + * XFS_IOLOCK_EXCL, + * XFS_ILOCK_SHARED, + * XFS_ILOCK_EXCL, + * XFS_IOLOCK_SHARED | XFS_ILOCK_SHARED, + * XFS_IOLOCK_SHARED | XFS_ILOCK_EXCL, + * XFS_IOLOCK_EXCL | XFS_ILOCK_SHARED, + * XFS_IOLOCK_EXCL | XFS_ILOCK_EXCL + */ +void +xfs_ilock( + xfs_inode_t *ip, + uint lock_flags) +{ + trace_xfs_ilock(ip, lock_flags, _RET_IP_); + + /* + * You can't set both SHARED and EXCL for the same lock, + * and only XFS_IOLOCK_SHARED, XFS_IOLOCK_EXCL, XFS_ILOCK_SHARED, + * and XFS_ILOCK_EXCL are valid values to set in lock_flags. + */ + ASSERT((lock_flags & (XFS_IOLOCK_SHARED | XFS_IOLOCK_EXCL)) != + (XFS_IOLOCK_SHARED | XFS_IOLOCK_EXCL)); + ASSERT((lock_flags & (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)) != + (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)); + ASSERT((lock_flags & ~(XFS_LOCK_MASK | XFS_LOCK_DEP_MASK)) == 0); + + if (lock_flags & XFS_IOLOCK_EXCL) + mrupdate_nested(&ip->i_iolock, XFS_IOLOCK_DEP(lock_flags)); + else if (lock_flags & XFS_IOLOCK_SHARED) + mraccess_nested(&ip->i_iolock, XFS_IOLOCK_DEP(lock_flags)); + + if (lock_flags & XFS_ILOCK_EXCL) + mrupdate_nested(&ip->i_lock, XFS_ILOCK_DEP(lock_flags)); + else if (lock_flags & XFS_ILOCK_SHARED) + mraccess_nested(&ip->i_lock, XFS_ILOCK_DEP(lock_flags)); +} + +/* + * This is just like xfs_ilock(), except that the caller + * is guaranteed not to sleep. It returns 1 if it gets + * the requested locks and 0 otherwise. If the IO lock is + * obtained but the inode lock cannot be, then the IO lock + * is dropped before returning. + * + * ip -- the inode being locked + * lock_flags -- this parameter indicates the inode's locks to be + * to be locked. See the comment for xfs_ilock() for a list + * of valid values. + */ +int +xfs_ilock_nowait( + xfs_inode_t *ip, + uint lock_flags) +{ + trace_xfs_ilock_nowait(ip, lock_flags, _RET_IP_); + + /* + * You can't set both SHARED and EXCL for the same lock, + * and only XFS_IOLOCK_SHARED, XFS_IOLOCK_EXCL, XFS_ILOCK_SHARED, + * and XFS_ILOCK_EXCL are valid values to set in lock_flags. + */ + ASSERT((lock_flags & (XFS_IOLOCK_SHARED | XFS_IOLOCK_EXCL)) != + (XFS_IOLOCK_SHARED | XFS_IOLOCK_EXCL)); + ASSERT((lock_flags & (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)) != + (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)); + ASSERT((lock_flags & ~(XFS_LOCK_MASK | XFS_LOCK_DEP_MASK)) == 0); + + if (lock_flags & XFS_IOLOCK_EXCL) { + if (!mrtryupdate(&ip->i_iolock)) + goto out; + } else if (lock_flags & XFS_IOLOCK_SHARED) { + if (!mrtryaccess(&ip->i_iolock)) + goto out; + } + if (lock_flags & XFS_ILOCK_EXCL) { + if (!mrtryupdate(&ip->i_lock)) + goto out_undo_iolock; + } else if (lock_flags & XFS_ILOCK_SHARED) { + if (!mrtryaccess(&ip->i_lock)) + goto out_undo_iolock; + } + return 1; + + out_undo_iolock: + if (lock_flags & XFS_IOLOCK_EXCL) + mrunlock_excl(&ip->i_iolock); + else if (lock_flags & XFS_IOLOCK_SHARED) + mrunlock_shared(&ip->i_iolock); + out: + return 0; +} + +/* + * xfs_iunlock() is used to drop the inode locks acquired with + * xfs_ilock() and xfs_ilock_nowait(). The caller must pass + * in the flags given to xfs_ilock() or xfs_ilock_nowait() so + * that we know which locks to drop. + * + * ip -- the inode being unlocked + * lock_flags -- this parameter indicates the inode's locks to be + * to be unlocked. See the comment for xfs_ilock() for a list + * of valid values for this parameter. + * + */ +void +xfs_iunlock( + xfs_inode_t *ip, + uint lock_flags) +{ + /* + * You can't set both SHARED and EXCL for the same lock, + * and only XFS_IOLOCK_SHARED, XFS_IOLOCK_EXCL, XFS_ILOCK_SHARED, + * and XFS_ILOCK_EXCL are valid values to set in lock_flags. + */ + ASSERT((lock_flags & (XFS_IOLOCK_SHARED | XFS_IOLOCK_EXCL)) != + (XFS_IOLOCK_SHARED | XFS_IOLOCK_EXCL)); + ASSERT((lock_flags & (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)) != + (XFS_ILOCK_SHARED | XFS_ILOCK_EXCL)); + ASSERT((lock_flags & ~(XFS_LOCK_MASK | XFS_LOCK_DEP_MASK)) == 0); + ASSERT(lock_flags != 0); + + if (lock_flags & XFS_IOLOCK_EXCL) + mrunlock_excl(&ip->i_iolock); + else if (lock_flags & XFS_IOLOCK_SHARED) + mrunlock_shared(&ip->i_iolock); + + if (lock_flags & XFS_ILOCK_EXCL) + mrunlock_excl(&ip->i_lock); + else if (lock_flags & XFS_ILOCK_SHARED) + mrunlock_shared(&ip->i_lock); + + trace_xfs_iunlock(ip, lock_flags, _RET_IP_); +} + +/* + * give up write locks. the i/o lock cannot be held nested + * if it is being demoted. + */ +void +xfs_ilock_demote( + xfs_inode_t *ip, + uint lock_flags) +{ + ASSERT(lock_flags & (XFS_IOLOCK_EXCL|XFS_ILOCK_EXCL)); + ASSERT((lock_flags & ~(XFS_IOLOCK_EXCL|XFS_ILOCK_EXCL)) == 0); + + if (lock_flags & XFS_ILOCK_EXCL) + mrdemote(&ip->i_lock); + if (lock_flags & XFS_IOLOCK_EXCL) + mrdemote(&ip->i_iolock); + + trace_xfs_ilock_demote(ip, lock_flags, _RET_IP_); +} + +#ifdef DEBUG +int +xfs_isilocked( + xfs_inode_t *ip, + uint lock_flags) +{ + if (lock_flags & (XFS_ILOCK_EXCL|XFS_ILOCK_SHARED)) { + if (!(lock_flags & XFS_ILOCK_SHARED)) + return !!ip->i_lock.mr_writer; + return rwsem_is_locked(&ip->i_lock.mr_lock); + } + + if (lock_flags & (XFS_IOLOCK_EXCL|XFS_IOLOCK_SHARED)) { + if (!(lock_flags & XFS_IOLOCK_SHARED)) + return !!ip->i_iolock.mr_writer; + return rwsem_is_locked(&ip->i_iolock.mr_lock); + } + + ASSERT(0); + return 0; +} +#endif + +void +__xfs_iflock( + struct xfs_inode *ip) +{ + wait_queue_head_t *wq = bit_waitqueue(&ip->i_flags, __XFS_IFLOCK_BIT); + DEFINE_WAIT_BIT(wait, &ip->i_flags, __XFS_IFLOCK_BIT); + + do { + prepare_to_wait_exclusive(wq, &wait.wait, TASK_UNINTERRUPTIBLE); + if (xfs_isiflocked(ip)) + io_schedule(); + } while (!xfs_iflock_nowait(ip)); + + finish_wait(wq, &wait.wait); +} + #ifdef DEBUG /* * Make sure that the extents in the given memory buffer -- 1.7.10 From dave@fromorbit.com Thu Sep 27 23:44:11 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_66 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8S4iBlV174970 for ; Thu, 27 Sep 2012 23:44:11 -0500 X-ASG-Debug-ID: 1348807519-04cbb069c25e620006-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id Z4U8SBxvSLEFqlfX for ; Thu, 27 Sep 2012 21:45:28 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ao0IAOsqZVB5LPfb/2dsb2JhbAA8CItfsiuBCYIgAQEFGg0vMwgYMTkDGxmIBLg7iy4GhgsDnyWGb4J5gUk Received: from ppp121-44-247-219.lns20.syd7.internode.on.net (HELO dastard) ([121.44.247.219]) by ipmail04.adl6.internode.on.net with ESMTP; 28 Sep 2012 14:15:10 +0930 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1THSRf-0007Lo-Qz for xfs@oss.sgi.com; Fri, 28 Sep 2012 14:44:59 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1THSRV-0005H4-CZ for xfs@oss.sgi.com; Fri, 28 Sep 2012 14:44:49 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 13/13] xfs: remove xfs_iget.c Date: Fri, 28 Sep 2012 14:44:45 +1000 X-ASG-Orig-Subj: [PATCH 13/13] xfs: remove xfs_iget.c Message-Id: <1348807485-20165-14-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10 In-Reply-To: <1348807485-20165-1-git-send-email-david@fromorbit.com> References: <1348807485-20165-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1348807527 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109794 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner The inode cache functions remaining in xfs_iget.c can be moved to xfs_icache.c along with the other inode cache functions. This removes all functionality from xfs_iget.c, so the file can simply be removed. This move results in various functions now only having the scope of a single file (e.g. xfs_inode_free()), so clean up all the definitions and exported prototypes in xfs_icache.[ch] and xfs_inode.h appropriately. Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Reviewed-by: Mark Tinguely --- fs/xfs/Makefile | 1 - fs/xfs/xfs_export.c | 1 + fs/xfs/xfs_icache.c | 421 +++++++++++++++++++++++++++++++++++++++++- fs/xfs/xfs_icache.h | 6 +- fs/xfs/xfs_iget.c | 455 ---------------------------------------------- fs/xfs/xfs_inode.c | 1 + fs/xfs/xfs_inode.h | 10 +- fs/xfs/xfs_itable.c | 1 + fs/xfs/xfs_log_recover.c | 1 + fs/xfs/xfs_qm.c | 1 + fs/xfs/xfs_rtalloc.c | 1 + fs/xfs/xfs_vnodeops.c | 1 + 12 files changed, 430 insertions(+), 470 deletions(-) delete mode 100644 fs/xfs/xfs_iget.c diff --git a/fs/xfs/Makefile b/fs/xfs/Makefile index 442f256..e65357b 100644 --- a/fs/xfs/Makefile +++ b/fs/xfs/Makefile @@ -40,7 +40,6 @@ xfs-y += xfs_aops.o \ xfs_fs_subr.o \ xfs_globals.o \ xfs_icache.o \ - xfs_iget.o \ xfs_ioctl.o \ xfs_iomap.o \ xfs_iops.o \ diff --git a/fs/xfs/xfs_export.c b/fs/xfs/xfs_export.c index 4267922..9b6e330 100644 --- a/fs/xfs/xfs_export.c +++ b/fs/xfs/xfs_export.c @@ -29,6 +29,7 @@ #include "xfs_inode.h" #include "xfs_inode_item.h" #include "xfs_trace.h" +#include "xfs_icache.h" /* * Note that we only accept fileids which are long enough rather than allow diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c index eba216f..9c8703b 100644 --- a/fs/xfs/xfs_icache.c +++ b/fs/xfs/xfs_icache.c @@ -41,6 +41,421 @@ #include #include +STATIC void __xfs_inode_clear_reclaim_tag(struct xfs_mount *mp, + struct xfs_perag *pag, struct xfs_inode *ip); + +/* + * Allocate and initialise an xfs_inode. + */ +STATIC struct xfs_inode * +xfs_inode_alloc( + struct xfs_mount *mp, + xfs_ino_t ino) +{ + struct xfs_inode *ip; + + /* + * if this didn't occur in transactions, we could use + * KM_MAYFAIL and return NULL here on ENOMEM. Set the + * code up to do this anyway. + */ + ip = kmem_zone_alloc(xfs_inode_zone, KM_SLEEP); + if (!ip) + return NULL; + if (inode_init_always(mp->m_super, VFS_I(ip))) { + kmem_zone_free(xfs_inode_zone, ip); + return NULL; + } + + ASSERT(atomic_read(&ip->i_pincount) == 0); + ASSERT(!spin_is_locked(&ip->i_flags_lock)); + ASSERT(!xfs_isiflocked(ip)); + ASSERT(ip->i_ino == 0); + + mrlock_init(&ip->i_iolock, MRLOCK_BARRIER, "xfsio", ip->i_ino); + + /* initialise the xfs inode */ + ip->i_ino = ino; + ip->i_mount = mp; + memset(&ip->i_imap, 0, sizeof(struct xfs_imap)); + ip->i_afp = NULL; + memset(&ip->i_df, 0, sizeof(xfs_ifork_t)); + ip->i_flags = 0; + ip->i_delayed_blks = 0; + memset(&ip->i_d, 0, sizeof(xfs_icdinode_t)); + + return ip; +} + +STATIC void +xfs_inode_free_callback( + struct rcu_head *head) +{ + struct inode *inode = container_of(head, struct inode, i_rcu); + struct xfs_inode *ip = XFS_I(inode); + + kmem_zone_free(xfs_inode_zone, ip); +} + +STATIC void +xfs_inode_free( + struct xfs_inode *ip) +{ + switch (ip->i_d.di_mode & S_IFMT) { + case S_IFREG: + case S_IFDIR: + case S_IFLNK: + xfs_idestroy_fork(ip, XFS_DATA_FORK); + break; + } + + if (ip->i_afp) + xfs_idestroy_fork(ip, XFS_ATTR_FORK); + + if (ip->i_itemp) { + ASSERT(!(ip->i_itemp->ili_item.li_flags & XFS_LI_IN_AIL)); + xfs_inode_item_destroy(ip); + ip->i_itemp = NULL; + } + + /* asserts to verify all state is correct here */ + ASSERT(atomic_read(&ip->i_pincount) == 0); + ASSERT(!spin_is_locked(&ip->i_flags_lock)); + ASSERT(!xfs_isiflocked(ip)); + + /* + * Because we use RCU freeing we need to ensure the inode always + * appears to be reclaimed with an invalid inode number when in the + * free state. The ip->i_flags_lock provides the barrier against lookup + * races. + */ + spin_lock(&ip->i_flags_lock); + ip->i_flags = XFS_IRECLAIM; + ip->i_ino = 0; + spin_unlock(&ip->i_flags_lock); + + call_rcu(&VFS_I(ip)->i_rcu, xfs_inode_free_callback); +} + +/* + * Check the validity of the inode we just found it the cache + */ +static int +xfs_iget_cache_hit( + struct xfs_perag *pag, + struct xfs_inode *ip, + xfs_ino_t ino, + int flags, + int lock_flags) __releases(RCU) +{ + struct inode *inode = VFS_I(ip); + struct xfs_mount *mp = ip->i_mount; + int error; + + /* + * check for re-use of an inode within an RCU grace period due to the + * radix tree nodes not being updated yet. We monitor for this by + * setting the inode number to zero before freeing the inode structure. + * If the inode has been reallocated and set up, then the inode number + * will not match, so check for that, too. + */ + spin_lock(&ip->i_flags_lock); + if (ip->i_ino != ino) { + trace_xfs_iget_skip(ip); + XFS_STATS_INC(xs_ig_frecycle); + error = EAGAIN; + goto out_error; + } + + + /* + * If we are racing with another cache hit that is currently + * instantiating this inode or currently recycling it out of + * reclaimabe state, wait for the initialisation to complete + * before continuing. + * + * XXX(hch): eventually we should do something equivalent to + * wait_on_inode to wait for these flags to be cleared + * instead of polling for it. + */ + if (ip->i_flags & (XFS_INEW|XFS_IRECLAIM)) { + trace_xfs_iget_skip(ip); + XFS_STATS_INC(xs_ig_frecycle); + error = EAGAIN; + goto out_error; + } + + /* + * If lookup is racing with unlink return an error immediately. + */ + if (ip->i_d.di_mode == 0 && !(flags & XFS_IGET_CREATE)) { + error = ENOENT; + goto out_error; + } + + /* + * If IRECLAIMABLE is set, we've torn down the VFS inode already. + * Need to carefully get it back into useable state. + */ + if (ip->i_flags & XFS_IRECLAIMABLE) { + trace_xfs_iget_reclaim(ip); + + /* + * We need to set XFS_IRECLAIM to prevent xfs_reclaim_inode + * from stomping over us while we recycle the inode. We can't + * clear the radix tree reclaimable tag yet as it requires + * pag_ici_lock to be held exclusive. + */ + ip->i_flags |= XFS_IRECLAIM; + + spin_unlock(&ip->i_flags_lock); + rcu_read_unlock(); + + error = -inode_init_always(mp->m_super, inode); + if (error) { + /* + * Re-initializing the inode failed, and we are in deep + * trouble. Try to re-add it to the reclaim list. + */ + rcu_read_lock(); + spin_lock(&ip->i_flags_lock); + + ip->i_flags &= ~(XFS_INEW | XFS_IRECLAIM); + ASSERT(ip->i_flags & XFS_IRECLAIMABLE); + trace_xfs_iget_reclaim_fail(ip); + goto out_error; + } + + spin_lock(&pag->pag_ici_lock); + spin_lock(&ip->i_flags_lock); + + /* + * Clear the per-lifetime state in the inode as we are now + * effectively a new inode and need to return to the initial + * state before reuse occurs. + */ + ip->i_flags &= ~XFS_IRECLAIM_RESET_FLAGS; + ip->i_flags |= XFS_INEW; + __xfs_inode_clear_reclaim_tag(mp, pag, ip); + inode->i_state = I_NEW; + + ASSERT(!rwsem_is_locked(&ip->i_iolock.mr_lock)); + mrlock_init(&ip->i_iolock, MRLOCK_BARRIER, "xfsio", ip->i_ino); + + spin_unlock(&ip->i_flags_lock); + spin_unlock(&pag->pag_ici_lock); + } else { + /* If the VFS inode is being torn down, pause and try again. */ + if (!igrab(inode)) { + trace_xfs_iget_skip(ip); + error = EAGAIN; + goto out_error; + } + + /* We've got a live one. */ + spin_unlock(&ip->i_flags_lock); + rcu_read_unlock(); + trace_xfs_iget_hit(ip); + } + + if (lock_flags != 0) + xfs_ilock(ip, lock_flags); + + xfs_iflags_clear(ip, XFS_ISTALE | XFS_IDONTCACHE); + XFS_STATS_INC(xs_ig_found); + + return 0; + +out_error: + spin_unlock(&ip->i_flags_lock); + rcu_read_unlock(); + return error; +} + + +static int +xfs_iget_cache_miss( + struct xfs_mount *mp, + struct xfs_perag *pag, + xfs_trans_t *tp, + xfs_ino_t ino, + struct xfs_inode **ipp, + int flags, + int lock_flags) +{ + struct xfs_inode *ip; + int error; + xfs_agino_t agino = XFS_INO_TO_AGINO(mp, ino); + int iflags; + + ip = xfs_inode_alloc(mp, ino); + if (!ip) + return ENOMEM; + + error = xfs_iread(mp, tp, ip, flags); + if (error) + goto out_destroy; + + trace_xfs_iget_miss(ip); + + if ((ip->i_d.di_mode == 0) && !(flags & XFS_IGET_CREATE)) { + error = ENOENT; + goto out_destroy; + } + + /* + * Preload the radix tree so we can insert safely under the + * write spinlock. Note that we cannot sleep inside the preload + * region. Since we can be called from transaction context, don't + * recurse into the file system. + */ + if (radix_tree_preload(GFP_NOFS)) { + error = EAGAIN; + goto out_destroy; + } + + /* + * Because the inode hasn't been added to the radix-tree yet it can't + * be found by another thread, so we can do the non-sleeping lock here. + */ + if (lock_flags) { + if (!xfs_ilock_nowait(ip, lock_flags)) + BUG(); + } + + /* + * These values must be set before inserting the inode into the radix + * tree as the moment it is inserted a concurrent lookup (allowed by the + * RCU locking mechanism) can find it and that lookup must see that this + * is an inode currently under construction (i.e. that XFS_INEW is set). + * The ip->i_flags_lock that protects the XFS_INEW flag forms the + * memory barrier that ensures this detection works correctly at lookup + * time. + */ + iflags = XFS_INEW; + if (flags & XFS_IGET_DONTCACHE) + iflags |= XFS_IDONTCACHE; + ip->i_udquot = ip->i_gdquot = NULL; + xfs_iflags_set(ip, iflags); + + /* insert the new inode */ + spin_lock(&pag->pag_ici_lock); + error = radix_tree_insert(&pag->pag_ici_root, agino, ip); + if (unlikely(error)) { + WARN_ON(error != -EEXIST); + XFS_STATS_INC(xs_ig_dup); + error = EAGAIN; + goto out_preload_end; + } + spin_unlock(&pag->pag_ici_lock); + radix_tree_preload_end(); + + *ipp = ip; + return 0; + +out_preload_end: + spin_unlock(&pag->pag_ici_lock); + radix_tree_preload_end(); + if (lock_flags) + xfs_iunlock(ip, lock_flags); +out_destroy: + __destroy_inode(VFS_I(ip)); + xfs_inode_free(ip); + return error; +} + +/* + * Look up an inode by number in the given file system. + * The inode is looked up in the cache held in each AG. + * If the inode is found in the cache, initialise the vfs inode + * if necessary. + * + * If it is not in core, read it in from the file system's device, + * add it to the cache and initialise the vfs inode. + * + * The inode is locked according to the value of the lock_flags parameter. + * This flag parameter indicates how and if the inode's IO lock and inode lock + * should be taken. + * + * mp -- the mount point structure for the current file system. It points + * to the inode hash table. + * tp -- a pointer to the current transaction if there is one. This is + * simply passed through to the xfs_iread() call. + * ino -- the number of the inode desired. This is the unique identifier + * within the file system for the inode being requested. + * lock_flags -- flags indicating how to lock the inode. See the comment + * for xfs_ilock() for a list of valid values. + */ +int +xfs_iget( + xfs_mount_t *mp, + xfs_trans_t *tp, + xfs_ino_t ino, + uint flags, + uint lock_flags, + xfs_inode_t **ipp) +{ + xfs_inode_t *ip; + int error; + xfs_perag_t *pag; + xfs_agino_t agino; + + /* + * xfs_reclaim_inode() uses the ILOCK to ensure an inode + * doesn't get freed while it's being referenced during a + * radix tree traversal here. It assumes this function + * aqcuires only the ILOCK (and therefore it has no need to + * involve the IOLOCK in this synchronization). + */ + ASSERT((lock_flags & (XFS_IOLOCK_EXCL | XFS_IOLOCK_SHARED)) == 0); + + /* reject inode numbers outside existing AGs */ + if (!ino || XFS_INO_TO_AGNO(mp, ino) >= mp->m_sb.sb_agcount) + return EINVAL; + + /* get the perag structure and ensure that it's inode capable */ + pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, ino)); + agino = XFS_INO_TO_AGINO(mp, ino); + +again: + error = 0; + rcu_read_lock(); + ip = radix_tree_lookup(&pag->pag_ici_root, agino); + + if (ip) { + error = xfs_iget_cache_hit(pag, ip, ino, flags, lock_flags); + if (error) + goto out_error_or_again; + } else { + rcu_read_unlock(); + XFS_STATS_INC(xs_ig_missed); + + error = xfs_iget_cache_miss(mp, pag, tp, ino, &ip, + flags, lock_flags); + if (error) + goto out_error_or_again; + } + xfs_perag_put(pag); + + *ipp = ip; + + /* + * If we have a real type for an on-disk inode, we can set ops(&unlock) + * now. If it's a new inode being created, xfs_ialloc will handle it. + */ + if (xfs_iflags_test(ip, XFS_INEW) && ip->i_d.di_mode != 0) + xfs_setup_inode(ip); + return 0; + +out_error_or_again: + if (error == EAGAIN) { + delay(1); + goto again; + } + xfs_perag_put(pag); + return error; +} + /* * The inode lookup is done in batches to keep the amount of lock traffic and * radix tree lookups to a minimum. The batch size is a trade off between @@ -253,7 +668,7 @@ xfs_reclaim_worker( xfs_reclaim_work_queue(mp); } -void +static void __xfs_inode_set_reclaim_tag( struct xfs_perag *pag, struct xfs_inode *ip) @@ -319,7 +734,7 @@ __xfs_inode_clear_reclaim( } } -void +STATIC void __xfs_inode_clear_reclaim_tag( xfs_mount_t *mp, xfs_perag_t *pag, @@ -542,7 +957,7 @@ out: * then a shut down during filesystem unmount reclaim walk leak all the * unreclaimed inodes. */ -int +STATIC int xfs_reclaim_inodes_ag( struct xfs_mount *mp, int flags, diff --git a/fs/xfs/xfs_icache.h b/fs/xfs/xfs_icache.h index 0ba9c89..222e22f 100644 --- a/fs/xfs/xfs_icache.h +++ b/fs/xfs/xfs_icache.h @@ -24,6 +24,9 @@ struct xfs_perag; #define SYNC_WAIT 0x0001 /* wait for i/o to complete */ #define SYNC_TRYLOCK 0x0002 /* only try to lock inodes */ +int xfs_iget(struct xfs_mount *mp, struct xfs_trans *tp, xfs_ino_t ino, + uint flags, uint lock_flags, xfs_inode_t **ipp); + void xfs_reclaim_worker(struct work_struct *work); int xfs_reclaim_inodes(struct xfs_mount *mp, int mode); @@ -31,9 +34,6 @@ int xfs_reclaim_inodes_count(struct xfs_mount *mp); void xfs_reclaim_inodes_nr(struct xfs_mount *mp, int nr_to_scan); void xfs_inode_set_reclaim_tag(struct xfs_inode *ip); -void __xfs_inode_set_reclaim_tag(struct xfs_perag *pag, struct xfs_inode *ip); -void __xfs_inode_clear_reclaim_tag(struct xfs_mount *mp, struct xfs_perag *pag, - struct xfs_inode *ip); int xfs_sync_inode_grab(struct xfs_inode *ip); int xfs_inode_ag_iterator(struct xfs_mount *mp, diff --git a/fs/xfs/xfs_iget.c b/fs/xfs/xfs_iget.c deleted file mode 100644 index ea9a5fa..0000000 --- a/fs/xfs/xfs_iget.c +++ /dev/null @@ -1,455 +0,0 @@ -/* - * Copyright (c) 2000-2005 Silicon Graphics, Inc. - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it would be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#include "xfs.h" -#include "xfs_fs.h" -#include "xfs_types.h" -#include "xfs_acl.h" -#include "xfs_log.h" -#include "xfs_inum.h" -#include "xfs_trans.h" -#include "xfs_sb.h" -#include "xfs_ag.h" -#include "xfs_mount.h" -#include "xfs_bmap_btree.h" -#include "xfs_alloc_btree.h" -#include "xfs_ialloc_btree.h" -#include "xfs_dinode.h" -#include "xfs_inode.h" -#include "xfs_btree.h" -#include "xfs_ialloc.h" -#include "xfs_quota.h" -#include "xfs_utils.h" -#include "xfs_trans_priv.h" -#include "xfs_inode_item.h" -#include "xfs_bmap.h" -#include "xfs_trace.h" -#include "xfs_icache.h" - - -/* - * Allocate and initialise an xfs_inode. - */ -STATIC struct xfs_inode * -xfs_inode_alloc( - struct xfs_mount *mp, - xfs_ino_t ino) -{ - struct xfs_inode *ip; - - /* - * if this didn't occur in transactions, we could use - * KM_MAYFAIL and return NULL here on ENOMEM. Set the - * code up to do this anyway. - */ - ip = kmem_zone_alloc(xfs_inode_zone, KM_SLEEP); - if (!ip) - return NULL; - if (inode_init_always(mp->m_super, VFS_I(ip))) { - kmem_zone_free(xfs_inode_zone, ip); - return NULL; - } - - ASSERT(atomic_read(&ip->i_pincount) == 0); - ASSERT(!spin_is_locked(&ip->i_flags_lock)); - ASSERT(!xfs_isiflocked(ip)); - ASSERT(ip->i_ino == 0); - - mrlock_init(&ip->i_iolock, MRLOCK_BARRIER, "xfsio", ip->i_ino); - - /* initialise the xfs inode */ - ip->i_ino = ino; - ip->i_mount = mp; - memset(&ip->i_imap, 0, sizeof(struct xfs_imap)); - ip->i_afp = NULL; - memset(&ip->i_df, 0, sizeof(xfs_ifork_t)); - ip->i_flags = 0; - ip->i_delayed_blks = 0; - memset(&ip->i_d, 0, sizeof(xfs_icdinode_t)); - - return ip; -} - -STATIC void -xfs_inode_free_callback( - struct rcu_head *head) -{ - struct inode *inode = container_of(head, struct inode, i_rcu); - struct xfs_inode *ip = XFS_I(inode); - - kmem_zone_free(xfs_inode_zone, ip); -} - -void -xfs_inode_free( - struct xfs_inode *ip) -{ - switch (ip->i_d.di_mode & S_IFMT) { - case S_IFREG: - case S_IFDIR: - case S_IFLNK: - xfs_idestroy_fork(ip, XFS_DATA_FORK); - break; - } - - if (ip->i_afp) - xfs_idestroy_fork(ip, XFS_ATTR_FORK); - - if (ip->i_itemp) { - ASSERT(!(ip->i_itemp->ili_item.li_flags & XFS_LI_IN_AIL)); - xfs_inode_item_destroy(ip); - ip->i_itemp = NULL; - } - - /* asserts to verify all state is correct here */ - ASSERT(atomic_read(&ip->i_pincount) == 0); - ASSERT(!spin_is_locked(&ip->i_flags_lock)); - ASSERT(!xfs_isiflocked(ip)); - - /* - * Because we use RCU freeing we need to ensure the inode always - * appears to be reclaimed with an invalid inode number when in the - * free state. The ip->i_flags_lock provides the barrier against lookup - * races. - */ - spin_lock(&ip->i_flags_lock); - ip->i_flags = XFS_IRECLAIM; - ip->i_ino = 0; - spin_unlock(&ip->i_flags_lock); - - call_rcu(&VFS_I(ip)->i_rcu, xfs_inode_free_callback); -} - -/* - * Check the validity of the inode we just found it the cache - */ -static int -xfs_iget_cache_hit( - struct xfs_perag *pag, - struct xfs_inode *ip, - xfs_ino_t ino, - int flags, - int lock_flags) __releases(RCU) -{ - struct inode *inode = VFS_I(ip); - struct xfs_mount *mp = ip->i_mount; - int error; - - /* - * check for re-use of an inode within an RCU grace period due to the - * radix tree nodes not being updated yet. We monitor for this by - * setting the inode number to zero before freeing the inode structure. - * If the inode has been reallocated and set up, then the inode number - * will not match, so check for that, too. - */ - spin_lock(&ip->i_flags_lock); - if (ip->i_ino != ino) { - trace_xfs_iget_skip(ip); - XFS_STATS_INC(xs_ig_frecycle); - error = EAGAIN; - goto out_error; - } - - - /* - * If we are racing with another cache hit that is currently - * instantiating this inode or currently recycling it out of - * reclaimabe state, wait for the initialisation to complete - * before continuing. - * - * XXX(hch): eventually we should do something equivalent to - * wait_on_inode to wait for these flags to be cleared - * instead of polling for it. - */ - if (ip->i_flags & (XFS_INEW|XFS_IRECLAIM)) { - trace_xfs_iget_skip(ip); - XFS_STATS_INC(xs_ig_frecycle); - error = EAGAIN; - goto out_error; - } - - /* - * If lookup is racing with unlink return an error immediately. - */ - if (ip->i_d.di_mode == 0 && !(flags & XFS_IGET_CREATE)) { - error = ENOENT; - goto out_error; - } - - /* - * If IRECLAIMABLE is set, we've torn down the VFS inode already. - * Need to carefully get it back into useable state. - */ - if (ip->i_flags & XFS_IRECLAIMABLE) { - trace_xfs_iget_reclaim(ip); - - /* - * We need to set XFS_IRECLAIM to prevent xfs_reclaim_inode - * from stomping over us while we recycle the inode. We can't - * clear the radix tree reclaimable tag yet as it requires - * pag_ici_lock to be held exclusive. - */ - ip->i_flags |= XFS_IRECLAIM; - - spin_unlock(&ip->i_flags_lock); - rcu_read_unlock(); - - error = -inode_init_always(mp->m_super, inode); - if (error) { - /* - * Re-initializing the inode failed, and we are in deep - * trouble. Try to re-add it to the reclaim list. - */ - rcu_read_lock(); - spin_lock(&ip->i_flags_lock); - - ip->i_flags &= ~(XFS_INEW | XFS_IRECLAIM); - ASSERT(ip->i_flags & XFS_IRECLAIMABLE); - trace_xfs_iget_reclaim_fail(ip); - goto out_error; - } - - spin_lock(&pag->pag_ici_lock); - spin_lock(&ip->i_flags_lock); - - /* - * Clear the per-lifetime state in the inode as we are now - * effectively a new inode and need to return to the initial - * state before reuse occurs. - */ - ip->i_flags &= ~XFS_IRECLAIM_RESET_FLAGS; - ip->i_flags |= XFS_INEW; - __xfs_inode_clear_reclaim_tag(mp, pag, ip); - inode->i_state = I_NEW; - - ASSERT(!rwsem_is_locked(&ip->i_iolock.mr_lock)); - mrlock_init(&ip->i_iolock, MRLOCK_BARRIER, "xfsio", ip->i_ino); - - spin_unlock(&ip->i_flags_lock); - spin_unlock(&pag->pag_ici_lock); - } else { - /* If the VFS inode is being torn down, pause and try again. */ - if (!igrab(inode)) { - trace_xfs_iget_skip(ip); - error = EAGAIN; - goto out_error; - } - - /* We've got a live one. */ - spin_unlock(&ip->i_flags_lock); - rcu_read_unlock(); - trace_xfs_iget_hit(ip); - } - - if (lock_flags != 0) - xfs_ilock(ip, lock_flags); - - xfs_iflags_clear(ip, XFS_ISTALE | XFS_IDONTCACHE); - XFS_STATS_INC(xs_ig_found); - - return 0; - -out_error: - spin_unlock(&ip->i_flags_lock); - rcu_read_unlock(); - return error; -} - - -static int -xfs_iget_cache_miss( - struct xfs_mount *mp, - struct xfs_perag *pag, - xfs_trans_t *tp, - xfs_ino_t ino, - struct xfs_inode **ipp, - int flags, - int lock_flags) -{ - struct xfs_inode *ip; - int error; - xfs_agino_t agino = XFS_INO_TO_AGINO(mp, ino); - int iflags; - - ip = xfs_inode_alloc(mp, ino); - if (!ip) - return ENOMEM; - - error = xfs_iread(mp, tp, ip, flags); - if (error) - goto out_destroy; - - trace_xfs_iget_miss(ip); - - if ((ip->i_d.di_mode == 0) && !(flags & XFS_IGET_CREATE)) { - error = ENOENT; - goto out_destroy; - } - - /* - * Preload the radix tree so we can insert safely under the - * write spinlock. Note that we cannot sleep inside the preload - * region. Since we can be called from transaction context, don't - * recurse into the file system. - */ - if (radix_tree_preload(GFP_NOFS)) { - error = EAGAIN; - goto out_destroy; - } - - /* - * Because the inode hasn't been added to the radix-tree yet it can't - * be found by another thread, so we can do the non-sleeping lock here. - */ - if (lock_flags) { - if (!xfs_ilock_nowait(ip, lock_flags)) - BUG(); - } - - /* - * These values must be set before inserting the inode into the radix - * tree as the moment it is inserted a concurrent lookup (allowed by the - * RCU locking mechanism) can find it and that lookup must see that this - * is an inode currently under construction (i.e. that XFS_INEW is set). - * The ip->i_flags_lock that protects the XFS_INEW flag forms the - * memory barrier that ensures this detection works correctly at lookup - * time. - */ - iflags = XFS_INEW; - if (flags & XFS_IGET_DONTCACHE) - iflags |= XFS_IDONTCACHE; - ip->i_udquot = ip->i_gdquot = NULL; - xfs_iflags_set(ip, iflags); - - /* insert the new inode */ - spin_lock(&pag->pag_ici_lock); - error = radix_tree_insert(&pag->pag_ici_root, agino, ip); - if (unlikely(error)) { - WARN_ON(error != -EEXIST); - XFS_STATS_INC(xs_ig_dup); - error = EAGAIN; - goto out_preload_end; - } - spin_unlock(&pag->pag_ici_lock); - radix_tree_preload_end(); - - *ipp = ip; - return 0; - -out_preload_end: - spin_unlock(&pag->pag_ici_lock); - radix_tree_preload_end(); - if (lock_flags) - xfs_iunlock(ip, lock_flags); -out_destroy: - __destroy_inode(VFS_I(ip)); - xfs_inode_free(ip); - return error; -} - -/* - * Look up an inode by number in the given file system. - * The inode is looked up in the cache held in each AG. - * If the inode is found in the cache, initialise the vfs inode - * if necessary. - * - * If it is not in core, read it in from the file system's device, - * add it to the cache and initialise the vfs inode. - * - * The inode is locked according to the value of the lock_flags parameter. - * This flag parameter indicates how and if the inode's IO lock and inode lock - * should be taken. - * - * mp -- the mount point structure for the current file system. It points - * to the inode hash table. - * tp -- a pointer to the current transaction if there is one. This is - * simply passed through to the xfs_iread() call. - * ino -- the number of the inode desired. This is the unique identifier - * within the file system for the inode being requested. - * lock_flags -- flags indicating how to lock the inode. See the comment - * for xfs_ilock() for a list of valid values. - */ -int -xfs_iget( - xfs_mount_t *mp, - xfs_trans_t *tp, - xfs_ino_t ino, - uint flags, - uint lock_flags, - xfs_inode_t **ipp) -{ - xfs_inode_t *ip; - int error; - xfs_perag_t *pag; - xfs_agino_t agino; - - /* - * xfs_reclaim_inode() uses the ILOCK to ensure an inode - * doesn't get freed while it's being referenced during a - * radix tree traversal here. It assumes this function - * aqcuires only the ILOCK (and therefore it has no need to - * involve the IOLOCK in this synchronization). - */ - ASSERT((lock_flags & (XFS_IOLOCK_EXCL | XFS_IOLOCK_SHARED)) == 0); - - /* reject inode numbers outside existing AGs */ - if (!ino || XFS_INO_TO_AGNO(mp, ino) >= mp->m_sb.sb_agcount) - return EINVAL; - - /* get the perag structure and ensure that it's inode capable */ - pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, ino)); - agino = XFS_INO_TO_AGINO(mp, ino); - -again: - error = 0; - rcu_read_lock(); - ip = radix_tree_lookup(&pag->pag_ici_root, agino); - - if (ip) { - error = xfs_iget_cache_hit(pag, ip, ino, flags, lock_flags); - if (error) - goto out_error_or_again; - } else { - rcu_read_unlock(); - XFS_STATS_INC(xs_ig_missed); - - error = xfs_iget_cache_miss(mp, pag, tp, ino, &ip, - flags, lock_flags); - if (error) - goto out_error_or_again; - } - xfs_perag_put(pag); - - *ipp = ip; - - /* - * If we have a real type for an on-disk inode, we can set ops(&unlock) - * now. If it's a new inode being created, xfs_ialloc will handle it. - */ - if (xfs_iflags_test(ip, XFS_INEW) && ip->i_d.di_mode != 0) - xfs_setup_inode(ip); - return 0; - -out_error_or_again: - if (error == EAGAIN) { - delay(1); - goto again; - } - xfs_perag_put(pag); - return error; -} - diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index ba404e4..bba8f37 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c @@ -45,6 +45,7 @@ #include "xfs_filestream.h" #include "xfs_vnodeops.h" #include "xfs_trace.h" +#include "xfs_icache.h" kmem_zone_t *xfs_ifork_zone; kmem_zone_t *xfs_inode_zone; diff --git a/fs/xfs/xfs_inode.h b/fs/xfs/xfs_inode.h index a12fe18..da69c18 100644 --- a/fs/xfs/xfs_inode.h +++ b/fs/xfs/xfs_inode.h @@ -506,11 +506,10 @@ static inline int xfs_isiflocked(struct xfs_inode *ip) (((pip)->i_mount->m_flags & XFS_MOUNT_GRPID) || \ ((pip)->i_d.di_mode & S_ISGID)) + /* - * xfs_iget.c prototypes. + * xfs_inode.c prototypes. */ -int xfs_iget(struct xfs_mount *, struct xfs_trans *, xfs_ino_t, - uint, uint, xfs_inode_t **); void xfs_ilock(xfs_inode_t *, uint); int xfs_ilock_nowait(xfs_inode_t *, uint); void xfs_iunlock(xfs_inode_t *, uint); @@ -518,11 +517,6 @@ void xfs_ilock_demote(xfs_inode_t *, uint); int xfs_isilocked(xfs_inode_t *, uint); uint xfs_ilock_map_shared(xfs_inode_t *); void xfs_iunlock_map_shared(xfs_inode_t *, uint); -void xfs_inode_free(struct xfs_inode *ip); - -/* - * xfs_inode.c prototypes. - */ int xfs_ialloc(struct xfs_trans *, xfs_inode_t *, umode_t, xfs_nlink_t, xfs_dev_t, prid_t, int, struct xfs_buf **, xfs_inode_t **); diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c index 01d10a6..3998fd2 100644 --- a/fs/xfs/xfs_itable.c +++ b/fs/xfs/xfs_itable.c @@ -34,6 +34,7 @@ #include "xfs_error.h" #include "xfs_btree.h" #include "xfs_trace.h" +#include "xfs_icache.h" STATIC int xfs_internal_inum( diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 5da3ace..651c988 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -42,6 +42,7 @@ #include "xfs_quota.h" #include "xfs_utils.h" #include "xfs_trace.h" +#include "xfs_icache.h" STATIC int xlog_find_zeroed( diff --git a/fs/xfs/xfs_qm.c b/fs/xfs/xfs_qm.c index 2e86fa0..48c750b 100644 --- a/fs/xfs/xfs_qm.c +++ b/fs/xfs/xfs_qm.c @@ -40,6 +40,7 @@ #include "xfs_utils.h" #include "xfs_qm.h" #include "xfs_trace.h" +#include "xfs_icache.h" /* * The global quota manager. There is only one of these for the entire diff --git a/fs/xfs/xfs_rtalloc.c b/fs/xfs/xfs_rtalloc.c index ca28a4b..a69e0b4 100644 --- a/fs/xfs/xfs_rtalloc.c +++ b/fs/xfs/xfs_rtalloc.c @@ -38,6 +38,7 @@ #include "xfs_utils.h" #include "xfs_trace.h" #include "xfs_buf.h" +#include "xfs_icache.h" /* diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c index 2a5c6373..e9cae13 100644 --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c @@ -47,6 +47,7 @@ #include "xfs_filestream.h" #include "xfs_vnodeops.h" #include "xfs_trace.h" +#include "xfs_icache.h" /* * The maximum pathlen is 1024 bytes. Since the minimum file system -- 1.7.10 From dave@fromorbit.com Thu Sep 27 23:44:10 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8S4iAtl174952 for ; Thu, 27 Sep 2012 23:44:10 -0500 X-ASG-Debug-ID: 1348807521-04cb6c79425c3e0004-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id NdLVh47Bdlbn7qCr for ; Thu, 27 Sep 2012 21:45:26 -0700 (PDT) X-Barracuda-Envelope-From: dave@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Ao0IAOsqZVB5LPfb/2dsb2JhbAA8CItfsiuBCYIgAQEFGgEMLxYdCBgxOQMbGRmHa7g7iy6GEQOSOIxthm+CeQ Received: from ppp121-44-247-219.lns20.syd7.internode.on.net (HELO dastard) ([121.44.247.219]) by ipmail04.adl6.internode.on.net with ESMTP; 28 Sep 2012 14:15:01 +0930 Received: from disappointment ([192.168.1.1]) by dastard with esmtp (Exim 4.76) (envelope-from ) id 1THSRV-0007Lj-On for xfs@oss.sgi.com; Fri, 28 Sep 2012 14:44:49 +1000 Received: from dave by disappointment with local (Exim 4.80) (envelope-from ) id 1THSRV-0005Gv-AU for xfs@oss.sgi.com; Fri, 28 Sep 2012 14:44:49 +1000 From: Dave Chinner To: xfs@oss.sgi.com Subject: [PATCH 11/13] xfs: rename xfs_sync.[ch] to xfs_icache.[ch] Date: Fri, 28 Sep 2012 14:44:43 +1000 X-ASG-Orig-Subj: [PATCH 11/13] xfs: rename xfs_sync.[ch] to xfs_icache.[ch] Message-Id: <1348807485-20165-12-git-send-email-david@fromorbit.com> X-Mailer: git-send-email 1.7.10 In-Reply-To: <1348807485-20165-1-git-send-email-david@fromorbit.com> References: <1348807485-20165-1-git-send-email-david@fromorbit.com> X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1348807526 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109794 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- From: Dave Chinner xfs_sync.c now only contains inode reclaim functions and inode cache iteration functions. It is not related to sync operations anymore. Rename to xfs_icache.c to reflect it's contents and prepare for consolidation with the other inode cache file that exists (xfs_iget.c). Signed-off-by: Dave Chinner Reviewed-by: Christoph Hellwig Reviewed-by: Mark Tinguely --- fs/xfs/Makefile | 2 +- fs/xfs/xfs_icache.c | 715 ++++++++++++++++++++++++++++++++++++++++++++++ fs/xfs/xfs_icache.h | 43 +++ fs/xfs/xfs_iget.c | 1 + fs/xfs/xfs_mount.c | 1 + fs/xfs/xfs_mount.h | 2 - fs/xfs/xfs_qm_syscalls.c | 1 + fs/xfs/xfs_super.c | 2 +- fs/xfs/xfs_sync.c | 714 --------------------------------------------- fs/xfs/xfs_sync.h | 43 --- 10 files changed, 763 insertions(+), 761 deletions(-) create mode 100644 fs/xfs/xfs_icache.c create mode 100644 fs/xfs/xfs_icache.h delete mode 100644 fs/xfs/xfs_sync.c delete mode 100644 fs/xfs/xfs_sync.h diff --git a/fs/xfs/Makefile b/fs/xfs/Makefile index d2bf974..442f256 100644 --- a/fs/xfs/Makefile +++ b/fs/xfs/Makefile @@ -39,6 +39,7 @@ xfs-y += xfs_aops.o \ xfs_fsops.o \ xfs_fs_subr.o \ xfs_globals.o \ + xfs_icache.o \ xfs_iget.o \ xfs_ioctl.o \ xfs_iomap.o \ @@ -47,7 +48,6 @@ xfs-y += xfs_aops.o \ xfs_message.o \ xfs_mru_cache.o \ xfs_super.o \ - xfs_sync.o \ xfs_xattr.o \ xfs_rename.o \ xfs_utils.o \ diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c new file mode 100644 index 0000000..eba216f --- /dev/null +++ b/fs/xfs/xfs_icache.c @@ -0,0 +1,715 @@ +/* + * Copyright (c) 2000-2005 Silicon Graphics, Inc. + * All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#include "xfs.h" +#include "xfs_fs.h" +#include "xfs_types.h" +#include "xfs_log.h" +#include "xfs_log_priv.h" +#include "xfs_inum.h" +#include "xfs_trans.h" +#include "xfs_trans_priv.h" +#include "xfs_sb.h" +#include "xfs_ag.h" +#include "xfs_mount.h" +#include "xfs_bmap_btree.h" +#include "xfs_inode.h" +#include "xfs_dinode.h" +#include "xfs_error.h" +#include "xfs_filestream.h" +#include "xfs_vnodeops.h" +#include "xfs_inode_item.h" +#include "xfs_quota.h" +#include "xfs_trace.h" +#include "xfs_fsops.h" +#include "xfs_icache.h" + +#include +#include + +/* + * The inode lookup is done in batches to keep the amount of lock traffic and + * radix tree lookups to a minimum. The batch size is a trade off between + * lookup reduction and stack usage. This is in the reclaim path, so we can't + * be too greedy. + */ +#define XFS_LOOKUP_BATCH 32 + +STATIC int +xfs_inode_ag_walk_grab( + struct xfs_inode *ip) +{ + struct inode *inode = VFS_I(ip); + + ASSERT(rcu_read_lock_held()); + + /* + * check for stale RCU freed inode + * + * If the inode has been reallocated, it doesn't matter if it's not in + * the AG we are walking - we are walking for writeback, so if it + * passes all the "valid inode" checks and is dirty, then we'll write + * it back anyway. If it has been reallocated and still being + * initialised, the XFS_INEW check below will catch it. + */ + spin_lock(&ip->i_flags_lock); + if (!ip->i_ino) + goto out_unlock_noent; + + /* avoid new or reclaimable inodes. Leave for reclaim code to flush */ + if (__xfs_iflags_test(ip, XFS_INEW | XFS_IRECLAIMABLE | XFS_IRECLAIM)) + goto out_unlock_noent; + spin_unlock(&ip->i_flags_lock); + + /* nothing to sync during shutdown */ + if (XFS_FORCED_SHUTDOWN(ip->i_mount)) + return EFSCORRUPTED; + + /* If we can't grab the inode, it must on it's way to reclaim. */ + if (!igrab(inode)) + return ENOENT; + + if (is_bad_inode(inode)) { + IRELE(ip); + return ENOENT; + } + + /* inode is valid */ + return 0; + +out_unlock_noent: + spin_unlock(&ip->i_flags_lock); + return ENOENT; +} + +STATIC int +xfs_inode_ag_walk( + struct xfs_mount *mp, + struct xfs_perag *pag, + int (*execute)(struct xfs_inode *ip, + struct xfs_perag *pag, int flags), + int flags) +{ + uint32_t first_index; + int last_error = 0; + int skipped; + int done; + int nr_found; + +restart: + done = 0; + skipped = 0; + first_index = 0; + nr_found = 0; + do { + struct xfs_inode *batch[XFS_LOOKUP_BATCH]; + int error = 0; + int i; + + rcu_read_lock(); + nr_found = radix_tree_gang_lookup(&pag->pag_ici_root, + (void **)batch, first_index, + XFS_LOOKUP_BATCH); + if (!nr_found) { + rcu_read_unlock(); + break; + } + + /* + * Grab the inodes before we drop the lock. if we found + * nothing, nr == 0 and the loop will be skipped. + */ + for (i = 0; i < nr_found; i++) { + struct xfs_inode *ip = batch[i]; + + if (done || xfs_inode_ag_walk_grab(ip)) + batch[i] = NULL; + + /* + * Update the index for the next lookup. Catch + * overflows into the next AG range which can occur if + * we have inodes in the last block of the AG and we + * are currently pointing to the last inode. + * + * Because we may see inodes that are from the wrong AG + * due to RCU freeing and reallocation, only update the + * index if it lies in this AG. It was a race that lead + * us to see this inode, so another lookup from the + * same index will not find it again. + */ + if (XFS_INO_TO_AGNO(mp, ip->i_ino) != pag->pag_agno) + continue; + first_index = XFS_INO_TO_AGINO(mp, ip->i_ino + 1); + if (first_index < XFS_INO_TO_AGINO(mp, ip->i_ino)) + done = 1; + } + + /* unlock now we've grabbed the inodes. */ + rcu_read_unlock(); + + for (i = 0; i < nr_found; i++) { + if (!batch[i]) + continue; + error = execute(batch[i], pag, flags); + IRELE(batch[i]); + if (error == EAGAIN) { + skipped++; + continue; + } + if (error && last_error != EFSCORRUPTED) + last_error = error; + } + + /* bail out if the filesystem is corrupted. */ + if (error == EFSCORRUPTED) + break; + + cond_resched(); + + } while (nr_found && !done); + + if (skipped) { + delay(1); + goto restart; + } + return last_error; +} + +int +xfs_inode_ag_iterator( + struct xfs_mount *mp, + int (*execute)(struct xfs_inode *ip, + struct xfs_perag *pag, int flags), + int flags) +{ + struct xfs_perag *pag; + int error = 0; + int last_error = 0; + xfs_agnumber_t ag; + + ag = 0; + while ((pag = xfs_perag_get(mp, ag))) { + ag = pag->pag_agno + 1; + error = xfs_inode_ag_walk(mp, pag, execute, flags); + xfs_perag_put(pag); + if (error) { + last_error = error; + if (error == EFSCORRUPTED) + break; + } + } + return XFS_ERROR(last_error); +} + +/* + * Queue a new inode reclaim pass if there are reclaimable inodes and there + * isn't a reclaim pass already in progress. By default it runs every 5s based + * on the xfs periodic sync default of 30s. Perhaps this should have it's own + * tunable, but that can be done if this method proves to be ineffective or too + * aggressive. + */ +static void +xfs_reclaim_work_queue( + struct xfs_mount *mp) +{ + + rcu_read_lock(); + if (radix_tree_tagged(&mp->m_perag_tree, XFS_ICI_RECLAIM_TAG)) { + queue_delayed_work(mp->m_reclaim_workqueue, &mp->m_reclaim_work, + msecs_to_jiffies(xfs_syncd_centisecs / 6 * 10)); + } + rcu_read_unlock(); +} + +/* + * This is a fast pass over the inode cache to try to get reclaim moving on as + * many inodes as possible in a short period of time. It kicks itself every few + * seconds, as well as being kicked by the inode cache shrinker when memory + * goes low. It scans as quickly as possible avoiding locked inodes or those + * already being flushed, and once done schedules a future pass. + */ +void +xfs_reclaim_worker( + struct work_struct *work) +{ + struct xfs_mount *mp = container_of(to_delayed_work(work), + struct xfs_mount, m_reclaim_work); + + xfs_reclaim_inodes(mp, SYNC_TRYLOCK); + xfs_reclaim_work_queue(mp); +} + +void +__xfs_inode_set_reclaim_tag( + struct xfs_perag *pag, + struct xfs_inode *ip) +{ + radix_tree_tag_set(&pag->pag_ici_root, + XFS_INO_TO_AGINO(ip->i_mount, ip->i_ino), + XFS_ICI_RECLAIM_TAG); + + if (!pag->pag_ici_reclaimable) { + /* propagate the reclaim tag up into the perag radix tree */ + spin_lock(&ip->i_mount->m_perag_lock); + radix_tree_tag_set(&ip->i_mount->m_perag_tree, + XFS_INO_TO_AGNO(ip->i_mount, ip->i_ino), + XFS_ICI_RECLAIM_TAG); + spin_unlock(&ip->i_mount->m_perag_lock); + + /* schedule periodic background inode reclaim */ + xfs_reclaim_work_queue(ip->i_mount); + + trace_xfs_perag_set_reclaim(ip->i_mount, pag->pag_agno, + -1, _RET_IP_); + } + pag->pag_ici_reclaimable++; +} + +/* + * We set the inode flag atomically with the radix tree tag. + * Once we get tag lookups on the radix tree, this inode flag + * can go away. + */ +void +xfs_inode_set_reclaim_tag( + xfs_inode_t *ip) +{ + struct xfs_mount *mp = ip->i_mount; + struct xfs_perag *pag; + + pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, ip->i_ino)); + spin_lock(&pag->pag_ici_lock); + spin_lock(&ip->i_flags_lock); + __xfs_inode_set_reclaim_tag(pag, ip); + __xfs_iflags_set(ip, XFS_IRECLAIMABLE); + spin_unlock(&ip->i_flags_lock); + spin_unlock(&pag->pag_ici_lock); + xfs_perag_put(pag); +} + +STATIC void +__xfs_inode_clear_reclaim( + xfs_perag_t *pag, + xfs_inode_t *ip) +{ + pag->pag_ici_reclaimable--; + if (!pag->pag_ici_reclaimable) { + /* clear the reclaim tag from the perag radix tree */ + spin_lock(&ip->i_mount->m_perag_lock); + radix_tree_tag_clear(&ip->i_mount->m_perag_tree, + XFS_INO_TO_AGNO(ip->i_mount, ip->i_ino), + XFS_ICI_RECLAIM_TAG); + spin_unlock(&ip->i_mount->m_perag_lock); + trace_xfs_perag_clear_reclaim(ip->i_mount, pag->pag_agno, + -1, _RET_IP_); + } +} + +void +__xfs_inode_clear_reclaim_tag( + xfs_mount_t *mp, + xfs_perag_t *pag, + xfs_inode_t *ip) +{ + radix_tree_tag_clear(&pag->pag_ici_root, + XFS_INO_TO_AGINO(mp, ip->i_ino), XFS_ICI_RECLAIM_TAG); + __xfs_inode_clear_reclaim(pag, ip); +} + +/* + * Grab the inode for reclaim exclusively. + * Return 0 if we grabbed it, non-zero otherwise. + */ +STATIC int +xfs_reclaim_inode_grab( + struct xfs_inode *ip, + int flags) +{ + ASSERT(rcu_read_lock_held()); + + /* quick check for stale RCU freed inode */ + if (!ip->i_ino) + return 1; + + /* + * If we are asked for non-blocking operation, do unlocked checks to + * see if the inode already is being flushed or in reclaim to avoid + * lock traffic. + */ + if ((flags & SYNC_TRYLOCK) && + __xfs_iflags_test(ip, XFS_IFLOCK | XFS_IRECLAIM)) + return 1; + + /* + * The radix tree lock here protects a thread in xfs_iget from racing + * with us starting reclaim on the inode. Once we have the + * XFS_IRECLAIM flag set it will not touch us. + * + * Due to RCU lookup, we may find inodes that have been freed and only + * have XFS_IRECLAIM set. Indeed, we may see reallocated inodes that + * aren't candidates for reclaim at all, so we must check the + * XFS_IRECLAIMABLE is set first before proceeding to reclaim. + */ + spin_lock(&ip->i_flags_lock); + if (!__xfs_iflags_test(ip, XFS_IRECLAIMABLE) || + __xfs_iflags_test(ip, XFS_IRECLAIM)) { + /* not a reclaim candidate. */ + spin_unlock(&ip->i_flags_lock); + return 1; + } + __xfs_iflags_set(ip, XFS_IRECLAIM); + spin_unlock(&ip->i_flags_lock); + return 0; +} + +/* + * Inodes in different states need to be treated differently. The following + * table lists the inode states and the reclaim actions necessary: + * + * inode state iflush ret required action + * --------------- ---------- --------------- + * bad - reclaim + * shutdown EIO unpin and reclaim + * clean, unpinned 0 reclaim + * stale, unpinned 0 reclaim + * clean, pinned(*) 0 requeue + * stale, pinned EAGAIN requeue + * dirty, async - requeue + * dirty, sync 0 reclaim + * + * (*) dgc: I don't think the clean, pinned state is possible but it gets + * handled anyway given the order of checks implemented. + * + * Also, because we get the flush lock first, we know that any inode that has + * been flushed delwri has had the flush completed by the time we check that + * the inode is clean. + * + * Note that because the inode is flushed delayed write by AIL pushing, the + * flush lock may already be held here and waiting on it can result in very + * long latencies. Hence for sync reclaims, where we wait on the flush lock, + * the caller should push the AIL first before trying to reclaim inodes to + * minimise the amount of time spent waiting. For background relaim, we only + * bother to reclaim clean inodes anyway. + * + * Hence the order of actions after gaining the locks should be: + * bad => reclaim + * shutdown => unpin and reclaim + * pinned, async => requeue + * pinned, sync => unpin + * stale => reclaim + * clean => reclaim + * dirty, async => requeue + * dirty, sync => flush, wait and reclaim + */ +STATIC int +xfs_reclaim_inode( + struct xfs_inode *ip, + struct xfs_perag *pag, + int sync_mode) +{ + struct xfs_buf *bp = NULL; + int error; + +restart: + error = 0; + xfs_ilock(ip, XFS_ILOCK_EXCL); + if (!xfs_iflock_nowait(ip)) { + if (!(sync_mode & SYNC_WAIT)) + goto out; + xfs_iflock(ip); + } + + if (is_bad_inode(VFS_I(ip))) + goto reclaim; + if (XFS_FORCED_SHUTDOWN(ip->i_mount)) { + xfs_iunpin_wait(ip); + xfs_iflush_abort(ip, false); + goto reclaim; + } + if (xfs_ipincount(ip)) { + if (!(sync_mode & SYNC_WAIT)) + goto out_ifunlock; + xfs_iunpin_wait(ip); + } + if (xfs_iflags_test(ip, XFS_ISTALE)) + goto reclaim; + if (xfs_inode_clean(ip)) + goto reclaim; + + /* + * Never flush out dirty data during non-blocking reclaim, as it would + * just contend with AIL pushing trying to do the same job. + */ + if (!(sync_mode & SYNC_WAIT)) + goto out_ifunlock; + + /* + * Now we have an inode that needs flushing. + * + * Note that xfs_iflush will never block on the inode buffer lock, as + * xfs_ifree_cluster() can lock the inode buffer before it locks the + * ip->i_lock, and we are doing the exact opposite here. As a result, + * doing a blocking xfs_imap_to_bp() to get the cluster buffer would + * result in an ABBA deadlock with xfs_ifree_cluster(). + * + * As xfs_ifree_cluser() must gather all inodes that are active in the + * cache to mark them stale, if we hit this case we don't actually want + * to do IO here - we want the inode marked stale so we can simply + * reclaim it. Hence if we get an EAGAIN error here, just unlock the + * inode, back off and try again. Hopefully the next pass through will + * see the stale flag set on the inode. + */ + error = xfs_iflush(ip, &bp); + if (error == EAGAIN) { + xfs_iunlock(ip, XFS_ILOCK_EXCL); + /* backoff longer than in xfs_ifree_cluster */ + delay(2); + goto restart; + } + + if (!error) { + error = xfs_bwrite(bp); + xfs_buf_relse(bp); + } + + xfs_iflock(ip); +reclaim: + xfs_ifunlock(ip); + xfs_iunlock(ip, XFS_ILOCK_EXCL); + + XFS_STATS_INC(xs_ig_reclaims); + /* + * Remove the inode from the per-AG radix tree. + * + * Because radix_tree_delete won't complain even if the item was never + * added to the tree assert that it's been there before to catch + * problems with the inode life time early on. + */ + spin_lock(&pag->pag_ici_lock); + if (!radix_tree_delete(&pag->pag_ici_root, + XFS_INO_TO_AGINO(ip->i_mount, ip->i_ino))) + ASSERT(0); + __xfs_inode_clear_reclaim(pag, ip); + spin_unlock(&pag->pag_ici_lock); + + /* + * Here we do an (almost) spurious inode lock in order to coordinate + * with inode cache radix tree lookups. This is because the lookup + * can reference the inodes in the cache without taking references. + * + * We make that OK here by ensuring that we wait until the inode is + * unlocked after the lookup before we go ahead and free it. + */ + xfs_ilock(ip, XFS_ILOCK_EXCL); + xfs_qm_dqdetach(ip); + xfs_iunlock(ip, XFS_ILOCK_EXCL); + + xfs_inode_free(ip); + return error; + +out_ifunlock: + xfs_ifunlock(ip); +out: + xfs_iflags_clear(ip, XFS_IRECLAIM); + xfs_iunlock(ip, XFS_ILOCK_EXCL); + /* + * We could return EAGAIN here to make reclaim rescan the inode tree in + * a short while. However, this just burns CPU time scanning the tree + * waiting for IO to complete and the reclaim work never goes back to + * the idle state. Instead, return 0 to let the next scheduled + * background reclaim attempt to reclaim the inode again. + */ + return 0; +} + +/* + * Walk the AGs and reclaim the inodes in them. Even if the filesystem is + * corrupted, we still want to try to reclaim all the inodes. If we don't, + * then a shut down during filesystem unmount reclaim walk leak all the + * unreclaimed inodes. + */ +int +xfs_reclaim_inodes_ag( + struct xfs_mount *mp, + int flags, + int *nr_to_scan) +{ + struct xfs_perag *pag; + int error = 0; + int last_error = 0; + xfs_agnumber_t ag; + int trylock = flags & SYNC_TRYLOCK; + int skipped; + +restart: + ag = 0; + skipped = 0; + while ((pag = xfs_perag_get_tag(mp, ag, XFS_ICI_RECLAIM_TAG))) { + unsigned long first_index = 0; + int done = 0; + int nr_found = 0; + + ag = pag->pag_agno + 1; + + if (trylock) { + if (!mutex_trylock(&pag->pag_ici_reclaim_lock)) { + skipped++; + xfs_perag_put(pag); + continue; + } + first_index = pag->pag_ici_reclaim_cursor; + } else + mutex_lock(&pag->pag_ici_reclaim_lock); + + do { + struct xfs_inode *batch[XFS_LOOKUP_BATCH]; + int i; + + rcu_read_lock(); + nr_found = radix_tree_gang_lookup_tag( + &pag->pag_ici_root, + (void **)batch, first_index, + XFS_LOOKUP_BATCH, + XFS_ICI_RECLAIM_TAG); + if (!nr_found) { + done = 1; + rcu_read_unlock(); + break; + } + + /* + * Grab the inodes before we drop the lock. if we found + * nothing, nr == 0 and the loop will be skipped. + */ + for (i = 0; i < nr_found; i++) { + struct xfs_inode *ip = batch[i]; + + if (done || xfs_reclaim_inode_grab(ip, flags)) + batch[i] = NULL; + + /* + * Update the index for the next lookup. Catch + * overflows into the next AG range which can + * occur if we have inodes in the last block of + * the AG and we are currently pointing to the + * last inode. + * + * Because we may see inodes that are from the + * wrong AG due to RCU freeing and + * reallocation, only update the index if it + * lies in this AG. It was a race that lead us + * to see this inode, so another lookup from + * the same index will not find it again. + */ + if (XFS_INO_TO_AGNO(mp, ip->i_ino) != + pag->pag_agno) + continue; + first_index = XFS_INO_TO_AGINO(mp, ip->i_ino + 1); + if (first_index < XFS_INO_TO_AGINO(mp, ip->i_ino)) + done = 1; + } + + /* unlock now we've grabbed the inodes. */ + rcu_read_unlock(); + + for (i = 0; i < nr_found; i++) { + if (!batch[i]) + continue; + error = xfs_reclaim_inode(batch[i], pag, flags); + if (error && last_error != EFSCORRUPTED) + last_error = error; + } + + *nr_to_scan -= XFS_LOOKUP_BATCH; + + cond_resched(); + + } while (nr_found && !done && *nr_to_scan > 0); + + if (trylock && !done) + pag->pag_ici_reclaim_cursor = first_index; + else + pag->pag_ici_reclaim_cursor = 0; + mutex_unlock(&pag->pag_ici_reclaim_lock); + xfs_perag_put(pag); + } + + /* + * if we skipped any AG, and we still have scan count remaining, do + * another pass this time using blocking reclaim semantics (i.e + * waiting on the reclaim locks and ignoring the reclaim cursors). This + * ensure that when we get more reclaimers than AGs we block rather + * than spin trying to execute reclaim. + */ + if (skipped && (flags & SYNC_WAIT) && *nr_to_scan > 0) { + trylock = 0; + goto restart; + } + return XFS_ERROR(last_error); +} + +int +xfs_reclaim_inodes( + xfs_mount_t *mp, + int mode) +{ + int nr_to_scan = INT_MAX; + + return xfs_reclaim_inodes_ag(mp, mode, &nr_to_scan); +} + +/* + * Scan a certain number of inodes for reclaim. + * + * When called we make sure that there is a background (fast) inode reclaim in + * progress, while we will throttle the speed of reclaim via doing synchronous + * reclaim of inodes. That means if we come across dirty inodes, we wait for + * them to be cleaned, which we hope will not be very long due to the + * background walker having already kicked the IO off on those dirty inodes. + */ +void +xfs_reclaim_inodes_nr( + struct xfs_mount *mp, + int nr_to_scan) +{ + /* kick background reclaimer and push the AIL */ + xfs_reclaim_work_queue(mp); + xfs_ail_push_all(mp->m_ail); + + xfs_reclaim_inodes_ag(mp, SYNC_TRYLOCK | SYNC_WAIT, &nr_to_scan); +} + +/* + * Return the number of reclaimable inodes in the filesystem for + * the shrinker to determine how much to reclaim. + */ +int +xfs_reclaim_inodes_count( + struct xfs_mount *mp) +{ + struct xfs_perag *pag; + xfs_agnumber_t ag = 0; + int reclaimable = 0; + + while ((pag = xfs_perag_get_tag(mp, ag, XFS_ICI_RECLAIM_TAG))) { + ag = pag->pag_agno + 1; + reclaimable += pag->pag_ici_reclaimable; + xfs_perag_put(pag); + } + return reclaimable; +} + diff --git a/fs/xfs/xfs_icache.h b/fs/xfs/xfs_icache.h new file mode 100644 index 0000000..0ba9c89 --- /dev/null +++ b/fs/xfs/xfs_icache.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2000-2006 Silicon Graphics, Inc. + * All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ +#ifndef XFS_SYNC_H +#define XFS_SYNC_H 1 + +struct xfs_mount; +struct xfs_perag; + +#define SYNC_WAIT 0x0001 /* wait for i/o to complete */ +#define SYNC_TRYLOCK 0x0002 /* only try to lock inodes */ + +void xfs_reclaim_worker(struct work_struct *work); + +int xfs_reclaim_inodes(struct xfs_mount *mp, int mode); +int xfs_reclaim_inodes_count(struct xfs_mount *mp); +void xfs_reclaim_inodes_nr(struct xfs_mount *mp, int nr_to_scan); + +void xfs_inode_set_reclaim_tag(struct xfs_inode *ip); +void __xfs_inode_set_reclaim_tag(struct xfs_perag *pag, struct xfs_inode *ip); +void __xfs_inode_clear_reclaim_tag(struct xfs_mount *mp, struct xfs_perag *pag, + struct xfs_inode *ip); + +int xfs_sync_inode_grab(struct xfs_inode *ip); +int xfs_inode_ag_iterator(struct xfs_mount *mp, + int (*execute)(struct xfs_inode *ip, struct xfs_perag *pag, int flags), + int flags); + +#endif diff --git a/fs/xfs/xfs_iget.c b/fs/xfs/xfs_iget.c index 784a803..069c5ce 100644 --- a/fs/xfs/xfs_iget.c +++ b/fs/xfs/xfs_iget.c @@ -38,6 +38,7 @@ #include "xfs_inode_item.h" #include "xfs_bmap.h" #include "xfs_trace.h" +#include "xfs_icache.h" /* diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 149b601..7dfbf07 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c @@ -42,6 +42,7 @@ #include "xfs_fsops.h" #include "xfs_utils.h" #include "xfs_trace.h" +#include "xfs_icache.h" #ifdef HAVE_PERCPU_SB diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 7c417b6..a631ca3 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h @@ -51,8 +51,6 @@ typedef struct xfs_trans_reservations { #else /* __KERNEL__ */ -#include "xfs_sync.h" - struct xlog; struct xfs_inode; struct xfs_mru_cache; diff --git a/fs/xfs/xfs_qm_syscalls.c b/fs/xfs/xfs_qm_syscalls.c index 858a3b1..7a9071f 100644 --- a/fs/xfs/xfs_qm_syscalls.c +++ b/fs/xfs/xfs_qm_syscalls.c @@ -40,6 +40,7 @@ #include "xfs_utils.h" #include "xfs_qm.h" #include "xfs_trace.h" +#include "xfs_icache.h" STATIC int xfs_qm_log_quotaoff(xfs_mount_t *, xfs_qoff_logitem_t **, uint); STATIC int xfs_qm_log_quotaoff_end(xfs_mount_t *, xfs_qoff_logitem_t *, diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 81de924..ce52520 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -49,7 +49,7 @@ #include "xfs_extfree_item.h" #include "xfs_mru_cache.h" #include "xfs_inode_item.h" -#include "xfs_sync.h" +#include "xfs_icache.h" #include "xfs_trace.h" #include diff --git a/fs/xfs/xfs_sync.c b/fs/xfs/xfs_sync.c deleted file mode 100644 index 7b63028..0000000 --- a/fs/xfs/xfs_sync.c +++ /dev/null @@ -1,714 +0,0 @@ -/* - * Copyright (c) 2000-2005 Silicon Graphics, Inc. - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it would be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#include "xfs.h" -#include "xfs_fs.h" -#include "xfs_types.h" -#include "xfs_log.h" -#include "xfs_log_priv.h" -#include "xfs_inum.h" -#include "xfs_trans.h" -#include "xfs_trans_priv.h" -#include "xfs_sb.h" -#include "xfs_ag.h" -#include "xfs_mount.h" -#include "xfs_bmap_btree.h" -#include "xfs_inode.h" -#include "xfs_dinode.h" -#include "xfs_error.h" -#include "xfs_filestream.h" -#include "xfs_vnodeops.h" -#include "xfs_inode_item.h" -#include "xfs_quota.h" -#include "xfs_trace.h" -#include "xfs_fsops.h" - -#include -#include - -/* - * The inode lookup is done in batches to keep the amount of lock traffic and - * radix tree lookups to a minimum. The batch size is a trade off between - * lookup reduction and stack usage. This is in the reclaim path, so we can't - * be too greedy. - */ -#define XFS_LOOKUP_BATCH 32 - -STATIC int -xfs_inode_ag_walk_grab( - struct xfs_inode *ip) -{ - struct inode *inode = VFS_I(ip); - - ASSERT(rcu_read_lock_held()); - - /* - * check for stale RCU freed inode - * - * If the inode has been reallocated, it doesn't matter if it's not in - * the AG we are walking - we are walking for writeback, so if it - * passes all the "valid inode" checks and is dirty, then we'll write - * it back anyway. If it has been reallocated and still being - * initialised, the XFS_INEW check below will catch it. - */ - spin_lock(&ip->i_flags_lock); - if (!ip->i_ino) - goto out_unlock_noent; - - /* avoid new or reclaimable inodes. Leave for reclaim code to flush */ - if (__xfs_iflags_test(ip, XFS_INEW | XFS_IRECLAIMABLE | XFS_IRECLAIM)) - goto out_unlock_noent; - spin_unlock(&ip->i_flags_lock); - - /* nothing to sync during shutdown */ - if (XFS_FORCED_SHUTDOWN(ip->i_mount)) - return EFSCORRUPTED; - - /* If we can't grab the inode, it must on it's way to reclaim. */ - if (!igrab(inode)) - return ENOENT; - - if (is_bad_inode(inode)) { - IRELE(ip); - return ENOENT; - } - - /* inode is valid */ - return 0; - -out_unlock_noent: - spin_unlock(&ip->i_flags_lock); - return ENOENT; -} - -STATIC int -xfs_inode_ag_walk( - struct xfs_mount *mp, - struct xfs_perag *pag, - int (*execute)(struct xfs_inode *ip, - struct xfs_perag *pag, int flags), - int flags) -{ - uint32_t first_index; - int last_error = 0; - int skipped; - int done; - int nr_found; - -restart: - done = 0; - skipped = 0; - first_index = 0; - nr_found = 0; - do { - struct xfs_inode *batch[XFS_LOOKUP_BATCH]; - int error = 0; - int i; - - rcu_read_lock(); - nr_found = radix_tree_gang_lookup(&pag->pag_ici_root, - (void **)batch, first_index, - XFS_LOOKUP_BATCH); - if (!nr_found) { - rcu_read_unlock(); - break; - } - - /* - * Grab the inodes before we drop the lock. if we found - * nothing, nr == 0 and the loop will be skipped. - */ - for (i = 0; i < nr_found; i++) { - struct xfs_inode *ip = batch[i]; - - if (done || xfs_inode_ag_walk_grab(ip)) - batch[i] = NULL; - - /* - * Update the index for the next lookup. Catch - * overflows into the next AG range which can occur if - * we have inodes in the last block of the AG and we - * are currently pointing to the last inode. - * - * Because we may see inodes that are from the wrong AG - * due to RCU freeing and reallocation, only update the - * index if it lies in this AG. It was a race that lead - * us to see this inode, so another lookup from the - * same index will not find it again. - */ - if (XFS_INO_TO_AGNO(mp, ip->i_ino) != pag->pag_agno) - continue; - first_index = XFS_INO_TO_AGINO(mp, ip->i_ino + 1); - if (first_index < XFS_INO_TO_AGINO(mp, ip->i_ino)) - done = 1; - } - - /* unlock now we've grabbed the inodes. */ - rcu_read_unlock(); - - for (i = 0; i < nr_found; i++) { - if (!batch[i]) - continue; - error = execute(batch[i], pag, flags); - IRELE(batch[i]); - if (error == EAGAIN) { - skipped++; - continue; - } - if (error && last_error != EFSCORRUPTED) - last_error = error; - } - - /* bail out if the filesystem is corrupted. */ - if (error == EFSCORRUPTED) - break; - - cond_resched(); - - } while (nr_found && !done); - - if (skipped) { - delay(1); - goto restart; - } - return last_error; -} - -int -xfs_inode_ag_iterator( - struct xfs_mount *mp, - int (*execute)(struct xfs_inode *ip, - struct xfs_perag *pag, int flags), - int flags) -{ - struct xfs_perag *pag; - int error = 0; - int last_error = 0; - xfs_agnumber_t ag; - - ag = 0; - while ((pag = xfs_perag_get(mp, ag))) { - ag = pag->pag_agno + 1; - error = xfs_inode_ag_walk(mp, pag, execute, flags); - xfs_perag_put(pag); - if (error) { - last_error = error; - if (error == EFSCORRUPTED) - break; - } - } - return XFS_ERROR(last_error); -} - -/* - * Queue a new inode reclaim pass if there are reclaimable inodes and there - * isn't a reclaim pass already in progress. By default it runs every 5s based - * on the xfs periodic sync default of 30s. Perhaps this should have it's own - * tunable, but that can be done if this method proves to be ineffective or too - * aggressive. - */ -static void -xfs_reclaim_work_queue( - struct xfs_mount *mp) -{ - - rcu_read_lock(); - if (radix_tree_tagged(&mp->m_perag_tree, XFS_ICI_RECLAIM_TAG)) { - queue_delayed_work(mp->m_reclaim_workqueue, &mp->m_reclaim_work, - msecs_to_jiffies(xfs_syncd_centisecs / 6 * 10)); - } - rcu_read_unlock(); -} - -/* - * This is a fast pass over the inode cache to try to get reclaim moving on as - * many inodes as possible in a short period of time. It kicks itself every few - * seconds, as well as being kicked by the inode cache shrinker when memory - * goes low. It scans as quickly as possible avoiding locked inodes or those - * already being flushed, and once done schedules a future pass. - */ -void -xfs_reclaim_worker( - struct work_struct *work) -{ - struct xfs_mount *mp = container_of(to_delayed_work(work), - struct xfs_mount, m_reclaim_work); - - xfs_reclaim_inodes(mp, SYNC_TRYLOCK); - xfs_reclaim_work_queue(mp); -} - -void -__xfs_inode_set_reclaim_tag( - struct xfs_perag *pag, - struct xfs_inode *ip) -{ - radix_tree_tag_set(&pag->pag_ici_root, - XFS_INO_TO_AGINO(ip->i_mount, ip->i_ino), - XFS_ICI_RECLAIM_TAG); - - if (!pag->pag_ici_reclaimable) { - /* propagate the reclaim tag up into the perag radix tree */ - spin_lock(&ip->i_mount->m_perag_lock); - radix_tree_tag_set(&ip->i_mount->m_perag_tree, - XFS_INO_TO_AGNO(ip->i_mount, ip->i_ino), - XFS_ICI_RECLAIM_TAG); - spin_unlock(&ip->i_mount->m_perag_lock); - - /* schedule periodic background inode reclaim */ - xfs_reclaim_work_queue(ip->i_mount); - - trace_xfs_perag_set_reclaim(ip->i_mount, pag->pag_agno, - -1, _RET_IP_); - } - pag->pag_ici_reclaimable++; -} - -/* - * We set the inode flag atomically with the radix tree tag. - * Once we get tag lookups on the radix tree, this inode flag - * can go away. - */ -void -xfs_inode_set_reclaim_tag( - xfs_inode_t *ip) -{ - struct xfs_mount *mp = ip->i_mount; - struct xfs_perag *pag; - - pag = xfs_perag_get(mp, XFS_INO_TO_AGNO(mp, ip->i_ino)); - spin_lock(&pag->pag_ici_lock); - spin_lock(&ip->i_flags_lock); - __xfs_inode_set_reclaim_tag(pag, ip); - __xfs_iflags_set(ip, XFS_IRECLAIMABLE); - spin_unlock(&ip->i_flags_lock); - spin_unlock(&pag->pag_ici_lock); - xfs_perag_put(pag); -} - -STATIC void -__xfs_inode_clear_reclaim( - xfs_perag_t *pag, - xfs_inode_t *ip) -{ - pag->pag_ici_reclaimable--; - if (!pag->pag_ici_reclaimable) { - /* clear the reclaim tag from the perag radix tree */ - spin_lock(&ip->i_mount->m_perag_lock); - radix_tree_tag_clear(&ip->i_mount->m_perag_tree, - XFS_INO_TO_AGNO(ip->i_mount, ip->i_ino), - XFS_ICI_RECLAIM_TAG); - spin_unlock(&ip->i_mount->m_perag_lock); - trace_xfs_perag_clear_reclaim(ip->i_mount, pag->pag_agno, - -1, _RET_IP_); - } -} - -void -__xfs_inode_clear_reclaim_tag( - xfs_mount_t *mp, - xfs_perag_t *pag, - xfs_inode_t *ip) -{ - radix_tree_tag_clear(&pag->pag_ici_root, - XFS_INO_TO_AGINO(mp, ip->i_ino), XFS_ICI_RECLAIM_TAG); - __xfs_inode_clear_reclaim(pag, ip); -} - -/* - * Grab the inode for reclaim exclusively. - * Return 0 if we grabbed it, non-zero otherwise. - */ -STATIC int -xfs_reclaim_inode_grab( - struct xfs_inode *ip, - int flags) -{ - ASSERT(rcu_read_lock_held()); - - /* quick check for stale RCU freed inode */ - if (!ip->i_ino) - return 1; - - /* - * If we are asked for non-blocking operation, do unlocked checks to - * see if the inode already is being flushed or in reclaim to avoid - * lock traffic. - */ - if ((flags & SYNC_TRYLOCK) && - __xfs_iflags_test(ip, XFS_IFLOCK | XFS_IRECLAIM)) - return 1; - - /* - * The radix tree lock here protects a thread in xfs_iget from racing - * with us starting reclaim on the inode. Once we have the - * XFS_IRECLAIM flag set it will not touch us. - * - * Due to RCU lookup, we may find inodes that have been freed and only - * have XFS_IRECLAIM set. Indeed, we may see reallocated inodes that - * aren't candidates for reclaim at all, so we must check the - * XFS_IRECLAIMABLE is set first before proceeding to reclaim. - */ - spin_lock(&ip->i_flags_lock); - if (!__xfs_iflags_test(ip, XFS_IRECLAIMABLE) || - __xfs_iflags_test(ip, XFS_IRECLAIM)) { - /* not a reclaim candidate. */ - spin_unlock(&ip->i_flags_lock); - return 1; - } - __xfs_iflags_set(ip, XFS_IRECLAIM); - spin_unlock(&ip->i_flags_lock); - return 0; -} - -/* - * Inodes in different states need to be treated differently. The following - * table lists the inode states and the reclaim actions necessary: - * - * inode state iflush ret required action - * --------------- ---------- --------------- - * bad - reclaim - * shutdown EIO unpin and reclaim - * clean, unpinned 0 reclaim - * stale, unpinned 0 reclaim - * clean, pinned(*) 0 requeue - * stale, pinned EAGAIN requeue - * dirty, async - requeue - * dirty, sync 0 reclaim - * - * (*) dgc: I don't think the clean, pinned state is possible but it gets - * handled anyway given the order of checks implemented. - * - * Also, because we get the flush lock first, we know that any inode that has - * been flushed delwri has had the flush completed by the time we check that - * the inode is clean. - * - * Note that because the inode is flushed delayed write by AIL pushing, the - * flush lock may already be held here and waiting on it can result in very - * long latencies. Hence for sync reclaims, where we wait on the flush lock, - * the caller should push the AIL first before trying to reclaim inodes to - * minimise the amount of time spent waiting. For background relaim, we only - * bother to reclaim clean inodes anyway. - * - * Hence the order of actions after gaining the locks should be: - * bad => reclaim - * shutdown => unpin and reclaim - * pinned, async => requeue - * pinned, sync => unpin - * stale => reclaim - * clean => reclaim - * dirty, async => requeue - * dirty, sync => flush, wait and reclaim - */ -STATIC int -xfs_reclaim_inode( - struct xfs_inode *ip, - struct xfs_perag *pag, - int sync_mode) -{ - struct xfs_buf *bp = NULL; - int error; - -restart: - error = 0; - xfs_ilock(ip, XFS_ILOCK_EXCL); - if (!xfs_iflock_nowait(ip)) { - if (!(sync_mode & SYNC_WAIT)) - goto out; - xfs_iflock(ip); - } - - if (is_bad_inode(VFS_I(ip))) - goto reclaim; - if (XFS_FORCED_SHUTDOWN(ip->i_mount)) { - xfs_iunpin_wait(ip); - xfs_iflush_abort(ip, false); - goto reclaim; - } - if (xfs_ipincount(ip)) { - if (!(sync_mode & SYNC_WAIT)) - goto out_ifunlock; - xfs_iunpin_wait(ip); - } - if (xfs_iflags_test(ip, XFS_ISTALE)) - goto reclaim; - if (xfs_inode_clean(ip)) - goto reclaim; - - /* - * Never flush out dirty data during non-blocking reclaim, as it would - * just contend with AIL pushing trying to do the same job. - */ - if (!(sync_mode & SYNC_WAIT)) - goto out_ifunlock; - - /* - * Now we have an inode that needs flushing. - * - * Note that xfs_iflush will never block on the inode buffer lock, as - * xfs_ifree_cluster() can lock the inode buffer before it locks the - * ip->i_lock, and we are doing the exact opposite here. As a result, - * doing a blocking xfs_imap_to_bp() to get the cluster buffer would - * result in an ABBA deadlock with xfs_ifree_cluster(). - * - * As xfs_ifree_cluser() must gather all inodes that are active in the - * cache to mark them stale, if we hit this case we don't actually want - * to do IO here - we want the inode marked stale so we can simply - * reclaim it. Hence if we get an EAGAIN error here, just unlock the - * inode, back off and try again. Hopefully the next pass through will - * see the stale flag set on the inode. - */ - error = xfs_iflush(ip, &bp); - if (error == EAGAIN) { - xfs_iunlock(ip, XFS_ILOCK_EXCL); - /* backoff longer than in xfs_ifree_cluster */ - delay(2); - goto restart; - } - - if (!error) { - error = xfs_bwrite(bp); - xfs_buf_relse(bp); - } - - xfs_iflock(ip); -reclaim: - xfs_ifunlock(ip); - xfs_iunlock(ip, XFS_ILOCK_EXCL); - - XFS_STATS_INC(xs_ig_reclaims); - /* - * Remove the inode from the per-AG radix tree. - * - * Because radix_tree_delete won't complain even if the item was never - * added to the tree assert that it's been there before to catch - * problems with the inode life time early on. - */ - spin_lock(&pag->pag_ici_lock); - if (!radix_tree_delete(&pag->pag_ici_root, - XFS_INO_TO_AGINO(ip->i_mount, ip->i_ino))) - ASSERT(0); - __xfs_inode_clear_reclaim(pag, ip); - spin_unlock(&pag->pag_ici_lock); - - /* - * Here we do an (almost) spurious inode lock in order to coordinate - * with inode cache radix tree lookups. This is because the lookup - * can reference the inodes in the cache without taking references. - * - * We make that OK here by ensuring that we wait until the inode is - * unlocked after the lookup before we go ahead and free it. - */ - xfs_ilock(ip, XFS_ILOCK_EXCL); - xfs_qm_dqdetach(ip); - xfs_iunlock(ip, XFS_ILOCK_EXCL); - - xfs_inode_free(ip); - return error; - -out_ifunlock: - xfs_ifunlock(ip); -out: - xfs_iflags_clear(ip, XFS_IRECLAIM); - xfs_iunlock(ip, XFS_ILOCK_EXCL); - /* - * We could return EAGAIN here to make reclaim rescan the inode tree in - * a short while. However, this just burns CPU time scanning the tree - * waiting for IO to complete and the reclaim work never goes back to - * the idle state. Instead, return 0 to let the next scheduled - * background reclaim attempt to reclaim the inode again. - */ - return 0; -} - -/* - * Walk the AGs and reclaim the inodes in them. Even if the filesystem is - * corrupted, we still want to try to reclaim all the inodes. If we don't, - * then a shut down during filesystem unmount reclaim walk leak all the - * unreclaimed inodes. - */ -int -xfs_reclaim_inodes_ag( - struct xfs_mount *mp, - int flags, - int *nr_to_scan) -{ - struct xfs_perag *pag; - int error = 0; - int last_error = 0; - xfs_agnumber_t ag; - int trylock = flags & SYNC_TRYLOCK; - int skipped; - -restart: - ag = 0; - skipped = 0; - while ((pag = xfs_perag_get_tag(mp, ag, XFS_ICI_RECLAIM_TAG))) { - unsigned long first_index = 0; - int done = 0; - int nr_found = 0; - - ag = pag->pag_agno + 1; - - if (trylock) { - if (!mutex_trylock(&pag->pag_ici_reclaim_lock)) { - skipped++; - xfs_perag_put(pag); - continue; - } - first_index = pag->pag_ici_reclaim_cursor; - } else - mutex_lock(&pag->pag_ici_reclaim_lock); - - do { - struct xfs_inode *batch[XFS_LOOKUP_BATCH]; - int i; - - rcu_read_lock(); - nr_found = radix_tree_gang_lookup_tag( - &pag->pag_ici_root, - (void **)batch, first_index, - XFS_LOOKUP_BATCH, - XFS_ICI_RECLAIM_TAG); - if (!nr_found) { - done = 1; - rcu_read_unlock(); - break; - } - - /* - * Grab the inodes before we drop the lock. if we found - * nothing, nr == 0 and the loop will be skipped. - */ - for (i = 0; i < nr_found; i++) { - struct xfs_inode *ip = batch[i]; - - if (done || xfs_reclaim_inode_grab(ip, flags)) - batch[i] = NULL; - - /* - * Update the index for the next lookup. Catch - * overflows into the next AG range which can - * occur if we have inodes in the last block of - * the AG and we are currently pointing to the - * last inode. - * - * Because we may see inodes that are from the - * wrong AG due to RCU freeing and - * reallocation, only update the index if it - * lies in this AG. It was a race that lead us - * to see this inode, so another lookup from - * the same index will not find it again. - */ - if (XFS_INO_TO_AGNO(mp, ip->i_ino) != - pag->pag_agno) - continue; - first_index = XFS_INO_TO_AGINO(mp, ip->i_ino + 1); - if (first_index < XFS_INO_TO_AGINO(mp, ip->i_ino)) - done = 1; - } - - /* unlock now we've grabbed the inodes. */ - rcu_read_unlock(); - - for (i = 0; i < nr_found; i++) { - if (!batch[i]) - continue; - error = xfs_reclaim_inode(batch[i], pag, flags); - if (error && last_error != EFSCORRUPTED) - last_error = error; - } - - *nr_to_scan -= XFS_LOOKUP_BATCH; - - cond_resched(); - - } while (nr_found && !done && *nr_to_scan > 0); - - if (trylock && !done) - pag->pag_ici_reclaim_cursor = first_index; - else - pag->pag_ici_reclaim_cursor = 0; - mutex_unlock(&pag->pag_ici_reclaim_lock); - xfs_perag_put(pag); - } - - /* - * if we skipped any AG, and we still have scan count remaining, do - * another pass this time using blocking reclaim semantics (i.e - * waiting on the reclaim locks and ignoring the reclaim cursors). This - * ensure that when we get more reclaimers than AGs we block rather - * than spin trying to execute reclaim. - */ - if (skipped && (flags & SYNC_WAIT) && *nr_to_scan > 0) { - trylock = 0; - goto restart; - } - return XFS_ERROR(last_error); -} - -int -xfs_reclaim_inodes( - xfs_mount_t *mp, - int mode) -{ - int nr_to_scan = INT_MAX; - - return xfs_reclaim_inodes_ag(mp, mode, &nr_to_scan); -} - -/* - * Scan a certain number of inodes for reclaim. - * - * When called we make sure that there is a background (fast) inode reclaim in - * progress, while we will throttle the speed of reclaim via doing synchronous - * reclaim of inodes. That means if we come across dirty inodes, we wait for - * them to be cleaned, which we hope will not be very long due to the - * background walker having already kicked the IO off on those dirty inodes. - */ -void -xfs_reclaim_inodes_nr( - struct xfs_mount *mp, - int nr_to_scan) -{ - /* kick background reclaimer and push the AIL */ - xfs_reclaim_work_queue(mp); - xfs_ail_push_all(mp->m_ail); - - xfs_reclaim_inodes_ag(mp, SYNC_TRYLOCK | SYNC_WAIT, &nr_to_scan); -} - -/* - * Return the number of reclaimable inodes in the filesystem for - * the shrinker to determine how much to reclaim. - */ -int -xfs_reclaim_inodes_count( - struct xfs_mount *mp) -{ - struct xfs_perag *pag; - xfs_agnumber_t ag = 0; - int reclaimable = 0; - - while ((pag = xfs_perag_get_tag(mp, ag, XFS_ICI_RECLAIM_TAG))) { - ag = pag->pag_agno + 1; - reclaimable += pag->pag_ici_reclaimable; - xfs_perag_put(pag); - } - return reclaimable; -} - diff --git a/fs/xfs/xfs_sync.h b/fs/xfs/xfs_sync.h deleted file mode 100644 index 0ba9c89..0000000 --- a/fs/xfs/xfs_sync.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (c) 2000-2006 Silicon Graphics, Inc. - * All Rights Reserved. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it would be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -#ifndef XFS_SYNC_H -#define XFS_SYNC_H 1 - -struct xfs_mount; -struct xfs_perag; - -#define SYNC_WAIT 0x0001 /* wait for i/o to complete */ -#define SYNC_TRYLOCK 0x0002 /* only try to lock inodes */ - -void xfs_reclaim_worker(struct work_struct *work); - -int xfs_reclaim_inodes(struct xfs_mount *mp, int mode); -int xfs_reclaim_inodes_count(struct xfs_mount *mp); -void xfs_reclaim_inodes_nr(struct xfs_mount *mp, int nr_to_scan); - -void xfs_inode_set_reclaim_tag(struct xfs_inode *ip); -void __xfs_inode_set_reclaim_tag(struct xfs_perag *pag, struct xfs_inode *ip); -void __xfs_inode_clear_reclaim_tag(struct xfs_mount *mp, struct xfs_perag *pag, - struct xfs_inode *ip); - -int xfs_sync_inode_grab(struct xfs_inode *ip); -int xfs_inode_ag_iterator(struct xfs_mount *mp, - int (*execute)(struct xfs_inode *ip, struct xfs_perag *pag, int flags), - int flags); - -#endif -- 1.7.10 From polesky@mail.ru Fri Sep 28 00:00:24 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.9 required=5.0 tests=BAYES_95,FREEMAIL_FROM, MIME_8BIT_HEADER,SUBJECT_NEEDS_ENCODING,SUBJ_ILLEGAL_CHARS, T_TO_NO_BRKTS_FREEMAIL autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8S50OO6178963 for ; Fri, 28 Sep 2012 00:00:24 -0500 X-ASG-Debug-ID: 1348808499-04cb6c79425cb70001-NocioJ Received: from dog.he.net (dog.he.net [72.52.121.2]) by cuda.sgi.com with SMTP id pppdLxdfaS7049BK for ; Thu, 27 Sep 2012 22:01:39 -0700 (PDT) X-Barracuda-Envelope-From: polesky@mail.ru X-Barracuda-Apparent-Source-IP: 72.52.121.2 Received: from dog.he.net ([127.0.0.9]) by dog.he.net for ; Thu, 27 Sep 2012 22:01:38 -0700 Message-Id: <1348808498.25721@dog.he.net> Date: Thu, 27 Sep 2012 22:01:38 -0700 To: xfs@oss.sgi.com Subject: ãîðÿ÷àÿ Àíýëÿ õî÷åò ïîùóïàòü âàñ!!!!! From: polesky@mail.ru X-ASG-Orig-Subj: ãîðÿ÷àÿ Àíýëÿ õî÷åò ïîùóïàòü âàñ!!!!! Content-type: text/plain; charset=windows-1251 X-Barracuda-Connect: dog.he.net[72.52.121.2] X-Barracuda-Start-Time: 1348808499 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 1.74 X-Barracuda-Spam-Status: No, SCORE=1.74 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=BSF_SC0_SA717, NO_REAL_NAME, PLING_PLING, SUBJECT_NEEDS_ENCODING X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109796 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.00 NO_REAL_NAME From: does not include a real name 1.28 SUBJECT_NEEDS_ENCODING SUBJECT_NEEDS_ENCODING 0.46 PLING_PLING Subject has lots of exclamation marks 0.00 BSF_SC0_SA717 Custom Rule BSF_SC0_SA717 http://url.az/bnv ãóáàñòàÿ Áåàòðèñà ðàçäâèãàåò íîãè äëÿ òåáÿ!!!!! From david@fromorbit.com Fri Sep 28 01:47:00 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8S6kx1h195509 for ; Fri, 28 Sep 2012 01:46:59 -0500 X-ASG-Debug-ID: 1348814897-04bdf0289b64a70001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id aH5p0IvJBEbfhgID for ; Thu, 27 Sep 2012 23:48:18 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqMMAI1HZVB5LPfb/2dsb2JhbABFvHgBAoESgQmCIAEBBTocIxAIAxguFCUDIROIBLhjFIsEb02EC2ADlWiJPYZvgnmBUQ Received: from ppp121-44-247-219.lns20.syd7.internode.on.net (HELO dastard) ([121.44.247.219]) by ipmail04.adl6.internode.on.net with ESMTP; 28 Sep 2012 16:17:43 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1THUMQ-0007ZS-Fy; Fri, 28 Sep 2012 16:47:42 +1000 Date: Fri, 28 Sep 2012 16:47:42 +1000 From: Dave Chinner To: Anand Tiwari Cc: Eric Sandeen , xfs@oss.sgi.com Subject: Re: xfs_repair deleting realtime files. Message-ID: <20120928064742.GE25626@dastard> X-ASG-Orig-Subj: Re: xfs_repair deleting realtime files. References: <505BF45D.5050909@sandeen.net> <20120924075551.GF20960@dastard> <20120926024403.GH29154@dastard> <20120926061732.GI29154@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1348814897 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109802 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Sep 27, 2012 at 07:27:16PM -0600, Anand Tiwari wrote: > On Wed, Sep 26, 2012 at 12:17 AM, Dave Chinner wrote: > > > On Tue, Sep 25, 2012 at 09:45:07PM -0600, Anand Tiwari wrote: > > > thanks Dave for prompt reply, I meant to implement option 2 as you > > > explained (option 3). I will start working on it tomorrow. In the mean > > > time, I also had to put something in xfs_repair for the files which > > > already exists on the disk. Would you guys willing to review/comment on > > > that ? > > > > Sure. > > > > Cheers, > > > > Dave. > > -- > > Dave Chinner > > david@fromorbit.com > > > > following are my changes for xfs_repair. my goal is to keep changes > minimum as they may not included in upstream. I had to do these changes as > we already have files with extent map not properly aligned. > As we know, this happens only when we are growing a file in a realtime > volume. by keeping this in mind, I am checking if start of a record in > extent map is not aligned, check previous record and if they are > contiguous, we can skip that part of record. > > let me know if you any issues with this or if someone has better approach. > I would like to use pointers for prev and irec but again, I wanted to keep > changes minimum > > thanks > anand > > > XFS currently can have records in extent map, which starts from unaligned > block w.r.t rextsize. > > -------------------------------------- > > xfs_repair considers this as a bug (multiple claims for a one real time > extent) and deletes the file. > This patch addresses the issue, by comparing current and previous records > and make sure they are > contiguous and not overlapped. > > diff --git a/repair/dinode.c b/repair/dinode.c > index 5a2da39..5537f1c 100644 > --- a/repair/dinode.c > +++ b/repair/dinode.c > @@ -406,6 +406,7 @@ verify_agbno(xfs_mount_t *mp, > static int > process_rt_rec( > xfs_mount_t *mp, > + xfs_bmbt_irec_t *prev, > xfs_bmbt_irec_t *irec, > xfs_ino_t ino, > xfs_drfsbno_t *tot, Your mailer has removed all the whitespace from the patch. The files Documentation/SubmittingPatches and Documentation/email-clients.txt for help with how to send patches sanely via email. ;) Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri Sep 28 01:58:00 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8S6w0oL196226 for ; Fri, 28 Sep 2012 01:58:00 -0500 X-ASG-Debug-ID: 1348815558-04bdf0289a64e30001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id KZMa62XSjH5TgOP7 for ; Thu, 27 Sep 2012 23:59:19 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqQMAOZJZVB5LPfb/2dsb2JhbABFvHgBAoESgQmCIAEBBScTHCMQCAMOCi4UJQMhE4gEuGEUiwRvTYQLYAOSOIMwkCyCeQ Received: from ppp121-44-247-219.lns20.syd7.internode.on.net (HELO dastard) ([121.44.247.219]) by ipmail04.adl6.internode.on.net with ESMTP; 28 Sep 2012 16:29:18 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1THUXd-0007c0-Nr; Fri, 28 Sep 2012 16:59:17 +1000 Date: Fri, 28 Sep 2012 16:59:17 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v4 3/8] xfs: create helper to check whether to free eofblocks on inode Message-ID: <20120928065917.GF25626@dastard> X-ASG-Orig-Subj: Re: [PATCH v4 3/8] xfs: create helper to check whether to free eofblocks on inode References: <1348767952-24229-1-git-send-email-bfoster@redhat.com> <1348767952-24229-4-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1348767952-24229-4-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1348815558 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.60 X-Barracuda-Spam-Status: No, SCORE=0.60 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MARKETING_SUBJECT X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109804 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.60 MARKETING_SUBJECT Subject contains popular marketing words On Thu, Sep 27, 2012 at 01:45:47PM -0400, Brian Foster wrote: > This check is used in multiple places to determine whether we > should check for (and potentially free) post EOF blocks on an > inode. Add a helper to consolidate the check. > > Note that when we remove an inode from the cache (xfs_inactive()), > we are required to trim post-EOF blocks even if the inode is marked > preallocated or append-only to maintain correct space accounting. > The 'force' parameter to xfs_can_free_eofblocks() specifies whether > we should ignore the prealloc/append-only status of the inode. > > Signed-off-by: Brian Foster .... > diff --git a/fs/xfs/xfs_vnodeops.h b/fs/xfs/xfs_vnodeops.h > index 447e146..d5701e3 100644 > --- a/fs/xfs/xfs_vnodeops.h > +++ b/fs/xfs/xfs_vnodeops.h > @@ -1,6 +1,10 @@ > #ifndef _XFS_VNODEOPS_H > #define _XFS_VNODEOPS_H 1 > > +#include "xfs_bmap_btree.h" > +#include "xfs_dinode.h" > +#include "xfs_inode.h" > + > struct attrlist_cursor_kern; > struct file; > struct iattr; Generally we try to avoid including XFS header files in XFS header files, and instead order the header files in the .c files appropriately. > @@ -9,8 +13,42 @@ struct iovec; > struct kiocb; > struct pipe_inode_info; > struct uio; > -struct xfs_inode; > > +/* > + * Test whether it is appropriate to check an inode for and free post EOF > + * blocks. The 'force' parameter determines whether we should also consider > + * regular files that are marked preallocated or append-only. > + */ > +static inline bool > +xfs_can_free_eofblocks(struct xfs_inode *ip, bool force) > +{ > + /* prealloc/delalloc exists only on regular files */ > + if (!S_ISREG(ip->i_d.di_mode)) > + return false; > + > + /* > + * Zero sized files with no cached pages and delalloc blocks will not > + * have speculative prealloc/delalloc blocks to remove. > + */ > + if (VFS_I(ip)->i_size == 0 && > + VN_CACHED(VFS_I(ip)) == 0 && > + ip->i_delayed_blks == 0) > + return false; > + > + /* If we haven't read in the extent list, then don't do it now. */ > + if (!(ip->i_df.if_flags & XFS_IFEXTENTS)) > + return false; > + > + /* > + * Do not free real preallocated or append-only files unless the file > + * has delalloc blocks and we are forced to remove them. > + */ > + if (ip->i_d.di_flags & (XFS_DIFLAG_PREALLOC | XFS_DIFLAG_APPEND)) > + if (!force || ip->i_delayed_blks == 0) > + return false; > + > + return true; > +} And I'd say that function is too large for a static inline function in a header file, so moving it to xfs_inode.c is probably appropriate. I know, I asked you to write it like this, but not looking at it for a couple weeks brings new persepctive ;) Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri Sep 28 01:59:34 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8S6xYan196390 for ; Fri, 28 Sep 2012 01:59:34 -0500 X-ASG-Debug-ID: 1348815653-04cb6c79415fe10001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id FIrJuBuwGBSKLAk7 for ; Fri, 28 Sep 2012 00:00:53 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqMMAOZJZVB5LPfb/2dsb2JhbABFvHgBAoESgQmCIAEBBTocIxAIAw4KLhQlAyETiAS4YRSLBG9NhGsDlWiJPYZvgnk Received: from ppp121-44-247-219.lns20.syd7.internode.on.net (HELO dastard) ([121.44.247.219]) by ipmail04.adl6.internode.on.net with ESMTP; 28 Sep 2012 16:30:52 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1THUZA-0007cT-96; Fri, 28 Sep 2012 17:00:52 +1000 Date: Fri, 28 Sep 2012 17:00:52 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v4 4/8] xfs: export xfs_free_eofblocks() and return EAGAIN on trylock failure Message-ID: <20120928070052.GG25626@dastard> X-ASG-Orig-Subj: Re: [PATCH v4 4/8] xfs: export xfs_free_eofblocks() and return EAGAIN on trylock failure References: <1348767952-24229-1-git-send-email-bfoster@redhat.com> <1348767952-24229-5-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1348767952-24229-5-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1348815653 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109804 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Sep 27, 2012 at 01:45:48PM -0400, Brian Foster wrote: > Turn xfs_free_eofblocks() into a non-static function, return EAGAIN to > indicate trylock failure and make sure this error is not propagated in > xfs_release(). You might want to change the title of the patch - "export" when talking about functions in kernel code has specific meaning i.e. EXPORT_SYMBOL() and that's different to making something non-static... Otherwise looks ok. Reviewed-by: Dave Chinner -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri Sep 28 02:02:44 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8S72ii5196711 for ; Fri, 28 Sep 2012 02:02:44 -0500 X-ASG-Debug-ID: 1348815842-04bdf0289d65010001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id im4ojcAM2IItR4G5 for ; Fri, 28 Sep 2012 00:04:02 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqQMAEhLZVB5LPfb/2dsb2JhbAA7Crx4AQKBEoEJgiABAQU6HCMQCAMOCi4UJQMhE4gEuFkUiwQQX02EawOVaJAsgnk Received: from ppp121-44-247-219.lns20.syd7.internode.on.net (HELO dastard) ([121.44.247.219]) by ipmail04.adl6.internode.on.net with ESMTP; 28 Sep 2012 16:34:02 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1THUcD-0007ct-KN; Fri, 28 Sep 2012 17:04:01 +1000 Date: Fri, 28 Sep 2012 17:04:01 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v4 1/8] xfs: add EOFBLOCKS inode tagging/untagging Message-ID: <20120928070401.GH25626@dastard> X-ASG-Orig-Subj: Re: [PATCH v4 1/8] xfs: add EOFBLOCKS inode tagging/untagging References: <1348767952-24229-1-git-send-email-bfoster@redhat.com> <1348767952-24229-2-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1348767952-24229-2-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1348815842 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109804 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Sep 27, 2012 at 01:45:45PM -0400, Brian Foster wrote: > Add the XFS_ICI_EOFBLOCKS_TAG inode tag to identify inodes with > speculatively preallocated blocks beyond EOF. An inode is tagged > when speculative preallocation occurs and untagged either via > truncate down or when post-EOF blocks are freed via release or > reclaim. > > The tag management is intentionally not aggressive to prefer > simplicity over the complexity of handling all the corner cases > under which post-EOF blocks could be freed (i.e., forward > truncation, fallocate, write error conditions, etc.). This means > that a tagged inode may or may not have post-EOF blocks after a > period of time. The tag is eventually cleared when the inode is > released or reclaimed. > > Signed-off-by: Brian Foster Apart from the fact this conflicts with my xfssyncd killing patchset and xfs_sync.c no longer exists, it looks fine. Can you rebase this on top of my patch series? Mostly it is simply making your changes to xfs_icache.c rather than xfs_sync.c as that's where all this inode cache radix tree walking code is now..... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri Sep 28 02:03:46 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8S73keY196838 for ; Fri, 28 Sep 2012 02:03:46 -0500 X-ASG-Debug-ID: 1348815904-04bdf0289c65090001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id SYsPtxJDW4X7GNrx for ; Fri, 28 Sep 2012 00:05:05 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqMMAEhLZVB5LPfb/2dsb2JhbABFvHgBAoESgQmCIAEBBTocIxAIAw4KLhQlAyETiAS4WRSLBG9NhGsDlWiJPYZvgnk Received: from ppp121-44-247-219.lns20.syd7.internode.on.net (HELO dastard) ([121.44.247.219]) by ipmail04.adl6.internode.on.net with ESMTP; 28 Sep 2012 16:35:04 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1THUdE-0007dU-1l; Fri, 28 Sep 2012 17:05:04 +1000 Date: Fri, 28 Sep 2012 17:05:04 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v4 2/8] xfs: support a tag-based inode_ag_iterator Message-ID: <20120928070503.GI25626@dastard> X-ASG-Orig-Subj: Re: [PATCH v4 2/8] xfs: support a tag-based inode_ag_iterator References: <1348767952-24229-1-git-send-email-bfoster@redhat.com> <1348767952-24229-3-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1348767952-24229-3-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1348815904 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109804 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Sep 27, 2012 at 01:45:46PM -0400, Brian Foster wrote: > Genericize xfs_inode_ag_walk() to support an optional radix tree tag > and args argument for the execute function. Create a new wrapper > called xfs_inode_ag_iterator_tag() that performs a tag based walk > of perag's and inodes. > > Signed-off-by: Brian Foster > --- > fs/xfs/xfs_qm_syscalls.c | 5 ++- > fs/xfs/xfs_sync.c | 61 +++++++++++++++++++++++++++++++++++++++------- > fs/xfs/xfs_sync.h | 7 ++++- > 3 files changed, 60 insertions(+), 13 deletions(-) Looks fine, but needs the same xfs_icache.c rebase... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri Sep 28 02:19:58 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8S7JvYL197937 for ; Fri, 28 Sep 2012 02:19:57 -0500 X-ASG-Debug-ID: 1348816876-04bdf0289b65970001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id nLh0agEU32l1OHHD for ; Fri, 28 Sep 2012 00:21:16 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqQMALVOZVB5LPfb/2dsb2JhbABEvHgBAoEQgQmCIAEBBScTHCMQCAMOCi4UJQMhE4gEuFYUiwRvTYRrA5VokCyCeQ Received: from ppp121-44-247-219.lns20.syd7.internode.on.net (HELO dastard) ([121.44.247.219]) by ipmail04.adl6.internode.on.net with ESMTP; 28 Sep 2012 16:51:15 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1THUsh-0007fA-2K; Fri, 28 Sep 2012 17:21:03 +1000 Date: Fri, 28 Sep 2012 17:21:03 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v4 5/8] xfs: create function to scan and clear EOFBLOCKS inodes Message-ID: <20120928072103.GJ25626@dastard> X-ASG-Orig-Subj: Re: [PATCH v4 5/8] xfs: create function to scan and clear EOFBLOCKS inodes References: <1348767952-24229-1-git-send-email-bfoster@redhat.com> <1348767952-24229-6-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1348767952-24229-6-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1348816876 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109806 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Sep 27, 2012 at 01:45:49PM -0400, Brian Foster wrote: > xfs_inodes_free_eofblocks() implements scanning functionality for > EOFBLOCKS inodes. It uses the AG iterator to walk the tagged inodes > and free post-EOF blocks via the xfs_inode_free_eofblocks() execute > function. The scan can be invoked in best-effort mode or wait > (force) mode. > > A best-effort scan (default) handles all inodes that do not have a > dirty cache and we successfully acquire the io lock via trylock. In > wait mode, we continue to cycle through an AG until all inodes are > handled. > > Signed-off-by: Brian Foster xfs_icache.c rebase, and... > --- > fs/xfs/xfs_sync.c | 40 ++++++++++++++++++++++++++++++++++++++++ > fs/xfs/xfs_sync.h | 1 + > fs/xfs/xfs_trace.h | 1 + > 3 files changed, 42 insertions(+), 0 deletions(-) > > diff --git a/fs/xfs/xfs_sync.c b/fs/xfs/xfs_sync.c > index 0da93c9..6854800 100644 > --- a/fs/xfs/xfs_sync.c > +++ b/fs/xfs/xfs_sync.c > @@ -1014,6 +1014,46 @@ xfs_reclaim_inodes_count( > return reclaimable; > } > > +STATIC int > +xfs_inode_free_eofblocks( > + struct xfs_inode *ip, > + struct xfs_perag *pag, > + int flags, > + void *args) > +{ > + int ret; > + bool force = flags & SYNC_WAIT; > + > + if (!xfs_can_free_eofblocks(ip, false)) { > + /* inode could be preallocated or append-only */ > + trace_xfs_inode_free_eofblocks_invalid(ip); > + xfs_inode_clear_eofblocks_tag(ip); > + return 0; > + } > + > + if (!force && mapping_tagged(VFS_I(ip)->i_mapping, > + PAGECACHE_TAG_DIRTY)) > + return 0; This reads rather strangely. I'd prefer that you don't use a "force" variable because we're not really "forcing" anything. SYNC_WAIT is telling us if we should block (wait) or not. i.e. /* * if the mapping is dirty the operation can block and wait * for some time. So unless we are waiting, skip it. */ if (!(flags & SYNC_WAIT) && (mapping_tagged(VFS_I(ip)->i_mapping, PAGECACHE_TAG_DIRTY)) return 0; makes more sense and is consistent with xfs_reclaim_inode() usage. > + ret = xfs_free_eofblocks(ip->i_mount, ip, true); > + > + /* ignore EAGAIN on a best effort scan */ > + if (!force && (ret == EAGAIN)) > + ret = 0; /* don't revisit the inode if we not waiting */ if (ret == EAGAIN && !(flags & SYNC_WAIT)) return 0; return ret; > + > + return ret; > +} > + > +int > +xfs_inodes_free_eofblocks( > + struct xfs_mount *mp, > + int flags) > +{ > + ASSERT((flags & ~(SYNC_TRYLOCK|SYNC_WAIT)) == 0); > + return xfs_inode_ag_iterator_tag(mp, xfs_inode_free_eofblocks, flags, > + NULL, XFS_ICI_EOFBLOCKS_TAG); > +} TWo functions very similarly named. Perhaps the latter would be better named xfs_icache_free_eofblocks() to indicate it is an inode cache operation, rather than an inode operation. Then at some point in another patch set we can rename xfs_reclaim_inodes* to xfs_icache_reclaim_* and xfs_inode_ag_iterator* to xfs_icache_iterator* and so one so that there is a clear naming difference between operations on the inode cache and individual inodes... Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri Sep 28 02:24:33 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8S7OXLG198271 for ; Fri, 28 Sep 2012 02:24:33 -0500 X-ASG-Debug-ID: 1348817151-04cbb069c262c80001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id EHxuTOpCxA3LdFo8 for ; Fri, 28 Sep 2012 00:25:52 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqMMADBQZVB5LPfb/2dsb2JhbABFvHgBAoEQgQmCIAEBBTocIxAIAw4KLhQlAyETiAS4UhSLBG9NhGsDlWiJPYZvgnk Received: from ppp121-44-247-219.lns20.syd7.internode.on.net (HELO dastard) ([121.44.247.219]) by ipmail04.adl6.internode.on.net with ESMTP; 28 Sep 2012 16:55:51 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1THUxK-0007fh-SN; Fri, 28 Sep 2012 17:25:50 +1000 Date: Fri, 28 Sep 2012 17:25:50 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v4 6/8] xfs: add XFS_IOC_FREE_EOFBLOCKS ioctl Message-ID: <20120928072550.GK25626@dastard> X-ASG-Orig-Subj: Re: [PATCH v4 6/8] xfs: add XFS_IOC_FREE_EOFBLOCKS ioctl References: <1348767952-24229-1-git-send-email-bfoster@redhat.com> <1348767952-24229-7-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1348767952-24229-7-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1348817151 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109806 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Sep 27, 2012 at 01:45:50PM -0400, Brian Foster wrote: > The XFS_IOC_FREE_EOFBLOCKS ioctl allows users to invoke an EOFBLOCKS > scan. The xfs_eofblocks structure is defined to support the command > parameters (scan mode). > > Signed-off-by: Brian Foster > --- > fs/xfs/xfs_fs.h | 14 ++++++++++++++ > fs/xfs/xfs_ioctl.c | 12 ++++++++++++ > 2 files changed, 26 insertions(+), 0 deletions(-) > > diff --git a/fs/xfs/xfs_fs.h b/fs/xfs/xfs_fs.h > index c13fed8..32bb2e8 100644 > --- a/fs/xfs/xfs_fs.h > +++ b/fs/xfs/xfs_fs.h > @@ -339,6 +339,19 @@ typedef struct xfs_error_injection { > > > /* > + * Speculative preallocation trimming. > + */ > +struct xfs_eofblocks { > + __u32 eof_flags; > + __s32 version; __u32 > + unsigned char pad[12]; > +}; > + > +/* eof_flags values */ > +#define XFS_EOF_FLAGS_FORCE 0x01 /* force/wait mode scan */ Might be better defined as XFS_EOF_FLAGS_SYNC as that is more consistent with what users see as a blocking operation that waits for completion to occur. Also, you need to define the structure version here as well (i.e. v1). > + > + > +/* > * The user-level Handle Request interface structure. > */ > typedef struct xfs_fsop_handlereq { > @@ -456,6 +469,7 @@ typedef struct xfs_handle { > /* XFS_IOC_GETBIOSIZE ---- deprecated 47 */ > #define XFS_IOC_GETBMAPX _IOWR('X', 56, struct getbmap) > #define XFS_IOC_ZERO_RANGE _IOW ('X', 57, struct xfs_flock64) > +#define XFS_IOC_FREE_EOFBLOCKS _IOR ('X', 58, struct xfs_eofblocks) > > /* > * ioctl commands that replace IRIX syssgi()'s > diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c > index 0e0232c..216ca7a 100644 > --- a/fs/xfs/xfs_ioctl.c > +++ b/fs/xfs/xfs_ioctl.c > @@ -1602,6 +1602,18 @@ xfs_file_ioctl( > error = xfs_errortag_clearall(mp, 1); > return -error; > > + case XFS_IOC_FREE_EOFBLOCKS: { > + struct xfs_eofblocks eofb; > + int flags; > + > + if (copy_from_user(&eofb, arg, sizeof(eofb))) > + return -XFS_ERROR(EFAULT); And check the version here, too. Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri Sep 28 02:52:13 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8S7qDkb200305 for ; Fri, 28 Sep 2012 02:52:13 -0500 X-ASG-Debug-ID: 1348818811-04cb6c794361f60001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id QxXjUCCWwVW56y2B for ; Fri, 28 Sep 2012 00:53:31 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqQMAA5WZVB5LPfb/2dsb2JhbABFvHgBAoEQgQmCIAEBBAEnExwjBQsIAw4KFhgUJQMhE4d/BQy4RQQUiwQcU02BRwyDGAOVaJAsgnmBSQEj Received: from ppp121-44-247-219.lns20.syd7.internode.on.net (HELO dastard) ([121.44.247.219]) by ipmail04.adl6.internode.on.net with ESMTP; 28 Sep 2012 17:23:30 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1THVO5-0007iv-R8; Fri, 28 Sep 2012 17:53:29 +1000 Date: Fri, 28 Sep 2012 17:53:29 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v4 7/8] xfs: add enhanced filtering to EOFBLOCKS scan Message-ID: <20120928075329.GL25626@dastard> X-ASG-Orig-Subj: Re: [PATCH v4 7/8] xfs: add enhanced filtering to EOFBLOCKS scan References: <1348767952-24229-1-git-send-email-bfoster@redhat.com> <1348767952-24229-8-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1348767952-24229-8-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1348818811 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109808 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Sep 27, 2012 at 01:45:51PM -0400, Brian Foster wrote: > Support EOFBLOCKS scan filtering by quota ID or minimum file size. > Add the appropriate fields/flags to the xfs_eofblocks structure and > pass it down to xfs_inode_free_eofblocks() where filtering > functionality is implemented. > > A (user requested) quota ID based scan requires the associated > quota mode be enabled. > > Signed-off-by: Brian Foster > --- > fs/xfs/xfs_fs.h | 9 +++++++++ > fs/xfs/xfs_ioctl.c | 10 +++++++++- > fs/xfs/xfs_sync.c | 30 ++++++++++++++++++++++++++---- > fs/xfs/xfs_sync.h | 2 +- > 4 files changed, 45 insertions(+), 6 deletions(-) > > diff --git a/fs/xfs/xfs_fs.h b/fs/xfs/xfs_fs.h > index 32bb2e8..54c0f39 100644 > --- a/fs/xfs/xfs_fs.h > +++ b/fs/xfs/xfs_fs.h > @@ -343,12 +343,21 @@ typedef struct xfs_error_injection { > */ > struct xfs_eofblocks { > __u32 eof_flags; > + __u32 eof_id; > + __u64 eof_min_file_size; > __s32 version; > unsigned char pad[12]; > }; ACtually, looking at this the version needs to be the first field of the structure, so we can guarantee that it can be read by any kernel that supports the ioctl regardless of how the rest of the structure changes. > /* eof_flags values */ > #define XFS_EOF_FLAGS_FORCE 0x01 /* force/wait mode scan */ > +#define XFS_EOF_FLAGS_USRID 0x02 /* filter by user id */ > +#define XFS_EOF_FLAGS_GRPID 0x04 /* filter by group id */ > +#define XFS_EOF_FLAGS_PROJID 0x08 /* filter by project id */ I'm wondering if it would be better to pass real quota fields (as per dqblk_xfs.h) than make up a new way to pass the same information). That way we might be able to use standard quota functions rather for checks and comparisons rather than duplicating them. That way if we ever add new quota types, we don't have to add flags and validation to this ioctl.... i.e. we have XFS_EOF_FLAGS_QUOTA to say "filter by quota fields", similar to the XFS_EOF_FLAGS_MINFILESIZE flag... And it becomes much easier to convert to userns kqids that are not that far away: https://lkml.org/lkml/2012/9/19/587 > +#define XFS_EOF_FLAGS_MINFILESIZE 0x10 /* minimum file size */ > + > +#define XFS_EOF_VALID_QUOTA (XFS_EOF_FLAGS_USRID|XFS_EOF_FLAGS_GRPID| \ > + XFS_EOF_FLAGS_PROJID) > > > /* > diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c > index 216ca7a..a7bf847 100644 > --- a/fs/xfs/xfs_ioctl.c > +++ b/fs/xfs/xfs_ioctl.c > @@ -1609,8 +1609,16 @@ xfs_file_ioctl( > if (copy_from_user(&eofb, arg, sizeof(eofb))) > return -XFS_ERROR(EFAULT); > > + if (((eofb.eof_flags & XFS_EOF_FLAGS_USRID) && > + !XFS_IS_UQUOTA_ON(mp)) || > + ((eofb.eof_flags & XFS_EOF_FLAGS_GRPID) && > + !XFS_IS_GQUOTA_ON(mp)) || > + ((eofb.eof_flags & XFS_EOF_FLAGS_PROJID) && > + !XFS_IS_PQUOTA_ON(mp))) > + return -XFS_ERROR(EINVAL); > + > flags = (eofb.eof_flags & XFS_EOF_FLAGS_FORCE) ? SYNC_WAIT : SYNC_TRYLOCK; > - error = xfs_inodes_free_eofblocks(mp, flags); > + error = xfs_inodes_free_eofblocks(mp, flags, &eofb); You probably shoul djust pass the &eofb in the first patch, rather than having to change the implementation here again. > return -error; > } > > diff --git a/fs/xfs/xfs_sync.c b/fs/xfs/xfs_sync.c > index 6854800..c9e1c16 100644 > --- a/fs/xfs/xfs_sync.c > +++ b/fs/xfs/xfs_sync.c > @@ -1015,6 +1015,21 @@ xfs_reclaim_inodes_count( > } > > STATIC int > +xfs_inode_match_quota_id( > + struct xfs_inode *ip, > + struct xfs_eofblocks *eofb) > +{ > + if (eofb->eof_flags & XFS_EOF_FLAGS_USRID) > + return ip->i_d.di_uid == eofb->eof_id; > + else if (eofb->eof_flags & XFS_EOF_FLAGS_GRPID) > + return ip->i_d.di_gid == eofb->eof_id; > + else if (eofb->eof_flags & XFS_EOF_FLAGS_PROJID) > + return xfs_get_projid(ip) == eofb->eof_id; > + > + return 0; > +} > + > +STATIC int > xfs_inode_free_eofblocks( > struct xfs_inode *ip, > struct xfs_perag *pag, > @@ -1022,6 +1037,7 @@ xfs_inode_free_eofblocks( > void *args) > { > int ret; > + struct xfs_eofblocks *eofb = args; > bool force = flags & SYNC_WAIT; > > if (!xfs_can_free_eofblocks(ip, false)) { > @@ -1031,8 +1047,13 @@ xfs_inode_free_eofblocks( > return 0; > } > > - if (!force && mapping_tagged(VFS_I(ip)->i_mapping, > - PAGECACHE_TAG_DIRTY)) > + if ((eofb && > + (((eofb->eof_flags & XFS_EOF_VALID_QUOTA) && > + !xfs_inode_match_quota_id(ip, eofb)) || > + ((eofb->eof_flags & XFS_EOF_FLAGS_MINFILESIZE) && > + (XFS_ISIZE(ip) < eofb->eof_min_file_size)))) || > + (!force && mapping_tagged(VFS_I(ip)->i_mapping, > + PAGECACHE_TAG_DIRTY))) > return 0; Break that up into multiple "if() return 0" statements so it is possible to read the logic. ;) Cheers, Dave. -- Dave Chinner david@fromorbit.com From david@fromorbit.com Fri Sep 28 02:58:52 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_72 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8S7wqDf201083 for ; Fri, 28 Sep 2012 02:58:52 -0500 X-ASG-Debug-ID: 1348819210-04cbb069c364200001-NocioJ Received: from ipmail04.adl6.internode.on.net (ipmail04.adl6.internode.on.net [150.101.137.141]) by cuda.sgi.com with ESMTP id WJtrDrZwCbUUHFsh for ; Fri, 28 Sep 2012 01:00:11 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.141 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqQMAI9YZVB5LPfb/2dsb2JhbABCA7x4AQKBEIEJgiABAQUnExwjEAgDDgouFCUDIROIBLhRFIsEb02BRoMlA5VokCyCeQ Received: from ppp121-44-247-219.lns20.syd7.internode.on.net (HELO dastard) ([121.44.247.219]) by ipmail04.adl6.internode.on.net with ESMTP; 28 Sep 2012 17:30:10 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1THVUX-0007jj-DP; Fri, 28 Sep 2012 18:00:09 +1000 Date: Fri, 28 Sep 2012 18:00:09 +1000 From: Dave Chinner To: Brian Foster Cc: xfs@oss.sgi.com Subject: Re: [PATCH v4 8/8] xfs: add background scanning to clear EOFBLOCKS inodes Message-ID: <20120928080009.GM25626@dastard> X-ASG-Orig-Subj: Re: [PATCH v4 8/8] xfs: add background scanning to clear EOFBLOCKS inodes References: <1348767952-24229-1-git-send-email-bfoster@redhat.com> <1348767952-24229-9-git-send-email-bfoster@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1348767952-24229-9-git-send-email-bfoster@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail04.adl6.internode.on.net[150.101.137.141] X-Barracuda-Start-Time: 1348819210 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109808 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Thu, Sep 27, 2012 at 01:45:52PM -0400, Brian Foster wrote: > Create a delayed_work to enable background scanning and freeing > of EOFBLOCKS inodes. The scanner kicks in once speculative > preallocation occurs and stops requeueing itself when no EOFBLOCKS > inodes exist. > > Scans are queued on the existing syncd workqueue and the interval > is based on the new eofb_timer tunable (default to 5m). The > background scanner performs unfiltered, best effort scans (which > skips inodes under lock contention or with a dirty cache mapping). > > Signed-off-by: Brian Foster > --- > fs/xfs/xfs_globals.c | 1 + > fs/xfs/xfs_linux.h | 1 + > fs/xfs/xfs_mount.h | 2 ++ > fs/xfs/xfs_sync.c | 30 ++++++++++++++++++++++++++++++ > fs/xfs/xfs_sysctl.c | 9 +++++++++ > fs/xfs/xfs_sysctl.h | 1 + > 6 files changed, 44 insertions(+), 0 deletions(-) > > diff --git a/fs/xfs/xfs_globals.c b/fs/xfs/xfs_globals.c > index 76e81cf..fda9a66 100644 > --- a/fs/xfs/xfs_globals.c > +++ b/fs/xfs/xfs_globals.c > @@ -40,4 +40,5 @@ xfs_param_t xfs_params = { > .rotorstep = { 1, 1, 255 }, > .inherit_nodfrg = { 0, 1, 1 }, > .fstrm_timer = { 1, 30*100, 3600*100}, > + .eofb_timer = { 1*100, 300*100, 7200*100}, > }; > diff --git a/fs/xfs/xfs_linux.h b/fs/xfs/xfs_linux.h > index 828662f..bbad99b 100644 > --- a/fs/xfs/xfs_linux.h > +++ b/fs/xfs/xfs_linux.h > @@ -118,6 +118,7 @@ > #define xfs_rotorstep xfs_params.rotorstep.val > #define xfs_inherit_nodefrag xfs_params.inherit_nodfrg.val > #define xfs_fstrm_centisecs xfs_params.fstrm_timer.val > +#define xfs_eofb_centisecs xfs_params.eofb_timer.val Let's not propagate that stupid "centiseconds" unit any further. Nobody uses it, and it was only introduced because jiffie was 10ms and there were 100 to a second so it was easy to convert in the code. I don't think there is any reason for needing sub-second granularity for this background function, so seconds shoul dbe just fine for it. If you think we nee dfiner granularity, milliseconds is the nex tunit to choose.... > > #define current_cpu() (raw_smp_processor_id()) > #define current_pid() (current->pid) > diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h > index deee09e..bf5ecfa 100644 > --- a/fs/xfs/xfs_mount.h > +++ b/fs/xfs/xfs_mount.h > @@ -199,6 +199,8 @@ typedef struct xfs_mount { > struct xfs_mru_cache *m_filestream; /* per-mount filestream data */ > struct delayed_work m_sync_work; /* background sync work */ > struct delayed_work m_reclaim_work; /* background inode reclaim */ > + struct delayed_work m_eofblocks_work; /* background eof blocks > + trimming */ > struct work_struct m_flush_work; /* background inode flush */ > __int64_t m_update_flags; /* sb flags we need to update > on the next remount,rw */ > diff --git a/fs/xfs/xfs_sync.c b/fs/xfs/xfs_sync.c > index c9e1c16..31f678a 100644 > --- a/fs/xfs/xfs_sync.c > +++ b/fs/xfs/xfs_sync.c > @@ -532,6 +532,31 @@ xfs_flush_worker( > xfs_sync_data(mp, SYNC_TRYLOCK | SYNC_WAIT); > } > > +/* > + * Background scanning to trim post-EOF preallocated space. This is queued > + * based on the 'eofb_centisecs' tunable (5m by default). > + */ > +STATIC void > +xfs_queue_eofblocks( > + struct xfs_mount *mp) > +{ > + rcu_read_lock(); > + if (radix_tree_tagged(&mp->m_perag_tree, XFS_ICI_EOFBLOCKS_TAG)) > + queue_delayed_work(xfs_syncd_wq, &mp->m_eofblocks_work, > + msecs_to_jiffies(xfs_eofb_centisecs * 10)); > + rcu_read_unlock(); > +} This will all need reworking for the new xfs_icache.c and per-mount workqueue structuring. Fundamentally there is nothing wrong with what you've done, it's just been reworked... > + { > + .procname = "eofb_centisecs", Ugh. Call it something users might understand. Say "background_prealloc_discard_period", or something similarly informative... Cheers, Dave. -- Dave Chinner david@fromorbit.com From BATV+4a1887d326c887ffa590+3323+infradead.org+hch@bombadil.srs.infradead.org Fri Sep 28 04:56:58 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8S9uw7P209715 for ; Fri, 28 Sep 2012 04:56:58 -0500 X-ASG-Debug-ID: 1348826296-04cb6c794465c50001-NocioJ Received: from bombadil.infradead.org (173-166-109-252-newengland.hfc.comcastbusiness.net [173.166.109.252]) by cuda.sgi.com with ESMTP id aqiSoUJIbC6j89b6 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 28 Sep 2012 02:58:16 -0700 (PDT) X-Barracuda-Envelope-From: BATV+4a1887d326c887ffa590+3323+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 173.166.109.252 Received: from hch by bombadil.infradead.org with local (Exim 4.76 #1 (Red Hat Linux)) id 1THXKp-0003iR-JK; Fri, 28 Sep 2012 09:58:15 +0000 Date: Fri, 28 Sep 2012 05:58:15 -0400 From: Christoph Hellwig To: Eric Sandeen Cc: xfs-oss Subject: Re: [PATCH] xfstests 068: Add mmap load Message-ID: <20120928095815.GA14240@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfstests 068: Add mmap load References: <50651A99.1070307@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <50651A99.1070307@redhat.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: 173-166-109-252-newengland.hfc.comcastbusiness.net[173.166.109.252] X-Barracuda-Start-Time: 1348826296 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109816 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS On Thu, Sep 27, 2012 at 10:33:45PM -0500, Eric Sandeen wrote: > Test 068 is the go-to test for freeze deadlock coverage; > unfortunately it only uses fsstress, which doesn't do any mmap > IO. > > Using the existing fstest binary gets us a cheap mmap exerciser > as well. > > Signed-off-by: Eric Sandeen Looks good, Reviewed-by: Christoph Hellwig From BATV+4a1887d326c887ffa590+3323+infradead.org+hch@bombadil.srs.infradead.org Fri Sep 28 07:26:05 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8SCQ5Qs221610 for ; Fri, 28 Sep 2012 07:26:05 -0500 X-ASG-Debug-ID: 1348835239-04cb6c79416c850001-NocioJ Received: from bombadil.infradead.org (173-166-109-252-newengland.hfc.comcastbusiness.net [173.166.109.252]) by cuda.sgi.com with ESMTP id t7BTQAPP5Ba6GvtM (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 28 Sep 2012 05:27:20 -0700 (PDT) X-Barracuda-Envelope-From: BATV+4a1887d326c887ffa590+3323+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 173.166.109.252 Received: from hch by bombadil.infradead.org with local (Exim 4.76 #1 (Red Hat Linux)) id 1THZf4-0003kH-UV; Fri, 28 Sep 2012 12:27:18 +0000 Date: Fri, 28 Sep 2012 08:27:18 -0400 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 02/13] xfs: rationalise xfs_mount_wq users Message-ID: <20120928122718.GA14284@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 02/13] xfs: rationalise xfs_mount_wq users References: <1348807485-20165-1-git-send-email-david@fromorbit.com> <1348807485-20165-3-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1348807485-20165-3-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: 173-166-109-252-newengland.hfc.comcastbusiness.net[173.166.109.252] X-Barracuda-Start-Time: 1348835239 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109826 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS Looks good, Reviewed-by: Christoph Hellwig From BATV+4a1887d326c887ffa590+3323+infradead.org+hch@bombadil.srs.infradead.org Fri Sep 28 07:26:27 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8SCQR6J221667 for ; Fri, 28 Sep 2012 07:26:27 -0500 X-ASG-Debug-ID: 1348835266-04cbb069c16f8c0001-NocioJ Received: from bombadil.infradead.org (173-166-109-252-newengland.hfc.comcastbusiness.net [173.166.109.252]) by cuda.sgi.com with ESMTP id SnJdjyF7JwZgdTjH (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 28 Sep 2012 05:27:46 -0700 (PDT) X-Barracuda-Envelope-From: BATV+4a1887d326c887ffa590+3323+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 173.166.109.252 Received: from hch by bombadil.infradead.org with local (Exim 4.76 #1 (Red Hat Linux)) id 1THZfW-0003lQ-C2; Fri, 28 Sep 2012 12:27:46 +0000 Date: Fri, 28 Sep 2012 08:27:46 -0400 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 03/13] xfs: don't run the sync work if the filesystem is read-only Message-ID: <20120928122746.GB14284@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 03/13] xfs: don't run the sync work if the filesystem is read-only References: <1348807485-20165-1-git-send-email-david@fromorbit.com> <1348807485-20165-4-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1348807485-20165-4-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: 173-166-109-252-newengland.hfc.comcastbusiness.net[173.166.109.252] X-Barracuda-Start-Time: 1348835266 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109826 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS Looks good, Reviewed-by: Christoph Hellwig From BATV+4a1887d326c887ffa590+3323+infradead.org+hch@bombadil.srs.infradead.org Fri Sep 28 07:30:04 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8SCU4Zb222109 for ; Fri, 28 Sep 2012 07:30:04 -0500 X-ASG-Debug-ID: 1348835483-04bdf0289c72e20001-NocioJ Received: from bombadil.infradead.org (173-166-109-252-newengland.hfc.comcastbusiness.net [173.166.109.252]) by cuda.sgi.com with ESMTP id jxEPxrQ9P1VNtGAz (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 28 Sep 2012 05:31:24 -0700 (PDT) X-Barracuda-Envelope-From: BATV+4a1887d326c887ffa590+3323+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 173.166.109.252 Received: from hch by bombadil.infradead.org with local (Exim 4.76 #1 (Red Hat Linux)) id 1THZj1-0005De-1x; Fri, 28 Sep 2012 12:31:23 +0000 Date: Fri, 28 Sep 2012 08:31:23 -0400 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 04/13] xfs: sync work is now only periodic log work Message-ID: <20120928123122.GC14284@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 04/13] xfs: sync work is now only periodic log work References: <1348807485-20165-1-git-send-email-david@fromorbit.com> <1348807485-20165-5-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1348807485-20165-5-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: 173-166-109-252-newengland.hfc.comcastbusiness.net[173.166.109.252] X-Barracuda-Start-Time: 1348835483 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109826 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS On Fri, Sep 28, 2012 at 02:44:36PM +1000, Dave Chinner wrote: > From: Dave Chinner > > The only thing the periodic sync work does now is flush the AIL and > idle the log. These are really functions of the log code, so move > the work to xfs_log.c and rename it appropriately. > > The only wart that this leaves behind is the xfssyncd_centisecs > sysctl, otherwise the xfssyncd is dead. Clean up any comments that > related to xfssyncd to reflect it's passing. You'll get an OK for me as I'd like this series in 3.7, but I'd really prefer if we could stop waking up xfsaild from here ASAP, and instead just do a schedule_timeout in xfsaild where we currently sleep forever. Any chance to get a follow on patch for that? > +#include "xfs_fsops.h" > > kmem_zone_t *xfs_log_ticket_zone; > > @@ -698,6 +699,8 @@ xfs_log_mount_finish(xfs_mount_t *mp) > ASSERT(mp->m_flags & XFS_MOUNT_RDONLY); > } > > + xfs_log_work_queue(mp); > + > return error; I think this should only be called when xlog_recover_finish didn't return an error. From BATV+4a1887d326c887ffa590+3323+infradead.org+hch@bombadil.srs.infradead.org Fri Sep 28 07:33:24 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8SCXO4v222513 for ; Fri, 28 Sep 2012 07:33:24 -0500 X-ASG-Debug-ID: 1348835683-04cb6c79426cdb0001-NocioJ Received: from bombadil.infradead.org (173-166-109-252-newengland.hfc.comcastbusiness.net [173.166.109.252]) by cuda.sgi.com with ESMTP id yRed5Ni718WuJMW5 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 28 Sep 2012 05:34:43 -0700 (PDT) X-Barracuda-Envelope-From: BATV+4a1887d326c887ffa590+3323+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 173.166.109.252 Received: from hch by bombadil.infradead.org with local (Exim 4.76 #1 (Red Hat Linux)) id 1THZmF-0005Zw-D5; Fri, 28 Sep 2012 12:34:43 +0000 Date: Fri, 28 Sep 2012 08:34:43 -0400 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 06/13] xfs: xfs_sync_data is redundant. Message-ID: <20120928123443.GD14284@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 06/13] xfs: xfs_sync_data is redundant. References: <1348807485-20165-1-git-send-email-david@fromorbit.com> <1348807485-20165-7-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1348807485-20165-7-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: 173-166-109-252-newengland.hfc.comcastbusiness.net[173.166.109.252] X-Barracuda-Start-Time: 1348835683 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109826 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS > /* > + * Flush all dirty data to disk. Must not be called while holding an XFS_ILOCK slightly too long line. > + * or a page lock. > + */ > +static inline void > +xfs_flush_inodes(struct xfs_inode *ip) > +{ > + writeback_inodes_sb_if_idle(VFS_I(ip)->i_sb, WB_REASON_FS_FREE_SPACE); > +} Passing an inode here seems very odd, an xfs_mount would be the proper interface. Looks fine modulo these cosmetic changes, so: Reviewed-by: Christoph Hellwig From BATV+4a1887d326c887ffa590+3323+infradead.org+hch@bombadil.srs.infradead.org Fri Sep 28 07:33:48 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8SCXmWx222602 for ; Fri, 28 Sep 2012 07:33:48 -0500 X-ASG-Debug-ID: 1348835707-04bdf0289d73170001-NocioJ Received: from bombadil.infradead.org (173-166-109-252-newengland.hfc.comcastbusiness.net [173.166.109.252]) by cuda.sgi.com with ESMTP id iPHGHfvQbAr0O1uG (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 28 Sep 2012 05:35:07 -0700 (PDT) X-Barracuda-Envelope-From: BATV+4a1887d326c887ffa590+3323+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 173.166.109.252 Received: from hch by bombadil.infradead.org with local (Exim 4.76 #1 (Red Hat Linux)) id 1THZmc-0006YC-R6; Fri, 28 Sep 2012 12:35:06 +0000 Date: Fri, 28 Sep 2012 08:35:06 -0400 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH 07/13] xfs: syncd workqueue is no more Message-ID: <20120928123506.GE14284@infradead.org> X-ASG-Orig-Subj: Re: [PATCH 07/13] xfs: syncd workqueue is no more References: <1348807485-20165-1-git-send-email-david@fromorbit.com> <1348807485-20165-8-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1348807485-20165-8-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: 173-166-109-252-newengland.hfc.comcastbusiness.net[173.166.109.252] X-Barracuda-Start-Time: 1348835707 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109826 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS On Fri, Sep 28, 2012 at 02:44:39PM +1000, Dave Chinner wrote: > From: Dave Chinner > > With the syncd functions moved to the log and/or removed, the syncd > workqueue is the only remaining bit left. It is used by the log > covering/ail pushing work, as well as by the inode reclaim work. > > Given how cheap workqueues are these days, give the log and inode > reclaim work their own work queues and kill the syncd work queue. > > Signed-off-by: Dave Chinner Looks good, Reviewed-by: Christoph Hellwig From BATV+4a1887d326c887ffa590+3323+infradead.org+hch@bombadil.srs.infradead.org Fri Sep 28 07:39:19 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8SCdJCl223371 for ; Fri, 28 Sep 2012 07:39:19 -0500 X-ASG-Debug-ID: 1348836039-04cb6c79416d2d0001-NocioJ Received: from bombadil.infradead.org (173-166-109-252-newengland.hfc.comcastbusiness.net [173.166.109.252]) by cuda.sgi.com with ESMTP id Kto5O5FuFfRTheI1 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 28 Sep 2012 05:40:39 -0700 (PDT) X-Barracuda-Envelope-From: BATV+4a1887d326c887ffa590+3323+infradead.org+hch@bombadil.srs.infradead.org X-Barracuda-Apparent-Source-IP: 173.166.109.252 Received: from hch by bombadil.infradead.org with local (Exim 4.76 #1 (Red Hat Linux)) id 1THZry-0007xG-Ty; Fri, 28 Sep 2012 12:40:38 +0000 Date: Fri, 28 Sep 2012 08:40:38 -0400 From: Christoph Hellwig To: Dave Chinner Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: only update the last_sync_lsn when a transaction completes Message-ID: <20120928124038.GA25262@infradead.org> X-ASG-Orig-Subj: Re: [PATCH] xfs: only update the last_sync_lsn when a transaction completes References: <1348807035-20087-1-git-send-email-david@fromorbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1348807035-20087-1-git-send-email-david@fromorbit.com> User-Agent: Mutt/1.5.21 (2010-09-15) X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org See http://www.infradead.org/rpr.html X-Barracuda-Connect: 173-166-109-252-newengland.hfc.comcastbusiness.net[173.166.109.252] X-Barracuda-Start-Time: 1348836039 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.10 X-Barracuda-Spam-Status: No, SCORE=0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=RDNS_DYNAMIC X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109826 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 0.10 RDNS_DYNAMIC Delivered to trusted network by host with dynamic-looking rDNS Looks good. Do you have any testcase for this? It doesn't look like an issue found by code inspection. From tinguely@sgi.com Fri Sep 28 11:37:34 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay2.corp.sgi.com [137.38.102.29]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8SGbYNg258857 for ; Fri, 28 Sep 2012 11:37:34 -0500 Received: from [128.162.232.125] (eagdhcp-232-125.americas.sgi.com [128.162.232.125]) by relay2.corp.sgi.com (Postfix) with ESMTP id E561B304062; Fri, 28 Sep 2012 09:38:51 -0700 (PDT) Message-ID: <5065D292.4090600@sgi.com> Date: Fri, 28 Sep 2012 11:38:42 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com, Ben Myers Subject: Re: [PATCH v2] xfsprog: remove duplicate vector memalign from xfs_io References: <20120925142414.660506845@sgi.com> <20120925142421.398175185@sgi.com> <20120926220434.GG13214@sgi.com> <20120927124742.695778439@sgi.com> <20120927225248.GB25626@dastard> In-Reply-To: <20120927225248.GB25626@dastard> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/27/12 17:52, Dave Chinner wrote: > On Thu, Sep 27, 2012 at 07:47:36AM -0500, Mark Tinguely wrote: >> The vector feature of xfs_io uses its own memory buffer in the iov structure >> and does not use the buffer entry. Remove the duplicate memalign. >> >> v2: removed global buffer in __dump_buffer() and use passed buf pointer per >> Ben's detection. >> >> Signed-off-by: Mark Tinguely >> Reviewed-by: Ben Myers > > Looks good, Thanks for fixing this. > > Reviewed-by: Dave Chinner > Committed to git://oss.sgi.com/xfs/cmds/xfsprogs.git, master branch. --Mark. From xfs-owner@oss.sgi.com Fri Sep 28 11:42:30 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: * X-Spam-Status: No, score=1.8 required=5.0 tests=BAYES_50,FREEMAIL_FROM, TO_NO_BRKTS_PCNT,T_TO_NO_BRKTS_FREEMAIL autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8SGgUom259594 for ; Fri, 28 Sep 2012 11:42:30 -0500 X-ASG-Debug-ID: 1348850627-04bdf0289d80350001-w1Z2WR Received: from relay2.transip.nl (relay2.transip.nl [80.69.67.73]) by cuda.sgi.com with ESMTP id fhwvxMTDpMciEYVY for ; Fri, 28 Sep 2012 09:43:48 -0700 (PDT) X-Barracuda-Envelope-From: mobilemonopoly1@gmail.com X-Barracuda-Apparent-Source-IP: 80.69.67.73 Received: from EuroShopGigant (mail.biceva.com [87.253.151.130]) by relay2.transip.nl (Postfix) with SMTP id 478E422C0E4E for ; Fri, 28 Sep 2012 18:43:47 +0200 (CEST) MIME-Version: 1.0 X-Mailer: osCommerce Mailer Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit From: "1 .......Crazy $600 per day with MOBILE......................................................................" To: ".......Good day and Pleasant Greetings!..........Start earning TODAY $600 per day with Your Breakthrough Mobile Domination access ...CLICK HERE NOW http://supremewealthproz.co.cc/aff/item.php?usn=rpa2&i=it_cbrpa&e=linux-xfs@oss.sgi.com" Date: Fri, 28 Sep 2012 09:43:50 -0700 (PDT) Hallo .......Good day and Pleasant Greetings!..........Start earning TODAY $600 per day with Your Breakthrough Mobile Domination access ...CLICK HERE NOW http://supremewealthproz.co.cc/aff/item.php?usn=rpa2&i=it_cbrpa&e=linux-xfs@oss.sgi.com! Uw vriend(in), 1 .......Crazy $600 per day with MOBILE......................................................................, denkt dat u wel geïnteresseerd zou zijn in Duikpak surfpak neopreenpak wetsuit 3 mm neopreen van EuroShopGigant - Alles voor in huis en tuin - SCHERPE prijzen. Hey, This video puts every mobile "breakthrough" I’ve seen to shame… http://supremewealthproz.co.cc/aff/item.php?usn=rpa2&i=it_cbrpa&e=linux-xfs@oss.sgi.com a truly automated method that finally puts the full potential of fast – even 100% FREE – mobile traffic at your fingertips… AND… At the same time, serves you up a "done-for-you" means to profit from all that traffic from day one, and I'll show you real time proof of that in just a second. http://supremewealthproz.co.cc/aff/item.php?usn=rpa2&i=it_cbrpa&e=linux-xfs@oss.sgi.com But it's not just the profits alone – up to $632.83 in one day – that make this so different from anything you've seen… Even crazier is that the White House was impressed enough to honor the 20-year-old marketing maverick who created it… Check it out: http://supremewealthproz.co.cc/aff/item.php?usn=rpa2&i=it_cbrpa&e=linux-xfs@oss.sgi.com Talk soon, Jason S. USA-CA Om het artikel te zien klikt u gewoon op de onderstaande link of kopieert en plakt u de link in uw web browser: http://www.euroshopgigant.nl/product_info.php?products_id=381 Groet, EuroShopGigant - Alles voor in huis en tuin - SCHERPE prijzen http://www.euroshopgigant.nl/ From tinguely@sgi.com Fri Sep 28 12:45:41 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8SHjfmc010108 for ; Fri, 28 Sep 2012 12:45:41 -0500 Received: from [128.162.232.125] (eagdhcp-232-125.americas.sgi.com [128.162.232.125]) by relay1.corp.sgi.com (Postfix) with ESMTP id 2460B8F809E; Fri, 28 Sep 2012 10:46:57 -0700 (PDT) Message-ID: <5065E288.8060403@sgi.com> Date: Fri, 28 Sep 2012 12:46:48 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: only update the last_sync_lsn when a transaction completes References: <1348807035-20087-1-git-send-email-david@fromorbit.com> In-Reply-To: <1348807035-20087-1-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/27/12 23:37, Dave Chinner wrote: > From: Dave Chinner > > The log write code stamps each iclog with the current tail LSN in > the iclog header so that recovery knows where to find the tail of > thelog once it has found the head. Normally this is taken from the > first item on the AIL - the log item that corresponds to the oldest > active item in the log. > > The problem is that when the AIL is empty, the tail lsn is dervied > from the the l_last_sync_lsn, which is the LSN of the last iclog to > be written to the log. In most cases this doesn't happen, because > the AIL is rarely empty on an active filesystem. However, when it > does, it opens up an interesting case when the transaction being > committed to the iclog spans multiple iclogs. > > That is, the first iclog is stamped with the l_last_sync_lsn, and IO > is issued. Then the next iclog is setup, the changes copied into the > iclog (takes some time), and then the l_last_sync_lsn is stamped > into the header and IO is issued. This is still the same > transaction, so the tail lsn of both iclogs must be the same for log > recovery to find the entire transaction to be able to replay it. > > The problem arises in that the iclog buffer IO completion updates > the l_last_sync_lsn with it's own LSN. Therefore, If the first iclog > completes it's IO before the second iclog is filled and has the tail > lsn stamped in it, it will stamp the LSN of the first iclog into > it's tail lsn field. If the system fails at this point, log recovery > will not see a complete transaction, so the transaction will no be > replayed. > > The fix is simple - the l_last_sync_lsn is updated when a iclog > buffer IO completes, and this is incorrect. The l_last_sync_lsn > shoul dbe updated when a transaction is completed by a iclog buffer > IO. That is, only iclog buffers that have transaction commit > callbacks attached to them should update the l_last_sync_lsn. This > means that the last_sync_lsn will only move forward when a commit > record it written, not in the middle of a large transaction that is > rolling through multiple iclog buffers. > > Signed-off-by: Dave Chinner > --- Makes a lot of sense. Seems to clean up wrap warnings and hangs that I started to see in xfstest 273. Reviewed-by: Mark Tinguely From tinguely@sgi.com Fri Sep 28 13:15:59 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8SIFxje014252 for ; Fri, 28 Sep 2012 13:15:59 -0500 Received: from [128.162.232.125] (eagdhcp-232-125.americas.sgi.com [128.162.232.125]) by relay1.corp.sgi.com (Postfix) with ESMTP id 99FDD8F80B8; Fri, 28 Sep 2012 11:17:16 -0700 (PDT) Message-ID: <5065E9A3.3040707@sgi.com> Date: Fri, 28 Sep 2012 13:17:07 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 07/13] xfs: syncd workqueue is no more References: <1348807485-20165-1-git-send-email-david@fromorbit.com> <1348807485-20165-8-git-send-email-david@fromorbit.com> In-Reply-To: <1348807485-20165-8-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/27/12 23:44, Dave Chinner wrote: > From: Dave Chinner > > With the syncd functions moved to the log and/or removed, the syncd > workqueue is the only remaining bit left. It is used by the log > covering/ail pushing work, as well as by the inode reclaim work. > > Given how cheap workqueues are these days, give the log and inode > reclaim work their own work queues and kill the syncd work queue. > > Signed-off-by: Dave Chinner > --- > diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c > index fed1eb2..65cf42c 100644 > --- a/fs/xfs/xfs_super.c > +++ b/fs/xfs/xfs_super.c > @@ -776,8 +776,23 @@ xfs_init_mount_workqueues( > WQ_MEM_RECLAIM, 0, mp->m_fsname); > if (!mp->m_cil_workqueue) > goto out_destroy_unwritten; > + > + mp->m_reclaim_workqueue = alloc_workqueue("xfs-reclaim/%s", > + WQ_NON_REENTRANT, 0, mp->m_fsname); > + if (!mp->m_reclaim_workqueue) > + goto out_destroy_cil; > + > + mp->m_log_workqueue = alloc_workqueue("xfs-reclaim/%s", > + WQ_NON_REENTRANT, 0, mp->m_fsname); Cut/paste error for the worker name? Looks good. Reviewed-by: Mark Tinguely From bfoster@redhat.com Fri Sep 28 15:41:02 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8SKf2ke049142 for ; Fri, 28 Sep 2012 15:41:02 -0500 X-ASG-Debug-ID: 1348864942-04cbb069c387160001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id fAjnEh3QoByL3TzB for ; Fri, 28 Sep 2012 13:42:22 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8SKgKZM011034 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 28 Sep 2012 16:42:20 -0400 Received: from laptop.bfoster (vpn-10-250.rdu.redhat.com [10.11.10.250]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id q8SKgJIA018470 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Fri, 28 Sep 2012 16:42:20 -0400 Message-ID: <50660B4C.9060604@redhat.com> Date: Fri, 28 Sep 2012 16:40:44 -0400 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:15.0) Gecko/20120827 Thunderbird/15.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH v4 1/8] xfs: add EOFBLOCKS inode tagging/untagging References: <1348767952-24229-1-git-send-email-bfoster@redhat.com> <1348767952-24229-2-git-send-email-bfoster@redhat.com> <20120928070401.GH25626@dastard> X-ASG-Orig-Subj: Re: [PATCH v4 1/8] xfs: add EOFBLOCKS inode tagging/untagging In-Reply-To: <20120928070401.GH25626@dastard> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1348864942 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com On 09/28/2012 03:04 AM, Dave Chinner wrote: > On Thu, Sep 27, 2012 at 01:45:45PM -0400, Brian Foster wrote: >> Add the XFS_ICI_EOFBLOCKS_TAG inode tag to identify inodes with >> speculatively preallocated blocks beyond EOF. An inode is tagged >> when speculative preallocation occurs and untagged either via >> truncate down or when post-EOF blocks are freed via release or >> reclaim. >> >> The tag management is intentionally not aggressive to prefer >> simplicity over the complexity of handling all the corner cases >> under which post-EOF blocks could be freed (i.e., forward >> truncation, fallocate, write error conditions, etc.). This means >> that a tagged inode may or may not have post-EOF blocks after a >> period of time. The tag is eventually cleared when the inode is >> released or reclaimed. >> >> Signed-off-by: Brian Foster > > Apart from the fact this conflicts with my xfssyncd killing patchset > and xfs_sync.c no longer exists, it looks fine. > > Can you rebase this on top of my patch series? Mostly it is simply > making your changes to xfs_icache.c rather than xfs_sync.c as that's > where all this inode cache radix tree walking code is now..... > Sure. I skimmed through the first set and it didn't seem like a major conflict. I'll rebase against the v3 xfssyncd set for my next version. Brian > Cheers, > > Dave. > From bfoster@redhat.com Fri Sep 28 15:41:26 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8SKfQou049291 for ; Fri, 28 Sep 2012 15:41:26 -0500 X-ASG-Debug-ID: 1348864966-04cb6c7944841c0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id m16ukbJs7gK7f0Fx for ; Fri, 28 Sep 2012 13:42:46 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8SKgjxe011102 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 28 Sep 2012 16:42:45 -0400 Received: from laptop.bfoster (vpn-10-250.rdu.redhat.com [10.11.10.250]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id q8SKgiKp018532 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Fri, 28 Sep 2012 16:42:44 -0400 Message-ID: <50660B65.6010204@redhat.com> Date: Fri, 28 Sep 2012 16:41:09 -0400 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:15.0) Gecko/20120827 Thunderbird/15.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH v4 3/8] xfs: create helper to check whether to free eofblocks on inode References: <1348767952-24229-1-git-send-email-bfoster@redhat.com> <1348767952-24229-4-git-send-email-bfoster@redhat.com> <20120928065917.GF25626@dastard> X-ASG-Orig-Subj: Re: [PATCH v4 3/8] xfs: create helper to check whether to free eofblocks on inode In-Reply-To: <20120928065917.GF25626@dastard> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1348864966 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com On 09/28/2012 02:59 AM, Dave Chinner wrote: > On Thu, Sep 27, 2012 at 01:45:47PM -0400, Brian Foster wrote: >> This check is used in multiple places to determine whether we >> should check for (and potentially free) post EOF blocks on an >> inode. Add a helper to consolidate the check. >> >> Note that when we remove an inode from the cache (xfs_inactive()), >> we are required to trim post-EOF blocks even if the inode is marked >> preallocated or append-only to maintain correct space accounting. >> The 'force' parameter to xfs_can_free_eofblocks() specifies whether >> we should ignore the prealloc/append-only status of the inode. >> >> Signed-off-by: Brian Foster > .... >> diff --git a/fs/xfs/xfs_vnodeops.h b/fs/xfs/xfs_vnodeops.h >> index 447e146..d5701e3 100644 >> --- a/fs/xfs/xfs_vnodeops.h >> +++ b/fs/xfs/xfs_vnodeops.h >> @@ -1,6 +1,10 @@ >> #ifndef _XFS_VNODEOPS_H >> #define _XFS_VNODEOPS_H 1 >> >> +#include "xfs_bmap_btree.h" >> +#include "xfs_dinode.h" >> +#include "xfs_inode.h" >> + >> struct attrlist_cursor_kern; >> struct file; >> struct iattr; > > Generally we try to avoid including XFS header files in XFS > header files, and instead order the header files in the .c files > appropriately. > Ok, good to know. I'll try to clean that up. >> @@ -9,8 +13,42 @@ struct iovec; >> struct kiocb; >> struct pipe_inode_info; >> struct uio; >> -struct xfs_inode; >> >> +/* >> + * Test whether it is appropriate to check an inode for and free post EOF >> + * blocks. The 'force' parameter determines whether we should also consider >> + * regular files that are marked preallocated or append-only. >> + */ >> +static inline bool >> +xfs_can_free_eofblocks(struct xfs_inode *ip, bool force) >> +{ >> + /* prealloc/delalloc exists only on regular files */ >> + if (!S_ISREG(ip->i_d.di_mode)) >> + return false; >> + >> + /* >> + * Zero sized files with no cached pages and delalloc blocks will not >> + * have speculative prealloc/delalloc blocks to remove. >> + */ >> + if (VFS_I(ip)->i_size == 0 && >> + VN_CACHED(VFS_I(ip)) == 0 && >> + ip->i_delayed_blks == 0) >> + return false; >> + >> + /* If we haven't read in the extent list, then don't do it now. */ >> + if (!(ip->i_df.if_flags & XFS_IFEXTENTS)) >> + return false; >> + >> + /* >> + * Do not free real preallocated or append-only files unless the file >> + * has delalloc blocks and we are forced to remove them. >> + */ >> + if (ip->i_d.di_flags & (XFS_DIFLAG_PREALLOC | XFS_DIFLAG_APPEND)) >> + if (!force || ip->i_delayed_blks == 0) >> + return false; >> + >> + return true; >> +} > > And I'd say that function is too large for a static inline function > in a header file, so moving it to xfs_inode.c is probably > appropriate. I know, I asked you to write it like this, but > not looking at it for a couple weeks brings new persepctive ;) > No problem. I guess that takes care of the include problem. :) Brian > Cheers, > > Dave. > From bfoster@redhat.com Fri Sep 28 15:41:48 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda1.sgi.com [192.48.157.11]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8SKflqf049376 for ; Fri, 28 Sep 2012 15:41:48 -0500 X-ASG-Debug-ID: 1348864988-04bdf0289a8bca0001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id qYZvn4T5xDlDFmj2 for ; Fri, 28 Sep 2012 13:43:08 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8SKh7IL001599 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 28 Sep 2012 16:43:07 -0400 Received: from laptop.bfoster (vpn-10-250.rdu.redhat.com [10.11.10.250]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q8SKh6Br027001 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Fri, 28 Sep 2012 16:43:07 -0400 Message-ID: <50660B7B.7030905@redhat.com> Date: Fri, 28 Sep 2012 16:41:31 -0400 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:15.0) Gecko/20120827 Thunderbird/15.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH v4 5/8] xfs: create function to scan and clear EOFBLOCKS inodes References: <1348767952-24229-1-git-send-email-bfoster@redhat.com> <1348767952-24229-6-git-send-email-bfoster@redhat.com> <20120928072103.GJ25626@dastard> X-ASG-Orig-Subj: Re: [PATCH v4 5/8] xfs: create function to scan and clear EOFBLOCKS inodes In-Reply-To: <20120928072103.GJ25626@dastard> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1348864988 X-Barracuda-URL: http://192.48.157.11:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com On 09/28/2012 03:21 AM, Dave Chinner wrote: > On Thu, Sep 27, 2012 at 01:45:49PM -0400, Brian Foster wrote: >> xfs_inodes_free_eofblocks() implements scanning functionality for >> EOFBLOCKS inodes. It uses the AG iterator to walk the tagged inodes >> and free post-EOF blocks via the xfs_inode_free_eofblocks() execute >> function. The scan can be invoked in best-effort mode or wait >> (force) mode. >> >> A best-effort scan (default) handles all inodes that do not have a >> dirty cache and we successfully acquire the io lock via trylock. In >> wait mode, we continue to cycle through an AG until all inodes are >> handled. >> >> Signed-off-by: Brian Foster > > xfs_icache.c rebase, and... > >> --- >> fs/xfs/xfs_sync.c | 40 ++++++++++++++++++++++++++++++++++++++++ >> fs/xfs/xfs_sync.h | 1 + >> fs/xfs/xfs_trace.h | 1 + >> 3 files changed, 42 insertions(+), 0 deletions(-) >> >> diff --git a/fs/xfs/xfs_sync.c b/fs/xfs/xfs_sync.c >> index 0da93c9..6854800 100644 >> --- a/fs/xfs/xfs_sync.c >> +++ b/fs/xfs/xfs_sync.c >> @@ -1014,6 +1014,46 @@ xfs_reclaim_inodes_count( >> return reclaimable; >> } >> >> +STATIC int >> +xfs_inode_free_eofblocks( >> + struct xfs_inode *ip, >> + struct xfs_perag *pag, >> + int flags, >> + void *args) >> +{ >> + int ret; >> + bool force = flags & SYNC_WAIT; >> + >> + if (!xfs_can_free_eofblocks(ip, false)) { >> + /* inode could be preallocated or append-only */ >> + trace_xfs_inode_free_eofblocks_invalid(ip); >> + xfs_inode_clear_eofblocks_tag(ip); >> + return 0; >> + } >> + >> + if (!force && mapping_tagged(VFS_I(ip)->i_mapping, >> + PAGECACHE_TAG_DIRTY)) >> + return 0; > > This reads rather strangely. I'd prefer that you don't use a "force" > variable because we're not really "forcing" anything. SYNC_WAIT is > telling us if we should block (wait) or not. i.e. > > /* > * if the mapping is dirty the operation can block and wait > * for some time. So unless we are waiting, skip it. > */ > if (!(flags & SYNC_WAIT) && > (mapping_tagged(VFS_I(ip)->i_mapping, PAGECACHE_TAG_DIRTY)) > return 0; > > makes more sense and is consistent with xfs_reclaim_inode() usage. > Fair enough. I was thinking of the "force" scan mode as I called it, but as you point out in the next patch that's inconsistently named as well. Will fix. >> + ret = xfs_free_eofblocks(ip->i_mount, ip, true); >> + >> + /* ignore EAGAIN on a best effort scan */ >> + if (!force && (ret == EAGAIN)) >> + ret = 0; > > /* don't revisit the inode if we not waiting */ > if (ret == EAGAIN && !(flags & SYNC_WAIT)) > return 0; > return ret; >> + >> + return ret; >> +} >> + >> +int >> +xfs_inodes_free_eofblocks( >> + struct xfs_mount *mp, >> + int flags) >> +{ >> + ASSERT((flags & ~(SYNC_TRYLOCK|SYNC_WAIT)) == 0); >> + return xfs_inode_ag_iterator_tag(mp, xfs_inode_free_eofblocks, flags, >> + NULL, XFS_ICI_EOFBLOCKS_TAG); >> +} > > TWo functions very similarly named. Perhaps the latter would be > better named xfs_icache_free_eofblocks() to indicate it is an inode > cache operation, rather than an inode operation. > Ok, so correct me if I misread your comment. xfs_inodes_free_eofblocks() goes to xfs_icache_free_eofblocks() and xfs_inode_free_eofblocks() remains as is. > Then at some point in another patch set we can rename > xfs_reclaim_inodes* to xfs_icache_reclaim_* and > xfs_inode_ag_iterator* to xfs_icache_iterator* and so one so that > there is a clear naming difference between operations on the inode > cache and individual inodes... > Sounds logical. Brian > Cheers, > > Dave. > From bfoster@redhat.com Fri Sep 28 15:42:39 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8SKgdT3049796 for ; Fri, 28 Sep 2012 15:42:39 -0500 X-ASG-Debug-ID: 1348865039-04cbb069c487210001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id F3DaW4b7w74a2cQg for ; Fri, 28 Sep 2012 13:43:59 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8SKhw85001820 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 28 Sep 2012 16:43:58 -0400 Received: from laptop.bfoster (vpn-10-250.rdu.redhat.com [10.11.10.250]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q8SKhuED032053 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Fri, 28 Sep 2012 16:43:57 -0400 Message-ID: <50660BAE.6010607@redhat.com> Date: Fri, 28 Sep 2012 16:42:22 -0400 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:15.0) Gecko/20120827 Thunderbird/15.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH v4 7/8] xfs: add enhanced filtering to EOFBLOCKS scan References: <1348767952-24229-1-git-send-email-bfoster@redhat.com> <1348767952-24229-8-git-send-email-bfoster@redhat.com> <20120928075329.GL25626@dastard> X-ASG-Orig-Subj: Re: [PATCH v4 7/8] xfs: add enhanced filtering to EOFBLOCKS scan In-Reply-To: <20120928075329.GL25626@dastard> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1348865039 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com On 09/28/2012 03:53 AM, Dave Chinner wrote: > On Thu, Sep 27, 2012 at 01:45:51PM -0400, Brian Foster wrote: >> Support EOFBLOCKS scan filtering by quota ID or minimum file size. >> Add the appropriate fields/flags to the xfs_eofblocks structure and >> pass it down to xfs_inode_free_eofblocks() where filtering >> functionality is implemented. >> >> A (user requested) quota ID based scan requires the associated >> quota mode be enabled. >> >> Signed-off-by: Brian Foster >> --- >> fs/xfs/xfs_fs.h | 9 +++++++++ >> fs/xfs/xfs_ioctl.c | 10 +++++++++- >> fs/xfs/xfs_sync.c | 30 ++++++++++++++++++++++++++---- >> fs/xfs/xfs_sync.h | 2 +- >> 4 files changed, 45 insertions(+), 6 deletions(-) >> >> diff --git a/fs/xfs/xfs_fs.h b/fs/xfs/xfs_fs.h >> index 32bb2e8..54c0f39 100644 >> --- a/fs/xfs/xfs_fs.h >> +++ b/fs/xfs/xfs_fs.h >> @@ -343,12 +343,21 @@ typedef struct xfs_error_injection { >> */ >> struct xfs_eofblocks { >> __u32 eof_flags; >> + __u32 eof_id; >> + __u64 eof_min_file_size; >> __s32 version; >> unsigned char pad[12]; >> }; > > ACtually, looking at this the version needs to be the first field of > the structure, so we can guarantee that it can be read by any kernel > that supports the ioctl regardless of how the rest of the structure > changes. > Ah, right. > >> /* eof_flags values */ >> #define XFS_EOF_FLAGS_FORCE 0x01 /* force/wait mode scan */ >> +#define XFS_EOF_FLAGS_USRID 0x02 /* filter by user id */ >> +#define XFS_EOF_FLAGS_GRPID 0x04 /* filter by group id */ >> +#define XFS_EOF_FLAGS_PROJID 0x08 /* filter by project id */ > > I'm wondering if it would be better to pass real quota fields (as > per dqblk_xfs.h) than make up a new way to pass the same > information). That way we might be able to use standard quota > functions rather for checks and comparisons rather than duplicating > them. That way if we ever add new quota types, we don't have to add > flags and validation to this ioctl.... > > i.e. we have XFS_EOF_FLAGS_QUOTA to say "filter by quota fields", > similar to the XFS_EOF_FLAGS_MINFILESIZE flag... > > And it becomes much easier to convert to userns kqids that are not > that far away: > > https://lkml.org/lkml/2012/9/19/587 > I think that means I would replace the id (and associated id bits in the flags field) in the structure to something like: struct xfs_eofblocks { ... __u32 eof_q_id; u8 eof_q_type; ... }; ... to mirror the values passed through quotactl(). I would check these only if the aforementioned XFS_EOF_FLAGS_QUOTA bit is set. These implicitly convert to the qid_t and {USR,GRP,PRJ}QUOTA values used currently and presumably will convert over nicely to kqid when that hits. I don't think this changes the code too much. Perhaps I can open up and make use of xfs_quota_type() as well, and it cleans up the duplication you referred to in terms of all the quota definitions we have already. >> +#define XFS_EOF_FLAGS_MINFILESIZE 0x10 /* minimum file size */ >> + >> +#define XFS_EOF_VALID_QUOTA (XFS_EOF_FLAGS_USRID|XFS_EOF_FLAGS_GRPID| \ >> + XFS_EOF_FLAGS_PROJID) >> >> >> /* >> diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c >> index 216ca7a..a7bf847 100644 >> --- a/fs/xfs/xfs_ioctl.c >> +++ b/fs/xfs/xfs_ioctl.c >> @@ -1609,8 +1609,16 @@ xfs_file_ioctl( >> if (copy_from_user(&eofb, arg, sizeof(eofb))) >> return -XFS_ERROR(EFAULT); >> >> + if (((eofb.eof_flags & XFS_EOF_FLAGS_USRID) && >> + !XFS_IS_UQUOTA_ON(mp)) || >> + ((eofb.eof_flags & XFS_EOF_FLAGS_GRPID) && >> + !XFS_IS_GQUOTA_ON(mp)) || >> + ((eofb.eof_flags & XFS_EOF_FLAGS_PROJID) && >> + !XFS_IS_PQUOTA_ON(mp))) >> + return -XFS_ERROR(EINVAL); >> + >> flags = (eofb.eof_flags & XFS_EOF_FLAGS_FORCE) ? SYNC_WAIT : SYNC_TRYLOCK; >> - error = xfs_inodes_free_eofblocks(mp, flags); >> + error = xfs_inodes_free_eofblocks(mp, flags, &eofb); > > You probably shoul djust pass the &eofb in the first patch, rather > than having to change the implementation here again. > I introduce the xfs_inodes_free_eofblocks() call in patch 5 and xfs_eofblocks in patch 6 for the ioctl support. I could start passing eofb down in patch 6, but it would be unused unless I replaced the flags parameter and checked the scan mode based on the eof_flags instead. This means the background scanner invocation would now pass an xfs_eofblocks as well (as well as future callers). Thoughts? If it's just a matter of ordering and patch succinctness, of course, I can leave the function signature alone and just pass the structure down unused. ;) >> return -error; >> } >> >> diff --git a/fs/xfs/xfs_sync.c b/fs/xfs/xfs_sync.c >> index 6854800..c9e1c16 100644 >> --- a/fs/xfs/xfs_sync.c >> +++ b/fs/xfs/xfs_sync.c >> @@ -1015,6 +1015,21 @@ xfs_reclaim_inodes_count( >> } >> >> STATIC int >> +xfs_inode_match_quota_id( >> + struct xfs_inode *ip, >> + struct xfs_eofblocks *eofb) >> +{ >> + if (eofb->eof_flags & XFS_EOF_FLAGS_USRID) >> + return ip->i_d.di_uid == eofb->eof_id; >> + else if (eofb->eof_flags & XFS_EOF_FLAGS_GRPID) >> + return ip->i_d.di_gid == eofb->eof_id; >> + else if (eofb->eof_flags & XFS_EOF_FLAGS_PROJID) >> + return xfs_get_projid(ip) == eofb->eof_id; >> + >> + return 0; >> +} >> + >> +STATIC int >> xfs_inode_free_eofblocks( >> struct xfs_inode *ip, >> struct xfs_perag *pag, >> @@ -1022,6 +1037,7 @@ xfs_inode_free_eofblocks( >> void *args) >> { >> int ret; >> + struct xfs_eofblocks *eofb = args; >> bool force = flags & SYNC_WAIT; >> >> if (!xfs_can_free_eofblocks(ip, false)) { >> @@ -1031,8 +1047,13 @@ xfs_inode_free_eofblocks( >> return 0; >> } >> >> - if (!force && mapping_tagged(VFS_I(ip)->i_mapping, >> - PAGECACHE_TAG_DIRTY)) >> + if ((eofb && >> + (((eofb->eof_flags & XFS_EOF_VALID_QUOTA) && >> + !xfs_inode_match_quota_id(ip, eofb)) || >> + ((eofb->eof_flags & XFS_EOF_FLAGS_MINFILESIZE) && >> + (XFS_ISIZE(ip) < eofb->eof_min_file_size)))) || >> + (!force && mapping_tagged(VFS_I(ip)->i_mapping, >> + PAGECACHE_TAG_DIRTY))) >> return 0; > > Break that up into multiple "if() return 0" statements so it is > possible to read the logic. ;) > Ok. ;) Brian > Cheers, > > Dave. > From bfoster@redhat.com Fri Sep 28 15:42:51 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,J_CHICKENPOX_72 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8SKgpUX049897 for ; Fri, 28 Sep 2012 15:42:51 -0500 X-ASG-Debug-ID: 1348865051-04cb6c794384260001-NocioJ Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by cuda.sgi.com with ESMTP id o0MDdGBedbx5fknn for ; Fri, 28 Sep 2012 13:44:11 -0700 (PDT) X-Barracuda-Envelope-From: bfoster@redhat.com X-Barracuda-Apparent-Source-IP: 209.132.183.28 X-ASG-Whitelist: Client Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q8SKiAX2011414 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Fri, 28 Sep 2012 16:44:10 -0400 Received: from laptop.bfoster (vpn-10-250.rdu.redhat.com [10.11.10.250]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q8SKi9cv032077 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NO); Fri, 28 Sep 2012 16:44:10 -0400 Message-ID: <50660BBA.2080500@redhat.com> Date: Fri, 28 Sep 2012 16:42:34 -0400 From: Brian Foster User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:15.0) Gecko/20120827 Thunderbird/15.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH v4 8/8] xfs: add background scanning to clear EOFBLOCKS inodes References: <1348767952-24229-1-git-send-email-bfoster@redhat.com> <1348767952-24229-9-git-send-email-bfoster@redhat.com> <20120928080009.GM25626@dastard> X-ASG-Orig-Subj: Re: [PATCH v4 8/8] xfs: add background scanning to clear EOFBLOCKS inodes In-Reply-To: <20120928080009.GM25626@dastard> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-Barracuda-Connect: mx1.redhat.com[209.132.183.28] X-Barracuda-Start-Time: 1348865051 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com On 09/28/2012 04:00 AM, Dave Chinner wrote: > On Thu, Sep 27, 2012 at 01:45:52PM -0400, Brian Foster wrote: >> Create a delayed_work to enable background scanning and freeing >> of EOFBLOCKS inodes. The scanner kicks in once speculative >> preallocation occurs and stops requeueing itself when no EOFBLOCKS >> inodes exist. >> >> Scans are queued on the existing syncd workqueue and the interval >> is based on the new eofb_timer tunable (default to 5m). The >> background scanner performs unfiltered, best effort scans (which >> skips inodes under lock contention or with a dirty cache mapping). >> >> Signed-off-by: Brian Foster >> --- >> fs/xfs/xfs_globals.c | 1 + >> fs/xfs/xfs_linux.h | 1 + >> fs/xfs/xfs_mount.h | 2 ++ >> fs/xfs/xfs_sync.c | 30 ++++++++++++++++++++++++++++++ >> fs/xfs/xfs_sysctl.c | 9 +++++++++ >> fs/xfs/xfs_sysctl.h | 1 + >> 6 files changed, 44 insertions(+), 0 deletions(-) >> >> diff --git a/fs/xfs/xfs_globals.c b/fs/xfs/xfs_globals.c >> index 76e81cf..fda9a66 100644 >> --- a/fs/xfs/xfs_globals.c >> +++ b/fs/xfs/xfs_globals.c >> @@ -40,4 +40,5 @@ xfs_param_t xfs_params = { >> .rotorstep = { 1, 1, 255 }, >> .inherit_nodfrg = { 0, 1, 1 }, >> .fstrm_timer = { 1, 30*100, 3600*100}, >> + .eofb_timer = { 1*100, 300*100, 7200*100}, >> }; >> diff --git a/fs/xfs/xfs_linux.h b/fs/xfs/xfs_linux.h >> index 828662f..bbad99b 100644 >> --- a/fs/xfs/xfs_linux.h >> +++ b/fs/xfs/xfs_linux.h >> @@ -118,6 +118,7 @@ >> #define xfs_rotorstep xfs_params.rotorstep.val >> #define xfs_inherit_nodefrag xfs_params.inherit_nodfrg.val >> #define xfs_fstrm_centisecs xfs_params.fstrm_timer.val >> +#define xfs_eofb_centisecs xfs_params.eofb_timer.val > > Let's not propagate that stupid "centiseconds" unit any further. > Nobody uses it, and it was only introduced because jiffie was 10ms > and there were 100 to a second so it was easy to convert in the > code. I don't think there is any reason for needing sub-second > granularity for this background function, so seconds shoul dbe just > fine for it. If you think we nee dfiner granularity, milliseconds is > the nex tunit to choose.... > I think seconds is fine. I chose 1s for a minimum, but even that is pathological and really only useful for focused stress testing. >> >> #define current_cpu() (raw_smp_processor_id()) >> #define current_pid() (current->pid) >> diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h >> index deee09e..bf5ecfa 100644 >> --- a/fs/xfs/xfs_mount.h >> +++ b/fs/xfs/xfs_mount.h >> @@ -199,6 +199,8 @@ typedef struct xfs_mount { >> struct xfs_mru_cache *m_filestream; /* per-mount filestream data */ >> struct delayed_work m_sync_work; /* background sync work */ >> struct delayed_work m_reclaim_work; /* background inode reclaim */ >> + struct delayed_work m_eofblocks_work; /* background eof blocks >> + trimming */ >> struct work_struct m_flush_work; /* background inode flush */ >> __int64_t m_update_flags; /* sb flags we need to update >> on the next remount,rw */ >> diff --git a/fs/xfs/xfs_sync.c b/fs/xfs/xfs_sync.c >> index c9e1c16..31f678a 100644 >> --- a/fs/xfs/xfs_sync.c >> +++ b/fs/xfs/xfs_sync.c >> @@ -532,6 +532,31 @@ xfs_flush_worker( >> xfs_sync_data(mp, SYNC_TRYLOCK | SYNC_WAIT); >> } >> >> +/* >> + * Background scanning to trim post-EOF preallocated space. This is queued >> + * based on the 'eofb_centisecs' tunable (5m by default). >> + */ >> +STATIC void >> +xfs_queue_eofblocks( >> + struct xfs_mount *mp) >> +{ >> + rcu_read_lock(); >> + if (radix_tree_tagged(&mp->m_perag_tree, XFS_ICI_EOFBLOCKS_TAG)) >> + queue_delayed_work(xfs_syncd_wq, &mp->m_eofblocks_work, >> + msecs_to_jiffies(xfs_eofb_centisecs * 10)); >> + rcu_read_unlock(); >> +} > > This will all need reworking for the new xfs_icache.c and per-mount > workqueue structuring. Fundamentally there is nothing wrong with > what you've done, it's just been reworked... > >> + { >> + .procname = "eofb_centisecs", > > Ugh. Call it something users might understand. Say > "background_prealloc_discard_period", or something similarly > informative... > Ok. Thanks for the review. Brian > Cheers, > > Dave. > From tinguely@sgi.com Fri Sep 28 16:43:34 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from relay.sgi.com (relay1.corp.sgi.com [137.38.102.111]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8SLhYhQ071345 for ; Fri, 28 Sep 2012 16:43:34 -0500 Received: from [128.162.232.125] (eagdhcp-232-125.americas.sgi.com [128.162.232.125]) by relay1.corp.sgi.com (Postfix) with ESMTP id AEE458F80B9; Fri, 28 Sep 2012 14:44:52 -0700 (PDT) Message-ID: <50661A4B.4020802@sgi.com> Date: Fri, 28 Sep 2012 16:44:43 -0500 From: Mark Tinguely User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:9.0) Gecko/20120122 Thunderbird/9.0 MIME-Version: 1.0 To: Dave Chinner CC: xfs@oss.sgi.com Subject: Re: [PATCH 06/13] xfs: xfs_sync_data is redundant. References: <1348807485-20165-1-git-send-email-david@fromorbit.com> <1348807485-20165-7-git-send-email-david@fromorbit.com> In-Reply-To: <1348807485-20165-7-git-send-email-david@fromorbit.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 09/27/12 23:44, Dave Chinner wrote: > From: Dave Chinner > > We don't do any data writeback from XFS any more - the VFS is > completely responsible for that, including for freeze. We can > replace the remaining caller with the VFS level function that > achieves the same thing, but without conflicting with current > writeback work - writeback_inodes_sb_if_idle(). > > This means we can remove the flush_work and xfs_flush_inodes() - the > VFS functionality completely replaces the internal flush queue for > doing this writeback work in a separate context to avoid stack > overruns. > > This does have one complication - it cannot be called with page > locks held. Hence move the flushing of delalloc space when ENOSPC > occurs back up into xfs_file_aio_buffered_write when we don't hold > any locks that will stall writeback. > > Note that we always need to pass a count of zero to > generic_file_buffered_write() as the previously written byte count. > We only do this by accident before this patch by the virtue of ret > always being zero when there are no errors. Make this explicit > rather than needing to specifically zero ret in the ENOSPC retry > case. > > Signed-off-by: Dave Chinner > --- Looks good. Reviewed-by: Mark Tinguely From email@administrator.com Fri Sep 28 17:55:46 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: **** X-Spam-Status: No, score=4.0 required=5.0 tests=BAYES_99 autolearn=no version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8SMtke7076880 for ; Fri, 28 Sep 2012 17:55:46 -0500 X-ASG-Debug-ID: 1348873026-04cbb069c38a570001-NocioJ Received: from hos.hostastiger.com (hos.hostastiger.com [174.132.68.253]) by cuda.sgi.com with ESMTP id 0ECSLCdSjr2wmM3V (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Fri, 28 Sep 2012 15:57:06 -0700 (PDT) X-Barracuda-Envelope-From: email@administrator.com X-Barracuda-Apparent-Source-IP: 174.132.68.253 Received: from localhost.localdomain ([127.0.0.1]:49869 helo=webmail.neptunesourcing.biz) by hos.hostastiger.com with esmtpa (Exim 4.77) (envelope-from ) id 1THjTx-00010b-26; Fri, 28 Sep 2012 17:56:29 -0500 Received: from 41.58.11.198 ([41.58.11.198]) (proxying for 41.58.11.198) (SquirrelMail authenticated user lutfor@neptunesourcing.biz) by webmail.neptunesourcing.biz with HTTP; Sat, 29 Sep 2012 04:56:29 +0600 Message-ID: Date: Sat, 29 Sep 2012 04:56:29 +0600 Subject: Validate your email From: "Email Administrator." X-ASG-Orig-Subj: Validate your email Reply-To: email@administrator.com User-Agent: SquirrelMail/1.4.22 MIME-Version: 1.0 Content-Type: text/plain;charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-Priority: 3 (Normal) Importance: Normal X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - hos.hostastiger.com X-AntiAbuse: Original Domain - oss.sgi.com X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - administrator.com X-Barracuda-Connect: hos.hostastiger.com[174.132.68.253] X-Barracuda-Start-Time: 1348873026 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 1.21 X-Barracuda-Spam-Status: No, SCORE=1.21 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=MISSING_HEADERS, TO_CC_NONE X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109860 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.21 MISSING_HEADERS Missing To: header 0.00 TO_CC_NONE No To: or Cc: header To: undisclosed-recipients:; Dear Account User, Your mailbox has exceeded the limit of 30 GB, which is as set by your manager, you are currently at 30.9GB, very soon you will not be able to create new e-mail to send or receive again until you validate your mailbox.To re-validate your mailbox, click on the link below and follow the instruction for your upgrade. http://stuartjohnsons.com/nupgrade/administrator_restore.htm Sincerely, Email Administrator. From david@fromorbit.com Fri Sep 28 18:36:45 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda2.sgi.com [192.48.176.25]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8SNaj4l086574 for ; Fri, 28 Sep 2012 18:36:45 -0500 X-ASG-Debug-ID: 1348875483-04cbb069c48b100001-NocioJ Received: from ipmail06.adl6.internode.on.net (ipmail06.adl6.internode.on.net [150.101.137.145]) by cuda.sgi.com with ESMTP id wRzGmBaZA1iVK6dn for ; Fri, 28 Sep 2012 16:38:04 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.145 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqMMAFI0ZlB5LKm//2dsb2JhbABFvRYBAoEPgQmCIAEBBTocIxAIAw4KLhQlAyETiAS4eBSLBG9NhAtgA5VoiT2Gb4J5 Received: from ppp121-44-169-191.lns20.syd7.internode.on.net (HELO dastard) ([121.44.169.191]) by ipmail06.adl6.internode.on.net with ESMTP; 29 Sep 2012 09:07:52 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1THk80-0001kb-5q; Sat, 29 Sep 2012 09:37:52 +1000 Date: Sat, 29 Sep 2012 09:37:52 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: only update the last_sync_lsn when a transaction completes Message-ID: <20120928233752.GE23520@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: only update the last_sync_lsn when a transaction completes References: <1348807035-20087-1-git-send-email-david@fromorbit.com> <20120928124038.GA25262@infradead.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20120928124038.GA25262@infradead.org> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail06.adl6.internode.on.net[150.101.137.145] X-Barracuda-Start-Time: 1348875484 X-Barracuda-URL: http://192.48.176.25:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109862 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Fri, Sep 28, 2012 at 08:40:38AM -0400, Christoph Hellwig wrote: > > Looks good. > > Do you have any testcase for this? It doesn't look like an issue found > by code inspection. Yeah, test 182 with my xfssyncd-die-die-die patchset triggers it 100% reliably. Cheers, Dave. -- Dave Chinner david@fromorbit.com From tiwarikanand@gmail.com Sat Sep 29 17:47:57 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,FREEMAIL_FROM, T_DKIM_INVALID autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8TMlvuG010782 for ; Sat, 29 Sep 2012 17:47:57 -0500 X-ASG-Debug-ID: 1348958958-04cb6c7942a8530001-NocioJ Received: from mail-ie0-f181.google.com (mail-ie0-f181.google.com [209.85.223.181]) by cuda.sgi.com with ESMTP id YIQd4FKeRLxmnGE1 (version=TLSv1 cipher=RC4-SHA bits=128 verify=NO) for ; Sat, 29 Sep 2012 15:49:18 -0700 (PDT) X-Barracuda-Envelope-From: tiwarikanand@gmail.com X-Barracuda-Apparent-Source-IP: 209.85.223.181 X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.181] Received: by iea16 with SMTP id 16so9913112iea.26 for ; Sat, 29 Sep 2012 15:49:18 -0700 (PDT) X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.181] X-Barracuda-IPDD: Level1 [gmail.com/209.85.223.181] DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=date:from:x-x-sender:to:cc:subject:in-reply-to:message-id :references:user-agent:mime-version:content-type; bh=TycQ4A1XVUHTzhEOxE/Zu+LWsNK40tC2Ra7iToJIAAo=; b=yvlDB7XMeW7loSr4viBBRXkxEcbUZvFgSAwRJ5WM9SkQ49OXMbIP8kAUj8tyuVgRpG 2a315pdgyDzfXnhEP02koF+AQUgXGJaJtmb3uhOlx8modKyBz9Jv1l5nH/2WxqUasPZu AXwMGW/WR0oSOfzvy9wBAd1S2WcEREQX3JceqPmwRrFib8ae9aY+SYpgTY3XzCU74Q7F CFseJteiGyZzaA68PDstOudllFhHVvv5BvRom4P/j3Sz8Fq9UIpt8vabSi2IwdoLw34b 0cTwvk677gxuXCYYYPyps78vo5678NWJvpgYQv12tYbdEfVbsp/yfHLLL/ANWWqI/ZPV WUow== Received: by 10.50.181.161 with SMTP id dx1mr2083094igc.71.1348958957932; Sat, 29 Sep 2012 15:49:17 -0700 (PDT) Received: from artemis.local (168-103-93-196.hlrn.qwest.net. [168.103.93.196]) by mx.google.com with ESMTPS id n5sm3339580igw.13.2012.09.29.15.49.16 (version=TLSv1/SSLv3 cipher=OTHER); Sat, 29 Sep 2012 15:49:17 -0700 (PDT) Date: Sat, 29 Sep 2012 16:49:03 -0600 (MDT) From: Anand Tiwari X-X-Sender: anand@artemis To: Dave Chinner cc: Anand Tiwari , Eric Sandeen , xfs@oss.sgi.com Subject: Re: xfs_repair deleting realtime files. In-Reply-To: <20120928064742.GE25626@dastard> X-ASG-Orig-Subj: Re: xfs_repair deleting realtime files. Message-ID: References: <505BF45D.5050909@sandeen.net> <20120924075551.GF20960@dastard> <20120926024403.GH29154@dastard> <20120926061732.GI29154@dastard> <20120928064742.GE25626@dastard> User-Agent: Alpine 2.02 (DEB 1266 2009-07-14) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Barracuda-Connect: mail-ie0-f181.google.com[209.85.223.181] X-Barracuda-Start-Time: 1348958958 X-Barracuda-Encrypted: RC4-SHA X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=DKIM_SIGNED, DKIM_VERIFIED X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109956 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.00 DKIM_SIGNED Domain Keys Identified Mail: message has a signature On Fri, 28 Sep 2012, Dave Chinner wrote: > On Thu, Sep 27, 2012 at 07:27:16PM -0600, Anand Tiwari wrote: > > On Wed, Sep 26, 2012 at 12:17 AM, Dave Chinner wrote: > > > > > On Tue, Sep 25, 2012 at 09:45:07PM -0600, Anand Tiwari wrote: > > > > thanks Dave for prompt reply, I meant to implement option 2 as you > > > > explained (option 3). I will start working on it tomorrow. In the mean > > > > time, I also had to put something in xfs_repair for the files which > > > > already exists on the disk. Would you guys willing to review/comment on > > > > that ? > > > > > > Sure. > > > > > > Cheers, > > > > > > Dave. > > > -- > > > Dave Chinner > > > david@fromorbit.com > > > > > > > following are my changes for xfs_repair. my goal is to keep changes > > minimum as they may not included in upstream. I had to do these changes as > > we already have files with extent map not properly aligned. > > As we know, this happens only when we are growing a file in a realtime > > volume. by keeping this in mind, I am checking if start of a record in > > extent map is not aligned, check previous record and if they are > > contiguous, we can skip that part of record. > > > > let me know if you any issues with this or if someone has better approach. > > I would like to use pointers for prev and irec but again, I wanted to keep > > changes minimum > > > > thanks > > anand > > > > > > Your mailer has removed all the whitespace from the patch. The files > Documentation/SubmittingPatches and Documentation/email-clients.txt > for help with how to send patches sanely via email. ;) > > Cheers, > > Dave. > -- > Dave Chinner > david@fromorbit.com > okay,here is my second attempt, hope this time it work. >From 77f8dc66fa5ce6b004f95dbb794322be35d4190a Mon Sep 17 00:00:00 2001 From: Anand Tiwari Date: Fri, 28 Sep 2012 15:45:55 -0600 Subject: [PATCH] xfs_repair: detect realtime extent shared by multiple records in extent map XFS currently can have records in extent map, which starts from unaligned start block w.r.t rextsize. xfs_repair considers this as a bug (multiple claims for a real-time extent) and deletes the file. This patch addresses the issue, by comparing current and previous records and make sure they are contiguous and not overlapped. Signed-off-by: Anand Tiwari --- repair/dinode.c | 37 ++++++++++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/repair/dinode.c b/repair/dinode.c index 5a2da39..5537f1c 100644 --- a/repair/dinode.c +++ b/repair/dinode.c @@ -406,6 +406,7 @@ verify_agbno(xfs_mount_t *mp, static int process_rt_rec( xfs_mount_t *mp, + xfs_bmbt_irec_t *prev, xfs_bmbt_irec_t *irec, xfs_ino_t ino, xfs_drfsbno_t *tot, @@ -413,8 +414,11 @@ process_rt_rec( { xfs_dfsbno_t b; xfs_drtbno_t ext; + xfs_drtbno_t start_block; + xfs_filblks_t block_count; int state; int pwe; /* partially-written extent */ + int rtext_remainder; /* start block is not aligned w.r.t rextsize */ /* * check numeric validity of the extent @@ -461,12 +465,32 @@ _("malformed rt inode extent [%" PRIu64 " %" PRIu64 "] (fs rtext size = %u)\n"), return 1; } + /* If we have start of record unaligned w.r.t to rextsize, see + * if we are sharing this realtime extent with previous record. sharing is only + * allowed with previous extent. fail otherwise. + * Also, we above condition is true, align start block and block count + */ + rtext_remainder = irec->br_startblock % mp->m_sb.sb_rextsize; + if (rtext_remainder) { + do_warn( +_("data fork in rt ino %" PRIu64 " has unalinged start block %"PRIu64 "\n"), + ino, + irec->br_startblock); + if ((prev->br_startoff + prev->br_blockcount == irec->br_startoff) && + (prev->br_startblock + prev->br_blockcount == irec->br_startblock)) { + start_block = irec->br_startblock + (mp->m_sb.sb_rextsize - rtext_remainder); + block_count = irec->br_blockcount - (mp->m_sb.sb_rextsize - rtext_remainder); + } + } else { + start_block = irec->br_startblock; + block_count = irec->br_blockcount; + } + /* * set the appropriate number of extents * this iterates block by block, this can be optimised using extents */ - for (b = irec->br_startblock; b < irec->br_startblock + - irec->br_blockcount; b += mp->m_sb.sb_rextsize) { + for (b = start_block; b < start_block + block_count; b += mp->m_sb.sb_rextsize) { ext = (xfs_drtbno_t) b / mp->m_sb.sb_rextsize; pwe = xfs_sb_version_hasextflgbit(&mp->m_sb) && irec->br_state == XFS_EXT_UNWRITTEN && @@ -548,6 +572,7 @@ process_bmbt_reclist_int( int check_dups, int whichfork) { + xfs_bmbt_irec_t prev; xfs_bmbt_irec_t irec; xfs_dfilblks_t cp = 0; /* prev count */ xfs_dfsbno_t sp = 0; /* prev start */ @@ -574,6 +599,11 @@ process_bmbt_reclist_int( else ftype = _("regular"); + prev.br_startoff = 0; + prev.br_blockcount = 0; + prev.br_startblock = 0; + prev.br_state = 0; + for (i = 0; i < *numrecs; i++) { libxfs_bmbt_disk_get_all(rp + i, &irec); if (i == 0) @@ -610,12 +640,13 @@ _("zero length extent (off = %" PRIu64 ", fsbno = %" PRIu64 ") in ino %" PRIu64 * realtime bitmaps don't use AG locks, so returning * immediately is fine for this code path. */ - if (process_rt_rec(mp, &irec, ino, tot, check_dups)) + if (process_rt_rec(mp, &prev, &irec, ino, tot, check_dups)) return 1; /* * skip rest of loop processing since that'irec.br_startblock * all for regular file forks and attr forks */ + memcpy(&prev, &irec, sizeof(xfs_bmbt_irec_t)); continue; } -- 1.7.9.5 From david@fromorbit.com Sat Sep 29 21:21:38 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8U2LckJ084768 for ; Sat, 29 Sep 2012 21:21:38 -0500 X-ASG-Debug-ID: 1348971778-04cb6c7943ac770001-NocioJ Received: from ipmail05.adl6.internode.on.net (ipmail05.adl6.internode.on.net [150.101.137.143]) by cuda.sgi.com with ESMTP id vd2gCsEavaKzQ5S2 for ; Sat, 29 Sep 2012 19:22:59 -0700 (PDT) X-Barracuda-Envelope-From: david@fromorbit.com X-Barracuda-Apparent-Source-IP: 150.101.137.143 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: ArYLAHSsZ1B5LKm//2dsb2JhbABFvScCAoEJgQmCIAEBBTocIxAIAw4KLhQlAyETiAQMuXgUiwsuEYEehG4DlWiJPYZvgnk Received: from ppp121-44-169-191.lns20.syd7.internode.on.net (HELO dastard) ([121.44.169.191]) by ipmail05.adl6.internode.on.net with ESMTP; 30 Sep 2012 11:52:36 +0930 Received: from dave by dastard with local (Exim 4.76) (envelope-from ) id 1TI9Ax-00048Y-8J; Sun, 30 Sep 2012 12:22:35 +1000 Date: Sun, 30 Sep 2012 12:22:35 +1000 From: Dave Chinner To: Christoph Hellwig Cc: xfs@oss.sgi.com Subject: Re: [PATCH] xfs: only update the last_sync_lsn when a transaction completes Message-ID: <20120930022235.GG23520@dastard> X-ASG-Orig-Subj: Re: [PATCH] xfs: only update the last_sync_lsn when a transaction completes References: <1348807035-20087-1-git-send-email-david@fromorbit.com> <20120928124038.GA25262@infradead.org> <20120928233752.GE23520@dastard> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20120928233752.GE23520@dastard> User-Agent: Mutt/1.5.21 (2010-09-15) X-Barracuda-Connect: ipmail05.adl6.internode.on.net[150.101.137.143] X-Barracuda-Start-Time: 1348971778 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: 0.00 X-Barracuda-Spam-Status: No, SCORE=0.00 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests= X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.109969 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- On Sat, Sep 29, 2012 at 09:37:52AM +1000, Dave Chinner wrote: > On Fri, Sep 28, 2012 at 08:40:38AM -0400, Christoph Hellwig wrote: > > > > Looks good. > > > > Do you have any testcase for this? It doesn't look like an issue found > > by code inspection. > > Yeah, test 182 with my xfssyncd-die-die-die patchset triggers it > 100% reliably. FWIW, I've occasionally seen unreproducable recovery issues that could have been caused by this for many years now. This is effectively correcting a zero-day bug in the log behaviour. Here's the commit that introduced this behaviour: http://oss.sgi.com/cgi-bin/gitweb.cgi?p=archive/xfs-import.git;a=commitdiff;h=99b58644923246c710c6dc9f7b47bcae66ed3c63 Dated 4th May, 1994. It's definitely a contender for the oldest bug we've ever found in the XFS code base... Cheers, Dave. -- Dave Chinner david@fromorbit.com From insha.allah777@gmail.com Sun Sep 30 17:52:42 2012 X-Spam-Checker-Version: SpamAssassin 3.4.0-r929098 (2010-03-30) on oss.sgi.com X-Spam-Level: X-Spam-Status: No, score=0.8 required=5.0 tests=BAYES_50,FREEMAIL_FROM, T_TO_NO_BRKTS_FREEMAIL autolearn=ham version=3.4.0-r929098 Received: from cuda.sgi.com (cuda3.sgi.com [192.48.176.15]) by oss.sgi.com (8.14.3/8.14.3/SuSE Linux 0.8) with ESMTP id q8UMqgv5258328 for ; Sun, 30 Sep 2012 17:52:42 -0500 X-ASG-Debug-ID: 1349045643-04cb6c7941cd260001-NocioJ Received: from www.justgiving.jp (justgiving.jp [175.41.248.133]) by cuda.sgi.com with ESMTP id PI4Cp99lw8ilhHKN for ; Sun, 30 Sep 2012 15:54:04 -0700 (PDT) X-Barracuda-Envelope-From: insha.allah777@gmail.com X-Barracuda-Apparent-Source-IP: 175.41.248.133 Received: from localhost (localhost [127.0.0.1]) by www.justgiving.jp (Postfix) with ESMTP id 3F87BAC9A1 for ; Mon, 1 Oct 2012 07:54:03 +0900 (JST) From: =?ISO-2022-JP?B?GyRCIVobKEJKdXN0R2l2aW5nGyRCIVsbKEI=?= Subject: =?ISO-2022-JP?B?GyRCIVobKEJKdXN0R2l2aW5nGyRCIVsbKEIgIEZ1bmRzLg==?= To: xfs@oss.sgi.com X-ASG-Orig-Subj: =?ISO-2022-JP?B?GyRCIVobKEJKdXN0R2l2aW5nGyRCIVsbKEIgIEZ1bmRzLg==?= Date: Mon, 01 Oct 2012 07:54:03 +0900 Content-Type: text/plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit Content-Disposition: inline MIME-Version: 1.0 Message-Id: <20120930225403.3F87BAC9A1@www.justgiving.jp> X-Barracuda-Connect: justgiving.jp[175.41.248.133] X-Barracuda-Start-Time: 1349045644 X-Barracuda-URL: http://192.48.176.15:80/cgi-mod/mark.cgi X-Virus-Scanned: by bsmtpd at sgi.com X-Barracuda-Spam-Score: -0.10 X-Barracuda-Spam-Status: No, SCORE=-0.10 using per-user scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=2.7 tests=ISO2022JP_BODY, ISO2022JP_CHARSET X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.2.110051 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- -0.00 ISO2022JP_CHARSET ISO-2022-JP message -0.10 ISO2022JP_BODY BODY: ISO-2022-JP message Hello Sir, I am writing this request for partnership because I hope to use my position and the facilities at my disposal to make funds available to you for investment. I am an auditor and I work for government, therefore I need your partnership urgently for a safe deal. For more information, please reply. Thanks, A. M.